kube-proxy

时间:Aug. 2, 2020 分类:

目录:

Service

service是一组具有相同label集合的抽象,当创建service的时候会自动创建一个endpoint对象,用于容器发现

endpoints controller的功能是监听service和pod的变化,维护和生成endpoints

当创建一个service的时候,endpoint controller监听pod的状态,当pod为running状态,会将pod的ip记录到endpoint,service的容器发现就是用过endpoint实现的

Service的负载均衡

kube-proxy的代理模块有四种实现方式

  1. userspace 在v1.0为四层代理
  2. iptables 在v1.1出现,在v1.2为默认代理
  3. ipvs 在v1.8引入
  4. kernelspace windows使用的

userspace下,流量到节点后,先进入内核空间,由内核iptables转回用户空间,由kube-proxy转发到后端pod

iptables基于netfilter,请求service的IP的时候直接路由到对应pod的IP,kube-proxy只复制管理iptables规则,但在service多的时候引入大量iptables规则,影响性能

ipvs使用的LVS的负载均衡,以哈希表为底层数据结构工作在内核态,支持DR模式,NAT模式,ipip模式,ipvs使用的NAT的模式,支持rr,lc最小连接,dh,sh等算法

在service中,不论哪种模式默认都是rr的方式选择后端,可以配置service.spec.sessionAffinity实现会话保持,service.spec.sessionAffinityConfig.clientIP.timeoutSeconds设置会话保持时间

Service的暴露类型

Service暴露的类型有四种

  1. ClusterIP 用于集群内部访问
  2. NodePort
  3. LoadBalancer
  4. ExternelName

还有就是Ingress了

Service的服务发现

Service的服务发现方式有两种

  1. 环境变量,但是Service创建之前pod是不会注册该环境变量
  2. DNS

kube-proxy启动流程

在Run方法之前,解析命令行参数,添加默认值,然后在Run方法初始化ProxyServer对象

  1. 如果指定了--write-config-to,将默认配置打印到文件
  2. 调用NewProxyServer初始化ProxyServer对象
  3. 如果指定了--cleanup,清理iptables规则和ipvs规则退出
  4. 启动循环runLoop

NewProxyServer的操作

  1. 初始化iptables和ipvs的interface
  2. 如果启动了ipvs,检查内核模块,内核版本
  3. 根据proxyMode初始化proxier

runLoop用于启动proxyServer

  1. 调用watcher.Run进行watch配置文件的变化
  2. 异步调用proxyServer.Run启动proxyServer

proxyServer.Run运行的流程

  1. 进程设置OOMSroce,默认为-999
  2. 启动healthz和metrics
  3. 配置内核参数nf_conntrack_tcp_timeout_establishednf_conntrack_tcp_timeout_close_wait
  4. 注册proxier到serviceEventHandler和endpointsEventHandler
  5. 启动informer监听service和endpoints的变化
  6. 调用s.Proxier.SyncLoop()