K8s-kube-proxy(Overview)
K8s-kube-proxy(Overview)
基于1.25
什么是kube-proxy
kube-proxy是K8s控制面组件之一,需要在每个节点部署。
- kube-proxy根据Service定义和Endpoints、EndpointSlice资源对象中存储的内容,在宿主机上配置iptables、ipvs等规则,实现Service的负载均衡和服务发现功能
kube-proxy主要支持俩种模式:iptables和ipvs
- ipatbles:通过配置iptables规则实现DNAT、SNAT、源IP地址检查等
- ipvs:通过配置ipvs实现DNAT,而SNAT、源IP地址检查等继续配置iptables实现,并且使用IP Set降低查找IP地址和端口的时间复杂度
Service资源
K8s中的Service中,有ClusterIP、NodePort、LoadBalancer和ExternalName
- ClusterIP:最基本的Service 类型,在不考虑双栈的情况下,通常包含一个IP地址和若干个Port,并且通过标签选择器关联后端Pod。集群内应用可以通过”ClusterIP:Port”的形式访问Service的后端Pod
- NodePort:在ClusterIP类型基础上,NodePort类型会额外为每个Port的集群节点上分配一个端口号(NodePort)
- 除了以”ClusterIP:Port“访问Service,还可以让集群外的应用以”宿主机IP:NodePort“访问Service
- LoadBalancer:该类型的Service和NodePort类型相同,也会在集群分配端口号
- 除了
ClusterIP:Port
和宿主机节点IP:NodePort
形式访问Service,还可以用LoadBalancerIP:Port
访问
- 除了
- ExternalName:与前面几种Service不同,ExternalName类型主要用于外部地址提供了一个可以内集群访问的别名
- 当访问一个ExternalName的Service的时候,集群DNS服务会返回该Service的CNAME记录
kube-proxy会给上述分配配置iptabels、ipvs规则
- 如果Service没有配置ClusterIP,或者类型为ExternalName,客户端只能访问Service域名
- 域名由集群DNS服务(如CoreDNS)负载,不在kube-proxy 的处理
架构
- Kube-proxy使用Informer的Watch机制监听集群中的Service、Endpoints、EndpointSlice等资源变化
- kube-proxy默认监听EndpointSlice对象,因为使用EndpointSlice对象,Pod滚动更新从kube-apiserver向各个集群传输等数据量少
- 监听资源时间,调用iptables、ipset等命令实现更新宿主机网络
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joohwan!
评论