目录
service底层之 Iptables与 IPVS
service底层实现主要由两个网络模式组成:iptables与IPVS。他们都是有kube-proxy维护
![](https://img-blog.csdnimg.cn/a47d6fd5d48d473280a3c07dece08ef9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
service工作流程图
![](https://img-blog.csdnimg.cn/b1569722134e4222b668c25a3a388480.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
Iptables
以k8s中的nginx这个service举例,这是一个nodePort类型的service
![](https://img-blog.csdnimg.cn/1f217b797acc4fb0b48ba27f887a5926.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
用命令
iptables-save |grep nginx
可以看到这个service中的iptables规则
![](https://img-blog.csdnimg.cn/c05e109ece46457198a0c465e6e54cdc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
找到他对外暴露的端口30601
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/nginx" -m tcp --dport 30601 -j KUBE-SVC-2CMXP7HKUVJN7L6M
找到他CLUSTER-IP的这一条规则,即139的规则
-A KUBE-SERVICES -d 10.102.19.139/32 -p tcp -m comment --comment "default/nginx cluster IP" -m tcp --dport 80 -j KUBE-SVC-2CMXP7HKUVJN7L6M
由这条规则看出,如果访问的是10.102.19,139的80端口。则会将访问转发到
KUBE-SVC-2CMXP7HKUVJN7L6M
在搜索
KUBE-SVC-2CMXP7HKUVJN7L6M的规则
iptables-save |grep KUBE-SVC-2CMXP7HKUVJN7L6M
![](https://img-blog.csdnimg.cn/add53a7a2a824de49456b062204848ce.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
主要是最后三条规则
-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-LNPQQIWGFNOA5PA2-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-5YYPNSSTAPIDIORU-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -j KUBE-SEP-245ABZALMPSVYEFI
继续查找第一条规则所转发的路径
iptables-save |grep KUBE-SEP-LNPQQIWGFNOA5PA2
![](https://img-blog.csdnimg.cn/6920c021f240481c8a0060b96536d107.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
主要是这条规则
-A KUBE-SEP-LNPQQIWGFNOA5PA2 -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.169.147:80
查找第二条转发的路径
iptables-save |grep KUBE-SEP-5YYPNSSTAPIDIORU
![](https://img-blog.csdnimg.cn/e28239273d6d43e885d45c5dbebe9db2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
主要为这条规则
-A KUBE-SEP-5YYPNSSTAPIDIORU -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.36.124:80
查看第三条转发的规则
iptables-save |grep KUBE-SEP-245ABZALMPSVYEFI
![](https://img-blog.csdnimg.cn/2c08f1b0dfc5492dba157dbe741c9760.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
主要是这条规则
-A KUBE-SEP-245ABZALMPSVYEFI -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.36.125:80
所以,现在理清整个iptables的规则
第一步,流量的入口.请求进入他nodePort的30601端口或者service的ip加80端口
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/nginx" -m tcp --dport 30601 -j KUBE-SVC-2CMXP7HKUVJN7L6M-A KUBE-SERVICES -d 10.102.19.139/32 -p tcp -m comment --comment "default/nginx cluster IP" -m tcp --dport 80 -j KUBE-SVC-2CMXP7HKUVJN7L6M
第二步:负载均衡,他是采用random和权重值的方式进行负载均衡,因为iptables是从上到下匹配的,但因为权重值的原因,例如此service有三个pod访问路径。他在访问第一条的时候概率为0.3333,访问第二条概率为0.5,第三条为1,而他又是由上向下按顺序匹配,使得访问三条规则的概率一样,这样实现负载均衡
-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-LNPQQIWGFNOA5PA2-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-5YYPNSSTAPIDIORU-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -j KUBE-SEP-245ABZALMPSVYEFI
第三步:将访问转发到实际的容器中
-A KUBE-SEP-LNPQQIWGFNOA5PA2 -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.169.147:80-A KUBE-SEP-5YYPNSSTAPIDIORU -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.36.124:80-A KUBE-SEP-245ABZALMPSVYEFI -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.36.125:80
IPVS
我们查看kube-proxy的日志,能发现service默认是采用iptables为网络模式
![](https://img-blog.csdnimg.cn/e0e3110c5fa24fe49868da33fc881357.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
所以,如果要使用IPVS,我们首先需要将默认的iptables切换为IPVS
service切换IPVS
使用那种网络模式是有kube-proxy决定的,所以修改网络模式就是修改kube-proxy容器内容
kubeadm方式修改ipvs模式
第一步:
kubectl edit configmap kube-proxy -n kube-system
![](https://img-blog.csdnimg.cn/09a7b8df1ac8417c9987b5e527aae267.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
第二步:找到mode字段,可以看到mode是空的,因为iptables是默认的网络模式,所以当mode为空时kube-proxy会选用iptables模式
![](https://img-blog.csdnimg.cn/0b321b2edf2f4f2886b8c2f6c0a322b4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_16,color_FFFFFF,t_70,g_se,x_16)
第三步:给mode赋值ipvs并保存退出
![](https://img-blog.csdnimg.cn/68918e89d7e847f7ae742ee2c24d64ce.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_11,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/ea0f17c62a144542a51ecd2bf6b23714.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_18,color_FFFFFF,t_70,g_se,x_16)
最后一步,删除节点原kube-proxy的pod,让k8s自己重建,则网络模式会被修改为ipvs
![](https://img-blog.csdnimg.cn/0de5527794ae41c88e4f1547b327264e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_19,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/9a3005fc2c294ac094da2bd3625d02bf.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
可以看到网络模式已经被修改为ipvs
![](https://img-blog.csdnimg.cn/0e882a72992c40c7b152b79a226fb439.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
二进制方式修改ipvs模式
配置文件路径根据实际安装目录为准
# vi kube-proxy-config.ymlmode: ipvsipvs:scheduler: "rr“# systemctl restart kube-proxy
ipvs规则
查看ipvs的规则
先安装ipvsadm
yum install ipvsadm -y
查看ipvs规则
ipvsadm -L -n
![](https://img-blog.csdnimg.cn/4647aae0ab2f4a0e80f4c76d772f97c0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
Iptables VS IPVS
Iptables:
• 灵活,功能强大
• 规则遍历匹配和更新,呈线性时延
IPVS:
• 工作在内核态,有更好的性能
• 调度算法丰富:rr,wrr,lc,wlc,ip hash...
Service DNS名称
CoreDNS:是一个DNS服务器,Kubernetes默认采用,以Pod部署在集群中, CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。
ClusterIP A记录格式:
![](https://img-blog.csdnimg.cn/a5165a2046bc4a70b68f4e48f6b68053.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_17,color_FFFFFF,t_70,g_se,x_16)
示例:my-svc.my-namespace.svc.cluster.local
![](https://img-blog.csdnimg.cn/8268f754de28486c8958a6b987c22d1e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5Y2X6YGT5Lq6,size_13,color_FFFFFF,t_70,g_se,x_16)