当前位置:首页 » 《休闲阅读》 » 正文

K8s的一些配置

5 人参与  2024年11月05日 14:02  分类 : 《休闲阅读》  评论

点击全文阅读


apiVersion: v1kind: Servicemetadata:  annotations: {}  # You can add annotations here if needed  labels:    name: base-apigateway2-3  name: base-apigateway2-3  namespace: default  # The namespace in which the service is createdspec:  clusterIP: 11111.18.17.10  # The internal cluster IP for the service  externalTrafficPolicy: Cluster  # Policy for external traffic  ports:  - name: base-apigateway2-3  # Name of the port for reference    nodePort: 30206  # Port on each node to expose the service    port: 8080  # Port the service listens on    protocol: TCP  # Protocol used (TCP in this case)    targetPort: 8080  # Port the container listens on  selector:    app: base-apigateway2-3  # Selector to identify the pods  sessionAffinity: None  # Session affinity configuration  type: NodePort  # This is a NodePort service typestatus:  loadBalancer: {}  # Status of the load balancer (empty here)
 IP是假的,
apiVersion: v1  # API版本,表示使用的是Kubernetes的v1版本kind: Service  # 资源类型,这里是一个Service(服务)metadata:  annotations: {}  # 注解,可以用于存储附加信息(目前为空)  labels:    name: base-apigateway2-3  # 标签,用于标识和选择服务  name: base-apigateway2-3  # 服务的名称  namespace: default  # 命名空间,表示服务所在的命名空间,默认是"default"spec:  clusterIP: 111111.08.77.10  # 服务在集群内部的IP地址  externalTrafficPolicy: Cluster  # 外部流量策略,设置为Cluster表示流量可以通过任何节点访问  ports:  - name: base-apigateway2-3  # 端口的名称,方便引用    nodePort: 30206  # 在每个节点上暴露的端口    port: 8080  # 服务监听的端口    protocol: TCP  # 使用的协议,这里是TCP    targetPort: 8080  # 容器中实际监听的端口  selector:    app: base-apigateway2-3  # 选择器,用于选择具有特定标签的Pod  sessionAffinity: None  # 会话亲和性配置,这里设为None,表示不保持会话亲和性  type: NodePort  # 服务类型,NodePort表示通过节点的IP和指定端口进行访问status:  loadBalancer: {}  # 负载均衡器的状态(目前为空)

在 Kubernetes 的 YAML 配置文件中,metadata 是一个非常重要的字段,包含了关于资源的附加信息。具体来说,metadata 主要包含以下几方面的内容:

name: 资源的名称,必须在其命名空间内唯一。这个名称用于标识和引用该资源。

namespace: 指定资源所在的命名空间,Kubernetes 中的命名空间用于隔离不同的资源。默认情况下,所有资源都位于 default 命名空间中。

labels: 标签是一组键值对,用于标识和选择资源。可以用于组织和管理资源,方便使用选择器进行过滤。

annotations: 注解也是键值对,但用于存储更复杂的元数据,比如描述、附加信息或用于外部工具的信息。注解不会影响 Kubernetes 的操作和行为。

在您的示例中,metadata 的定义如下:

metadata:  annotations: {}  # 目前为空,没有存储任何附加信息  labels:    name: base-apigateway2-3  # 用于标识服务的标签  name: base-apigateway2-3  # 服务的名称  namespace: default  # 服务所在的命名空间
annotations 当前为空,您可以根据需要添加信息。labels 定义了一个标签,方便在查询或管理服务时使用。namenamespace 则指定了服务的唯一标识及其位置。

这些信息对于 Kubernetes 的资源管理、调度和操作都非常重要。

好的!让我们详细分析这个 Kubernetes Service 的配置,并举例说明如何使用这个 Service。

YAML 配置分析

apiVersion: v1kind: Servicemetadata:  annotations: {}  # 可以根据需要添加注解  labels:    name: base-apigateway2-3  name: base-apigateway2-3  # 服务的名称  namespace: default  # 服务所在的命名空间spec:  clusterIP: 11111.18.17.10  # 服务在集群内部的 IP 地址  externalTrafficPolicy: Cluster  # 外部流量策略  ports:  - name: base-apigateway2-3  # 端口的名称    nodePort: 30206  # 在每个节点上暴露的端口    port: 8080  # 服务监听的端口    protocol: TCP  # 使用的协议    targetPort: 8080  # 容器中实际监听的端口  selector:    app: base-apigateway2-3  # 选择器,用于选择具有特定标签的 Pods  sessionAffinity: None  # 会话亲和性配置  type: NodePort  # 服务类型status:  loadBalancer: {}  # 负载均衡器的状态(目前为空)

具体示例

假设您有一个应用程序,包含多个 Pods,它们都带有 app: base-apigateway2-3 的标签。您希望通过 NodePort 类型的 Service 将这些 Pods 暴露出来,以便外部用户可以通过节点的 IP 地址访问它们。

1. 创建 Pods

首先,您需要创建一些 Pods,并为它们添加标签 app: base-apigateway2-3

apiVersion: v1kind: Podmetadata:  name: my-pod-1  labels:    app: base-apigateway2-3spec:  containers:  - name: my-container    image: my-image    ports:    - containerPort: 8080---apiVersion: v1kind: Podmetadata:  name: my-pod-2  labels:    app: base-apigateway2-3spec:  containers:  - name: my-container    image: my-image    ports:    - containerPort: 8080
2. 创建 Service

接下来,您创建上面提供的 Service,这样就可以通过节点的 IP 地址和指定的 nodePort 进行访问。

3. 访问服务

一旦服务创建成功,您可以通过任何 Kubernetes 节点的 IP 地址加上 nodePort 来访问服务。例如,如果您某个节点的 IP 地址是 192.168.1.100,那么您可以通过以下 URL 访问:

http://192.168.1.100:30206

这个请求会被路由到所有带有 app: base-apigateway2-3 标签的 Pods,且将请求转发到这些 Pods 的 8080 端口。

总结

标签和选择器:确保您的 Pods 有适当的标签,以便 Service 能够选择它们。NodePort:通过在节点上暴露端口,可以使外部流量能够访问内部服务。负载均衡:Kubernetes 会自动在多个 Pods 之间分配流量,实现负载均衡。

这个示例展示了如何通过配置 Service 和 Pods,使得外部用户可以访问内部应用。希望这对您理解 Kubernetes 中的 Service 有帮助!


用于匹配具有指定标签的Pod,什么意思, 假如以之前的为例子,一个base-apigateway2-3-b6d89dfbd-z7pt7,能被这个选择器识别到吗?
是的,base-apigateway2-3-b6d89dfbd-z7pt7 这个 Pod 可以被您之前定义的选择器识别到,前提是它的标签设置正确。

选择器与标签的工作原理

在 Kubernetes 中,选择器用于匹配具有特定标签的 Pods。您在 Service 的 YAML 配置中定义的选择器是这样的:

selector:  app: base-apigateway2-3  # 选择器用于选择标签为 app: base-apigateway2-3 的 Pods

这表示 Service 将会选择所有具有 app: base-apigateway2-3 标签的 Pods。

Pod 的标签

对于您的 Pod base-apigateway2-3-b6d89dfbd-z7pt7,假设它的标签是:

metadata:  labels:    app: base-apigateway2-3

那么,Service 会成功识别到这个 Pod,并将流量路由到它。

例子

假设您有如下 Pod 定义:

apiVersion: v1kind: Podmetadata:  name: base-apigateway2-3-b6d89dfbd-z7pt7  labels:    app: base-apigateway2-3  # 确保标签与选择器匹配spec:  containers:  - name: my-container    image: my-image    ports:    - containerPort: 8080

总结

只要 Pod 的标签与 Service 的选择器匹配,Service 就会识别到这个 Pod。确保您在创建 Pod 时为其添加了正确的标签,这样它就能被相关的 Service 选中,从而参与流量的处理。

[root@ecs-uat-master ~]# kubectl get pod base-apigateway2-3-b6d89dfbd-z7pt7 --show-labelsNAME                                 READY   STATUS    RESTARTS   AGE   LABELSbase-apigateway2-3-b6d89dfbd-z7pt7   1/1     Running   0          21d   app=base-apigateway2-3,pod-template-hash=b6d89dfbd

nodePort: 30080
port: 5000
targetPort: 5000
protocol: TCP
端口详细解释
nodePort: 30080
作用: 在每个节点上开放的端口,外部流量可以通过这个端口访问服务。
例子: 假设你的Kubernetes集群有三个节点,分别是 192.168.1.1、192.168.1.2 和 192.168.1.3。你可以通过访问 http://192.168.1.1:30080、http://192.168.1.2:30080 或 http://192.168.1.3:30080 来访问服务。Kubernetes会将请求转发到后端的Pod。
port: 5000
作用: 服务内部的端口,Kubernetes在集群内部使用的端口。
例子: 当服务运行时,它会在集群内部的 5000 端口监听流量。其他服务或Pod可以通过 http://:5000 来访问这个服务。例如,如果你的服务名为 base-apigateway2-3,可以通过 http://base-apigateway2-3:5000 来访问。
protocol: TCP
作用: 指定服务使用的网络协议。
例子: TCP是一个面向连接的协议,适用于需要保证数据传输完整性的场景,比如HTTP、HTTPS等。如果你的服务是一个Web API,使用TCP协议是合适的。
targetPort: 5000
作用: Pod内部容器实际监听的端口。
例子: 假设你的Pod中运行了一个Web服务器(比如Flask或Express.js等),这个服务器在容器内部的 5000 端口上监听请求。当外部流量通过 nodePort 进入服务后,Kubernetes会将流量转发到容器的 5000 端口。
实际场景
假设你有一个Web应用程序,结构如下:
应用程序: 使用Flask开发的REST API
Pod配置: Flask应用在容器内的 5000 端口监听HTTP请求
访问流程
用户在浏览器中输入 http://192.168.1.1:30080。
请求到达Kubernetes节点的 30080 端口。
Kubernetes将请求转发到服务的 5000 端口。
服务再将请求转发到对应Pod的 5000 端口。

Flask应用处理请求并返回响应。

Kubernetes 并不一定需要多台服务器才能运行,但在生产环境中,使用多台服务器(或节点)是推荐的做法,以实现高可用性和负载均衡。下面是关于 Kubernetes 如何工作以及 IP 绑定的一些细节。

1. 单节点 vs 多节点

单节点:Kubernetes 可以在单台机器上运行,通常用于开发和测试环境。在这种情况下,所有组件(如 API server、controller manager、scheduler 和 kubelet)都在同一台机器上运行。

多节点:在生产环境中,Kubernetes 通常由多个节点组成,这些节点可以是物理服务器或虚拟机。通过将 Pods 分布在多个节点上,可以实现负载均衡和故障转移。

2. 节点 IP 地址

每个节点都有一个 IP 地址,用于 Pod 和服务之间的通信。Kubernetes 通过以下方式处理 IP 绑定:

节点 IP:每个 Kubernetes 节点都有一个唯一的 IP 地址。Kubernetes 使用这些 IP 地址来管理和路由流量。例如,当使用 NodePort 类型的 Service 时,外部流量会通过节点的 IP 地址和指定的 NodePort 访问。

Pod IP:Kubernetes 为每个 Pod 分配一个 IP 地址。这个 IP 地址在 Pod 的生命周期内是唯一的,Pod 可以通过这个 IP 地址与其他 Pods 和 Services 通信。

3. 如何绑定 IP

在 Kubernetes 中,IP 地址的分配和管理是由 Kubernetes 网络模型自动处理的。您无需手动绑定 IP,但以下是一些相关的配置:

网络插件:Kubernetes 支持多种网络插件(如 Flannel、Calico、Weave 等),这些插件负责提供 Pod 网络并管理 IP 地址的分配。

Service 发现:Kubernetes 的内置 DNS 服务可以自动为服务创建 DNS 名称,使 Pods 可以通过名称而不是 IP 地址来访问其他服务,从而简化了服务发现。

4. 例子

如果您有一个简单的多节点 Kubernetes 集群,可以通过以下步骤进行设置:

安装 Kubernetes:使用工具如 kubeadmminikube 部署 Kubernetes 集群。加入节点:将工作节点加入到主节点(Master)中。创建 Service:例如,创建一个 ClusterIP 或 NodePort 类型的 Service。

当您创建 Service 时,Kubernetes 会自动为该 Service 分配一个虚拟 IP(ClusterIP),并将其映射到运行该 Service 的 Pods 的 IP 地址。

总结

单节点运行:适合开发和测试。多节点运行:适合生产环境,支持高可用性。IP 管理:Kubernetes 自动处理 IP 分配,无需手动绑定。

我想给channel这个服务透一个端口,命令是什么, 是不是我透出来之后就能通过公网ip访问了

要给 channel 这个服务透一个端口,您可以使用 kubectl expose 命令来创建一个 NodePort 类型的 Service。假设您的 Deployment 名称是 channel,可以使用以下命令:

kubectl expose deployment channel --port=80 --target-port=80 --type=NodePort --name=channel-service

参数说明:

--port=80:服务的端口,客户端访问这个端口。--target-port=80:实际的容器端口,服务会将流量转发到这个端口。--type=NodePort:将 Service 类型设置为 NodePort,使其能够通过节点的 IP 地址和指定的端口访问。--name=channel-service:为 Service 指定一个名称。

访问服务

获取 NodePort:运行以下命令查看创建的 Service 和它分配的 NodePort:

kubectl get services

您会看到类似下面的输出:

NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEchannel-service    NodePort   10.96.0.1       <none>       80:<NodePort>/TCP   5m

其中 <NodePort> 是 Kubernetes 为您分配的端口号。

通过公网 IP 访问:使用任一节点的公网 IP 地址和分配的 NodePort,您就可以从外部访问 channel 服务。例如,如果您的节点公网 IP 是 192.168.1.100,NodePort 是 30001,那么您可以通过以下 URL 访问:

http://192.168.1.100:30001

注意事项

确保您的节点可以被外部访问,并且相应的防火墙规则允许该 NodePort 端口的流量。NodePort 通常会在 30000-32767 的范围内分配,您也可以手动指定一个端口,使用 --node-port=<port>

这样设置后,您就能够通过公网 IP 访问您的 channel 服务了!如果还有其他问题,欢迎继续询问。


   kubectl get services

执行这个之后

memcached-sec ClusterIP None <none> 11211/TCP 49dmongodb NodePort 10.100.70.15 <none> 27017:30203/TCP 51d

这两个有什么区别啊??????????????????????
这两个 Kubernetes 服务(Service)有不同的类型和用途,下面是它们的主要区别:

1. 服务类型

memcached-sec:

ClusterIP: 这是默认的服务类型,意味着服务只能在集群内部访问。外部客户端无法直接通过 IP 或域名访问它。这个服务适用于只在集群内部需要访问的应用,如多个 Pod 之间的通信。

mongodb:

NodePort: 这种类型的服务允许从集群外部访问服务。Kubernetes 会在每个节点上开放一个特定的端口(在这个例子中是 30203),并将流量路由到相应的 Pod。您可以通过节点的 IP 地址和该 NodePort 访问 MongoDB。

2. IP 地址

memcached-sec:

ClusterIPNone,表示这是一个没有分配 IP 地址的 Headless Service,通常用于 StatefulSet 或其他需要直接访问 Pod 的情况。

mongodb:

分配了一个 Cluster IP(10.100.90.15),并且可以通过该 IP 在集群内部访问 MongoDB。

3. 用途

memcached-sec:

主要用于内部缓存,通常只需要在 Kubernetes 集群内的 Pod 之间进行访问。

mongodb:

需要外部访问,适用于需要从集群外部连接到数据库的场景。

总结

如果您的服务只需要在集群内部使用,选择 ClusterIP。如果您需要从外部访问服务,选择 NodePort

根据您的需求选择适当的服务类型,以确保应用能够正常访问。


gczx-xxl-job-admin           NodePort    10.28.175.103    <none>        8080:30210/TCP                   34dkubernetes                   ClusterIP   10.976.07.1        <none>        443/TCP                          51dljy-bank-adapter             NodePort    111.191.7.18   <none>        8080:30211/TCP                   19dljy-bank-channel             NodePort    10.718.22.304     <none>        8080:30212/TCP                   19dmemcached-sec                ClusterIP   None             <none>        11211/TCP                        49d

这个后面的端口是怎么回事解释一下??????????????

在 Kubernetes 中,Service 的端口信息通常由几个部分组成。以您提供的服务列表为例,后面的端口表示的是服务如何与 Pod 进行连接。具体来说,格式为 <ClusterPort>:<NodePort>/TCP

端口解释

ClusterPort:

这是 Service 在集群内部暴露的端口,其他 Pod 可以通过这个端口访问服务。例如,gczx-xxl-job-adminClusterPort8080,这意味着集群内的其他服务可以通过 10.98.145.103:8080 访问这个服务。

NodePort:

这是一个外部访问的端口,通过节点的 IP 地址可以访问到这个服务。Kubernetes 会在每个节点上开放这个端口。对于 gczx-xxl-job-admin,NodePort 是 30210,这意味着您可以通过任何节点的 IP 地址和端口 30210 访问该服务,例如 http://<Node_IP>:30210

TCP:

表示服务使用的协议,这里都是 TCP 协议。

例子分析

gczx-xxl-job-admin:

ClusterIP: 10.98.15.103ClusterPort: 8080NodePort: 30210通过集群内部 IP 10.98.15.103 访问,或者通过节点 IP http://<Node_IP>:30210 访问。

kubernetes:

ClusterIP: 10.96.0.1这是一个 ClusterIP 类型的服务,只有集群内部可访问,没有外部 NodePort。

ljy-bank-adapterljy-bank-channel:

都是 NodePort 类型,分别有 ClusterPort 8080 和 NodePort 3021130212

memcached-sec:

这是一个 ClusterIP 类型的 Headless Service,ClusterIP 为 None,表示没有分配 IP 地址,只能在集群内部访问。

总结

ClusterPort 用于集群内部访问。NodePort 用于从集群外部访问。选择合适的服务类型和端口配置以满足您的访问需求。

那么如何进行配置和更改这些端口?

在 Kubernetes 中,您可以通过 YAML 配置文件来创建或修改 Service 的端口设置。以下是如何配置和更改这些端口的基本步骤:

1. 创建或修改 Service

创建 Service

您可以使用以下示例 YAML 文件创建一个新的 Service:

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  type: NodePort  # 或者 ClusterIP  selector:    app: my-app  ports:    - name: http      port: 8080        # ClusterPort      targetPort: 80    # Pod 中的容器端口      nodePort: 30001   # NodePort (仅在类型为 NodePort 时指定)
修改 Service

如果您要更改现有的 Service,可以使用 kubectl edit 命令:

kubectl edit service my-service

这将打开默认编辑器,您可以在其中修改 ports 部分,例如:

ports:  - name: http    port: 8081        # 更改 ClusterPort    targetPort: 80    # 不变    nodePort: 30002   # 更改 NodePort

2. 通过 kubectl 命令创建 Service

您也可以直接使用 kubectl expose 命令创建 Service,指定端口:

kubectl expose deployment my-deployment --type=NodePort --name=my-service --port=8080 --target-port=80 --node-port=30001

3. 更新 Service

对于现有的 Service,使用 kubectl apply 命令:

编辑 YAML 文件并保存更改。使用以下命令应用更改:
kubectl apply -f my-service.yaml

4. 注意事项

NodePort 的范围: 默认情况下,NodePort 的范围是 30000-32767。如果您需要使用自定义端口,请确保选择的端口在这个范围内。ClusterIP 不可变: 一旦 Service 创建,ClusterIP 将不再可更改。如果需要更改,您需要删除并重新创建 Service。影响: 修改 Service 的端口可能会影响依赖于该 Service 的应用和其他服务,因此在更改之前请确保评估影响。

总结

通过 YAML 文件、kubectl editkubectl apply 命令,您可以创建和修改 Kubernetes 中的 Service 端口设置。确保在更改前评估对应用的影响。


还有就是一个pod相当于一个容器吗???????????????????????????

在 Kubernetes 中,Pod 是一个比单个容器更高级的概念。可以将其理解为一个或多个容器的集合,具体来说:

Pod 和容器的关系

Pod:

Pod 是 Kubernetes 中的基本部署单元,代表一个或多个容器的组合。容器在同一个 Pod 内共享网络和存储资源。Pod 中的所有容器通常运行在同一个主机上,并且可以通过 localhost 相互通信。Pod 可以有共享的存储卷,以便容器间共享数据。

容器:

容器是一个运行时环境,通常运行在 Pod 内部。每个容器可以运行一个特定的应用或服务。每个容器都有自己的文件系统、进程空间和网络接口,但在同一 Pod 中,它们共享 IP 地址和端口。

示例

如果您有一个 Web 应用和一个辅助的日志处理器,它们可以放在同一个 Pod 中,以便它们能够快速地通过 localhost 进行通信。但是如果您有两个功能完全独立的服务,通常会将它们放在不同的 Pod 中,以实现更好的隔离和管理。

总结

一个 Pod 可以包含 一个或多个容器,但通常一个 Pod 里只运行一个主要的容器。Pod 提供了一种高层次的抽象,可以简化容器的管理和调度。

点击全文阅读


本文链接:http://zhangshiyu.com/post/182765.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1