k8s-service底层之 Iptables与 IPVS

目录

service底层之 Iptables与 IPVS

Iptables

IPVS

service切换IPVS


service底层之 Iptables与 IPVS

     service底层实现主要由两个网络模式组成:iptables与IPVS。他们都是有kube-proxy维护
k8s-service底层之 Iptables与 IPVS_第1张图片
service工作流程图
k8s-service底层之 Iptables与 IPVS_第2张图片

Iptables

以k8s中的nginx这个service举例,这是一个nodePort类型的service
用命令
iptables-save |grep nginx
可以看到这个service中的iptables规则
k8s-service底层之 Iptables与 IPVS_第3张图片
找到他对外暴露的端口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
k8s-service底层之 Iptables与 IPVS_第4张图片
主要是最后三条规则
-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
主要是这条规则
-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
主要为这条规则
-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
主要是这条规则
-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为网络模式
k8s-service底层之 Iptables与 IPVS_第5张图片
所以,如果要使用IPVS,我们首先需要将默认的iptables切换为IPVS

service切换IPVS

使用那种网络模式是有kube-proxy决定的,所以修改网络模式就是修改kube-proxy容器内容
kubeadm方式修改ipvs模式
第一步:
kubectl edit configmap kube-proxy -n kube-system
k8s-service底层之 Iptables与 IPVS_第6张图片
第二步:找到mode字段,可以看到mode是空的,因为iptables是默认的网络模式,所以当mode为空时kube-proxy会选用iptables模式
k8s-service底层之 Iptables与 IPVS_第7张图片
第三步:给mode赋值ipvs并保存退出
k8s-service底层之 Iptables与 IPVS_第8张图片
最后一步,删除节点原kube-proxy的pod,让k8s自己重建,则网络模式会被修改为ipvs
k8s-service底层之 Iptables与 IPVS_第9张图片
可以看到网络模式已经被修改为ipvs
k8s-service底层之 Iptables与 IPVS_第10张图片
二进制方式修改ipvs模式
配置文件路径根据实际安装目录为准
# vi kube-proxy-config.yml
mode: ipvs
ipvs:
  scheduler: "rr“
# systemctl restart kube-proxy
ipvs规则
查看ipvs的规则
先安装ipvsadm
yum install ipvsadm -y
查看ipvs规则
ipvsadm -L -n
k8s-service底层之 Iptables与 IPVS_第11张图片
Iptables VS IPVS
Iptables:
• 灵活,功能强大
• 规则遍历匹配和更新,呈线性时延
IPVS:
• 工作在内核态,有更好的性能
• 调度算法丰富:rr,wrr,lc,wlc,ip hash...
Service DNS名称
CoreDNS:是一个DNS服务器,Kubernetes默认采用,以Pod部署在集群中, CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。 
ClusterIP A记录格式:
示例:my-svc.my-namespace.svc.cluster.local
k8s-service底层之 Iptables与 IPVS_第12张图片

你可能感兴趣的:(k8s-service,kubernetes,运维,运维开发,容器,负载均衡)