在 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 的工作原理是:
- 创建一个 Service,选择器选择一组 Pod。
- Kubernetes 自动创建一个同名的 Endpoints 资源,记录这组 Pod 的 IP 与端口。
- 服务的访问请求被 kube-proxy 转发至 Endpoints 记录的后端地址。
- Endpoints 上的多个 Pod 对接受到的请求进行负载均衡。
- Pod 发生变化时,Endpoints 会自动更新以与 Service 保持一致。
- 我们也可以手动更新 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)上,其工作流程是:
- 创建 Service example,选择器选择 pod1 和 pod2 两个 Pod。
- Kubernetes 创建自动创建 example Endpoints,记录两个 Pod 的 IP 和端口。
- 访问 Service example 会被 kube-proxy 转发到 Endpoints 的记录的两个 Pod 上。
- 两个 Pod 对请求进行负载均衡。
- 如果 pod1 被删除,Endpoints 会自动更新,只保留 pod2 的 IP。
- 下次访问 example Service 只会转发到 pod2。
所以总结来说,Endpoints 的主要作用是记录后端 Pod 地址,为 Service 提供服务发现与负载均衡能力,其主要特征是:
- 映射 Service 到后端 Pod。
- 记录 Pod 的 IP 和端口。
- 实现基于 Pod 的服务发现与负载均衡。
- Pod 变化时自动更新,与 Service 保持一致。
- 可以手动更新,实现服务的零宕机发布。
它通过以下几个字段工作:
- metadata.name:与关联的 Service 同名。
- subsets:记录多个 Pod 的地址与端口列表。
- subsets.addresses:Pod IP 和主机名。
- subsets.ports:Service 端口与 Pod 端口映射。