k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡

  • k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡
    • 环境变量
    • DNS
    • userspace 模式
    • iptables
    • ipvs
    • kernelspace
    • 前言
    • endpoint
    • kube-proxy
    • 服务发现
    • 总结
    • 参考
k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡前言Service 资源主要用于为 Pod 对象提供一个固定、统一的访问接口及负载均衡的能力 。
service 是一组具有相同 label pod 集合的抽象,集群内外的各个服务可以通过 service 进行互相通信 。
当创建一个 service 对象时也会对应创建一个 endpoint 对象,endpoint 是用来做容器发现的,service 只是将多个 pod 进行关联,实际的路由转发都是由 kubernetes 中的 kube-proxy 组件来实现,因此,service 必须结合 kube-proxy 使用,kube-proxy 组件可以运行在 kubernetes 集群中的每一个节点上也可以只运行在单独的几个节点上,其会根据 service 和 endpoints 的变动来改变节点上 iptables 或者 ipvs 中保存的路由规则 。
endpointendpoint 是 k8s 集群中的一个资源对象,存储在 etcd 中,用来记录一个 service 对应的所有 pod 的访问地址 。
service 通过 selector 和 pod 建立关联 。k8s 会根据 service 关联到 pod 的 podIP 信息组合成一个 endpoint 。
如果 service 没有 selector 字段,当一个 service 被创建的时候,endpoint controller 不会自动创建 endpoint 。
$ kubectl get svc -n study-k8sNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGEgo-web-svc   ClusterIP   10.233.55.112   <none>        8000/TCP   9d$ kubectl get endpoints -n study-k8sNAME         ENDPOINTS                                                                AGEgo-web-svc   10.233.111.171:8000,10.233.111.172:8000,10.233.72.153:8000 + 2 more...   9d栗如
上面的 service go-web-svc,就有一个对应的 endpoint,ENDPOINTS 里面展示的就是 service 关联的 pod 的 ip 地址和端口 。
其中 endpoint controller 负载维护 endpoint 对象,主要的功能有下面几种
1、负责生成和维护所有endpoint对象的控制器;
2、负责监听 service 和对应 pod 的变化;
3、监听到 service 被删除,则删除和该 service 同名的 endpoint 对象;
4、监听到新的 service 被创建,则根据新建 service 信息获取相关 pod 列表,然后创建对应 endpoint 对象;
5、监听到 service 被更新,则根据更新后的 service 信息获取相关 pod 列表,然后更新对应 endpoint 对象;
6、监听到 pod 事件,则更新对应的 service 的 endpoint 对象,将 podIp 记录到 endpoint中;
kube-proxykube-proxy 是 Kubernetes 的核心组件,部署在每个 Node 节点上,它是实现 Kubernetes Service 的通信与负载均衡机制的重要组件; kube-proxy 负责为 Pod 创建代理服务,从 apiserver 获取所有 server 信息,并根据 server 信息创建代理服务,实现server到Pod的请求路由和转发,从而实现K8s层级的虚拟转发网络 。

经验总结扩展阅读