Kubernetes 中的 Endpoints 是什么?

在 Kubernetes 中,Endpoints 是一种资源,用于映射服务到一组 Pod 上。它把服务名称与服务的实际地址(即后端 Pod)关联起来。

Endpoints 的主要功能是:

  • 服务发现:查找与服务关联的后端 Pod。
  • 负载均衡:在一组 Pod 上进行负载均衡。
  • 解耦发布:可以独立于 Service 资源更新,实现微服务的零宕机发布。

Endpoints 资源包含以下主要字段:

  • metadata.name:Endpoints 名称,通常与关联的 Service 同名。
  • subsets:后端地址列表,包含:
  • addresses:Pod IP 和主机名列表。
  • ports:Service 端口与 Pod 端口映射关系。
  • subsets.ports.port:Service 暴露的端口。
  • subsets.ports.protocol:端口协议,TCP 或 UDP。
  • subsets.ports.targetPort:Pod 上对应的端口。

Endpoints 的工作原理是:

  1. 创建一个 Service,选择器选择一组 Pod。
  2. Kubernetes 自动创建一个同名的 Endpoints 资源,记录这组 Pod 的 IP 与端口。
  3. 服务的访问请求被 kube-proxy 转发至 Endpoints 记录的后端地址。
  4. Endpoints 上的多个 Pod 对接受到的请求进行负载均衡。
  5. Pod 发生变化时,Endpoints 会自动更新以与 Service 保持一致。
  6. 我们也可以手动更新 Endpoints,实现服务的零宕机发布。

例如,一个简单的 Endpoints 如下:

yaml
apiVersion: v1
kind: Endpoints
metadata: 
  name: example 
subsets:
- addresses:
  - ip: 10.244.1.6
    nodeName: node-1
    targetRef: 
      kind: Pod
      name: pod1
  - ip: 10.244.2.23  
    nodeName: node-2 
    targetRef:  
      kind: Pod
      name: pod2
  ports: 
  - name: http
    port: 80
    protocol: TCP 

这个 Endpoints 将服务 example 映射到两个 Pod(pod1 和 pod2)上,其工作流程是:

  1. 创建 Service example,选择器选择 pod1 和 pod2 两个 Pod。
  2. Kubernetes 创建自动创建 example Endpoints,记录两个 Pod 的 IP 和端口。
  3. 访问 Service example 会被 kube-proxy 转发到 Endpoints 的记录的两个 Pod 上。
  4. 两个 Pod 对请求进行负载均衡。
  5. 如果 pod1 被删除,Endpoints 会自动更新,只保留 pod2 的 IP。
  6. 下次访问 example Service 只会转发到 pod2。

所以总结来说,Endpoints 的主要作用是记录后端 Pod 地址,为 Service 提供服务发现与负载均衡能力,其主要特征是:

  1. 映射 Service 到后端 Pod。
  2. 记录 Pod 的 IP 和端口。
  3. 实现基于 Pod 的服务发现与负载均衡。
  4. Pod 变化时自动更新,与 Service 保持一致。
  5. 可以手动更新,实现服务的零宕机发布。

它通过以下几个字段工作:

  1. metadata.name:与关联的 Service 同名。
  2. subsets:记录多个 Pod 的地址与端口列表。
  3. subsets.addresses:Pod IP 和主机名。
  4. subsets.ports:Service 端口与 Pod 端口映射。