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等命令实现更新宿主机网络