一、kubeproxy random
kubeproxy支持不同的服务发现方式,其中的random模式是默认的方式。
在该模式下,kubeproxy随机选择一个健康的pod来作为服务代理。当有新的pod加入或是旧的pod退出时,kubeproxy会自动更新负载均衡规则。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
sessionAffinity: None // 关闭session粘连
二、kubeproxy主要功能是什么
kubeproxy是一个独立部署的服务,主要实现了如下的功能:
- 对外暴露kubernetes集群内的服务
- 实现服务的负载均衡
- 提供节点间的通信
三、kubeproxy原理
kubeproxy通过获取kubernetes集群状态来动态地维护和更新iptables规则,来实现服务的负载均衡和代理。他可以根据监听的service端口和容器端口来创建对应的iptables规则。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j KUBE-SERVICES
iptables -t nat -A KUBE-SERVICES -d 10.0.0.10/32 -p tcp -m comment --comment "my-service: http" -j KUBE-MARK-MASQ
iptables -t nat -A KUBE-SERVICES -d 10.0.0.10/32 -p tcp -m comment --comment "my-service: http" -j KUBE-SVC-MYAPP
四、kubeproxy替代方案
替代kubeproxy的主要方案是采用Service Mesh的解决方案,如Istio。Service Mesh主要是通过sidecar代理来实现服务的负载均衡和流量控制,对于服务的细粒度控制更加易于管理。
五、kubeproxy运行机制分析
kubeproxy的运行机制如下:
- kubeproxy从apiserver获取到pods、services、nodes等kubernetes集群的信息
- kubeproxy通过监控objects的变化来动态更新iptables规则,同时监听apiserver的变化
- kubeproxy通过替换IP的方式实现容器之间的通信
//获取集群信息
curl -s -H "Authorization: Bearer ${TOKEN}" https://$APISERVER/api/v1/nodes | jq .
//动态更新iptables规则
iptables -t nat -A KUBE-SERVICES -d 10.0.0.10/32 -p tcp --dport 80 -j KUBE-MARK-MASQ
iptables -t nat -A KUBE-SERVICES -d 10.0.0.10/32 -p tcp --dport 80 -m comment --comment "my-service: http" -j KUBE-SVC-MYAPP
六、kubeproxy工作模式概述
kubeproxy的工作模式主要有如下几种:
- User-Space代理模式: kubeproxy在linux用户空间中运行,监听service的事件,实现负载均衡和代理
- Iptable代理模式: kubeproxy以iptables规则的形式实现负载均衡和代理
- IPVS代理模式: kubeproxy以IPVS规则的形式实现负载均衡和代理
//User-Space模式
iptables -t nat -L KUBE-SERVICES
//IPtable模式
ipvsadm -Ln
//IPVS模式
ipvsadm -ln