kube-proxy
目录:
Service
service是一组具有相同label集合的抽象,当创建service的时候会自动创建一个endpoint对象,用于容器发现
endpoints controller的功能是监听service和pod的变化,维护和生成endpoints
当创建一个service的时候,endpoint controller监听pod的状态,当pod为running状态,会将pod的ip记录到endpoint,service的容器发现就是用过endpoint实现的
Service的负载均衡
kube-proxy的代理模块有四种实现方式
- userspace 在v1.0为四层代理
- iptables 在v1.1出现,在v1.2为默认代理
- ipvs 在v1.8引入
- 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暴露的类型有四种
- ClusterIP 用于集群内部访问
- NodePort
- LoadBalancer
- ExternelName
还有就是Ingress了
Service的服务发现
Service的服务发现方式有两种
- 环境变量,但是Service创建之前pod是不会注册该环境变量
- DNS
kube-proxy启动流程
在Run方法之前,解析命令行参数,添加默认值,然后在Run方法初始化ProxyServer对象
- 如果指定了
--write-config-to
,将默认配置打印到文件 - 调用NewProxyServer初始化ProxyServer对象
- 如果指定了
--cleanup
,清理iptables规则和ipvs规则退出 - 启动循环runLoop
NewProxyServer的操作
- 初始化iptables和ipvs的interface
- 如果启动了ipvs,检查内核模块,内核版本
- 根据proxyMode初始化proxier
runLoop用于启动proxyServer
- 调用watcher.Run进行watch配置文件的变化
- 异步调用proxyServer.Run启动proxyServer
proxyServer.Run运行的流程
- 进程设置OOMSroce,默认为-999
- 启动healthz和metrics
- 配置内核参数
nf_conntrack_tcp_timeout_established
和nf_conntrack_tcp_timeout_close_wait
- 注册proxier到serviceEventHandler和endpointsEventHandler
- 启动informer监听service和endpoints的变化
- 调用s.Proxier.SyncLoop()