概念回顾
kube-proxy
kube-proxy是Kubernetes网络代理组件,运行在每个NODE上, deamonSet模式运行,用来支撑TCP/UDP/SCTP四层流量转发,或是一组后端服务器(Pod)进行TCP/UDP流量转发(默认策略模式roundRobin)
功能如下:
- 必须运行在每个node上
- 转发TCP/UDP/SCTP流量
- 不支持HTTP
- 提供负载均衡能力
- 只用来访问Service
kube-proxy共有三种服务类型,如下
- Cluster-ip
- NodePort
- LoadBalance
Service类型工作原理
Cluster-IP
从Kubernetes1.2默认情况下,从集群内部发送到clusterIP的包源地址永远不会进行SNAT(kube-proxy运行在iptables模式下,默认情况下就是iptables模式),如何查看kube-proxy的运行模式,如下
- 范例
<root@SYS-K8S-CP1 ~># curl -i http://localhost:10249/proxyMode HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 X-Content-Type-Options: nosniff Date: Fri, 20 May 2022 04:22:21 GMT Content-Length: 8 iptables
请求流
实际以请求sit01-xc-loanweb为例,分析如下
-
从Pod-C请求到Pod-A,Pod-A(sit01-xc-loanweb)实际以ClusterIP的方式expose服务,具体端口是以8080
-
当Pod-C请求sit01-xc-loanwebe服务时,内部域名(xc-loan.sit01.nflow.cn)
-
Pod-C发出请求后,经过自己所在的node,check本机的iptables规则,如下(sit01-xc-loanweb)使用iptables-save查看
-A KUBE-SERVICES -d 10.10.147.45/32 -p tcp -m comment --comment "sit/sit01-xc-loanweb:http cluster IP" -m tcp --dport 8080 -j KUBE-SVC-CRJTZGXZEZHAKQ75
-A KUBE-SVC-CRJTZGXZEZHAKQ75 -m comment --comment "sit/sit01-xc-loanweb:http" -j KUBE-SEP-BXKHI3O6DYI2MSCL
-A KUBE-SEP-BXKHI3O6DYI2MSCL -p tcp -m comment --comment "sit/sit01-xc-loanweb:http" -m tcp -j DNAT --to-destination 172.19.102.247:8080
- 根据iptables规则,替换目的地址,将10.10.147.45替换为172.19.102.247,而源地址则不变
注意:下图的错误点
-
SNAT修正为DNAT
-
返回流
- Pod-A的地址替换成SVC1的地址,即172.19.0.1 → 10.10.0.1
NodePort
从Kubernetes1.5开始,如果客户端请求NodePort的服务,默认数据包进行源地址转换SNAT
请求流
实际以RabbitMQ 15672端口为例,域名sit-mq-mgt.qiangyun.com(注意该域名入口不是以ingress模式配置)
-
客户端请求Pod-C的服务,该服务是以NodePort的形式expose
-
访问域名sit-mq-mgt.qiangyun.com(实际后端的地址是10.1.48.1:30891)
-
目的地址转换DNAT的iptables规则
-A KUBE-NODEPORTS -p tcp -m comment --comment "sit/sit-rabbitmq:mq-mgt" -m tcp --dport 30891 -j KUBE-SVC-4ZCHRGNPBVZO7YGD
-A KUBE-SVC-4ZCHRGNPBVZO7YGD -m comment --comment "sit/sit-rabbitmq:mq-mgt" -j KUBE-SEP-7T6YOIC7QTENJC7F
-A KUBE-SEP-7T6YOIC7QTENJC7F -p tcp -m comment --comment "sit/sit-rabbitmq:mq-mgt" -m tcp -j DNAT --to-destination 172.19.255.105:15672
-
目的地址替换10.148.1 → 172.19.1.1
返回流
- 执行相关源地址,目的地址转换
LoadBalance
从Kubernetes1.5开始,如果请求load balance类型的服务,默认情况下,需要进行源地址转换
请求流
大致与NodePort类似,只是多了一层LoadBalance
目的地址转换LB的地址转换为后端服务器的地址
如果是externaltrafficpolicy = Local,那么具体的请求如下