- k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡
- 环境变量
- DNS
- userspace 模式
- iptables
- ipvs
- kernelspace
- 前言
- endpoint
- kube-proxy
- 服务发现
- 总结
- 参考
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 对象,主要的功能有下面几种
【k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡】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层级的虚拟转发网络 。
在 k8s 中提供相同服务的一组 pod 可以抽象成一个 service,通过 service 提供统一的服务对外提供服务,kube-proxy 存在于各个 node 节点上,负责为 service 提供 cluster 内部的服务发现和负载均衡,负责 Pod 的网络代理,它会定时从 etcd 中获取 service 信息来做相应的策略,维护网络规则和四层负载均衡工作 。k8s 中集群内部的负载均衡就是由 kube-proxy 实现的,它是 k8s 中内部的负载均衡器,也是一个分布式代理服务器,可以在每个节点中部署一个,部署的节点越多,提供负载均衡能力的 Kube-proxy 就越多,高可用节点就越多 。
简单点讲就是 k8s 内部的 pod 要访问 service ,kube-proxy 会将请求转发到 service 所代表的一个具体 pod , 也就是 service 关联的 Pod 。
推荐阅读
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点
- 时空中的绘旅人司岚生日限定礼包有什么内容
- CentOS 8.2 对k8s基础环境配置
- UML类中的6种关系
- 使用 Kubeadm 部署 K8S安装
- 工厂方法在Spring源码中的运用
- 我的世界信标怎么用,信标功能详细介绍(我的世界中的信标是怎么用的)
- 实时营销引擎在vivo营销自动化中的实践 | 引擎篇04
- 王者荣耀中的露娜,要怎么样玩才能练好招式呢
- .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法