目录

service底层之 Iptables与 IPVS

Iptables

IPVS

service切换IPVS


service底层之 Iptables与 IPVS



     service底层实现主要由两个网络模式组成:iptables与IPVS。他们都是有kube-proxy维护




iptables 启用 后网络卡_运维开发


service工作流程图



iptables 启用 后网络卡_运维开发_02


Iptables


以k8s中的nginx这个service举例,这是一个nodePort类型的service



iptables 启用 后网络卡_运维开发_03



用命令


iptables-save |grep nginx


可以看到这个service中的iptables规则



iptables 启用 后网络卡_kubernetes_04



找到他对外暴露的端口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


KUBE-SVC-2CMXP7HKUVJN7L6M




KUBE-SVC-2CMXP7HKUVJN7L6M的规则


iptables-save |grep KUBE-SVC-2CMXP7HKUVJN7L6M



iptables 启用 后网络卡_容器_05





主要是最后三条规则


-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



iptables 启用 后网络卡_kubernetes_06


主要是这条规则


-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



iptables 启用 后网络卡_iptables 启用 后网络卡_07


主要为这条规则


-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



iptables 启用 后网络卡_kubernetes_08


主要是这条规则


-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为网络模式



iptables 启用 后网络卡_容器_09



所以,如果要使用IPVS,我们首先需要将默认的iptables切换为IPVS



service切换IPVS


使用那种网络模式是有kube-proxy决定的,所以修改网络模式就是修改kube-proxy容器内容



kubeadm方式修改ipvs模式


第一步:


kubectl edit configmap kube-proxy -n kube-system



iptables 启用 后网络卡_运维开发_10



第二步:找到mode字段,可以看到mode是空的,因为iptables是默认的网络模式,所以当mode为空时kube-proxy会选用iptables模式



iptables 启用 后网络卡_iptables 启用 后网络卡_11



第三步:给mode赋值ipvs并保存退出



iptables 启用 后网络卡_运维_12



iptables 启用 后网络卡_运维_13



最后一步,删除节点原kube-proxy的pod,让k8s自己重建,则网络模式会被修改为ipvs



iptables 启用 后网络卡_运维开发_14




iptables 启用 后网络卡_iptables 启用 后网络卡_15


可以看到网络模式已经被修改为ipvs



iptables 启用 后网络卡_kubernetes_16



二进制方式修改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



iptables 启用 后网络卡_运维_17




Iptables VS IPVS



Iptables:


• 灵活,功能强大


• 规则遍历匹配和更新,呈线性时延


IPVS:


• 工作在内核态,有更好的性能


• 调度算法丰富:rr,wrr,lc,wlc,ip hash...



Service DNS名称


CoreDNS:是一个DNS服务器,Kubernetes默认采用,以Pod部署在集群中, CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。 


ClusterIP A记录格式:

iptables 启用 后网络卡_容器_18


示例:my-svc.my-namespace.svc.cluster.local



iptables 启用 后网络卡_容器_19