kube-proxy模式之ipvs

注:本文基于K8S v1.21.2版本编写

1 安装依赖组件

使用ipvs模式需要依赖ipvsadm,因此需要先在所有节点安装依赖,

yum install -y ipvsadm

2 设置kube-proxy为ipvs模式

使用ipvs模式需要修改kube-proxy的配置,可以通过dashboard或者kubectl edit的方式修改,

    ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: false
      syncPeriod: 0s
      tcpFinTimeout: 0s
      tcpTimeout: 0s
      udpTimeout: 0s
    kind: KubeProxyConfiguration
    metricsBindAddress: ""
    mode: "ipvs"

主要就是将kube-proxy的configmap中的mode设置为ipvs,然后需要删除集群里的kube-proxy pod,让其重建,使用新的配置,

kubectl delete pod kube-proxy-*** -n kube-system

然后我们查看kube-proxy日志,就能看到当前proxier使用ipvs,并且由于我们ipvs的scheduler配置没有设置,因此调度算法默认为rr,即轮询。

I0920 03:39:22.056735       1 node.go:172] Successfully retrieved node IP: 192.168.0.110
I0920 03:39:22.056838       1 server_others.go:140] Detected node IP 192.168.0.110
I0920 03:39:22.109090       1 server_others.go:206] kube-proxy running in dual-stack mode, IPv4-primary
I0920 03:39:22.109110       1 server_others.go:274] Using ipvs Proxier.
I0920 03:39:22.109116       1 server_others.go:276] creating dualStackProxier for ipvs.
W0920 03:39:22.109129       1 server_others.go:512] detect-local-mode set to ClusterCIDR, but no IPv6 cluster CIDR defined, , defaulting to no-op detect-local for IPv6
E0920 03:39:22.110175       1 proxier.go:389] can't set sysctl net/ipv4/vs/conn_reuse_mode, kernel version must be at least 4.1
W0920 03:39:22.110376       1 proxier.go:445] IPVS scheduler not specified, use rr by default
E0920 03:39:22.110645       1 proxier.go:389] can't set sysctl net/ipv4/vs/conn_reuse_mode, kernel version must be at least 4.1
W0920 03:39:22.110666       1 proxier.go:445] IPVS scheduler not specified, use rr by default
W0920 03:39:22.110677       1 ipset.go:113] ipset name truncated; [KUBE-6-LOAD-BALANCER-SOURCE-CIDR] -> [KUBE-6-LOAD-BALANCER-SOURCE-CID]
W0920 03:39:22.110682       1 ipset.go:113] ipset name truncated; [KUBE-6-NODE-PORT-LOCAL-SCTP-HASH] -> [KUBE-6-NODE-PORT-LOCAL-SCTP-HAS]
I0920 03:39:22.111494       1 server.go:643] Version: v1.21.2

另外,建议重启下集群所有节点,否则iptables规则不会更新。

3 查看服务规则

一切顺利的情况下,我们就可以查看到ipvs的规则,

[root@master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr
  -> 192.168.0.110:6443           Masq    1      5          0         
TCP  10.96.0.10:53 rr
  -> 10.244.0.53:53               Masq    1      0          0         
  -> 10.244.0.54:53               Masq    1      0          0         
  -> 10.244.0.56:53               Masq    1      0          0         
TCP  10.96.0.10:9153 rr
  -> 10.244.0.53:9153             Masq    1      0          0         
  -> 10.244.0.54:9153             Masq    1      0          0         
  -> 10.244.0.56:9153             Masq    1      0          0
...

我们看到10.96.0.10后端挂有三个实例,这其实就对应这三个coredns实例,

[root@master ~]# kubectl get pod -A -o wide
NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
kube-system            coredns-558bd4d5db-2rjlq                     1/1     Running   1          2d6h    10.244.0.54     master   <none>           <none>
kube-system            coredns-558bd4d5db-fp5k6                     1/1     Running   1          2d6h    10.244.0.53     master   <none>           <none>
kube-system            coredns-558bd4d5db-wbn88                     1/1     Running   2          4d13h   10.244.0.56     master   <none>           <none>
...

同时,机器上会有一个kube-ipvs0虚拟网络设备,用于绑定集群中的服务ip,即ClusterIP,

[root@master ~]# ip a show kube-ipvs0
7: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN 
    link/ether 2e:f5:50:d9:1b:e2 brd ff:ff:ff:ff:ff:ff
    inet 10.96.0.10/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.108.232.114/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    ...
[root@master ~]# kubectl get svc -A
NAMESPACE              NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
argocd                 argocd-dex-server           ClusterIP   10.108.232.114   <none>        5556/TCP,5557/TCP,5558/TCP   61d
kube-system            kube-dns                    ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP       69d
...

4 关于ipvs模式和iptables模式的区别

4.1 ipvs模式的扩展性和性能更好

以ipvs依赖iptables的场景来说明,ipvs使用ipset来存储流量的源或目标地址,而ipset使用哈希表作为基础数据结构,这样可以确保iptables规则的数量是恒定的。iptables模式下针对不同ip需要一条一条地添加规则,但对于ipset只需要将对应的ip加入到ipset集合中即可,因此iptables规则可以保持不变,数量也很少。

我们以其中一条规则来看,这里规则里匹配的是KUBE-CLUSTER-IP

Chain KUBE-SERVICES (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    ...
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set KUBE-CLUSTER-IP dst,dst

我们通过ipset查看对应的集合内容,

[root@master ~]# ipset list
Name: KUBE-CLUSTER-IP
Type: hash:ip,port
Revision: 2
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 17040
References: 2
Members:
10.102.178.230,tcp:443
10.105.244.154,tcp:8084
10.96.0.10,tcp:53
10.108.25.186,tcp:6379
...

可见,通过此集合,把所有服务的clusterip都包含,不管是增加还是删除,都不会影响iptables规则。

4.2 ipvs模式支持更多调度算法

iptables只支持随机策略,而ipvs支持rr轮询,wrr加权轮询,lc最少连接,最小负载等算法

4.3 ipvs模式支持后端健康检查和连接重试等功能

4.4 ipvs模式下service ip可以ping通

在iptables模式下,service ip仅存在于iptables规则中,没有响应设备,因此是ping不通的。但是ipvs模式下,service ip被绑定在虚拟设备kube-ipvs0中,因此是有响应设备,可以ping通,

[root@centos-79456f6db-9wzc5 /]# ping -c 1 kubernetes.default
PING kubernetes.default.svc.cluster.local (10.96.0.1) 56(84) bytes of data.
64 bytes from kubernetes.default.svc.cluster.local (10.96.0.1): icmp_seq=1 ttl=64 time=0.082 ms

--- kubernetes.default.svc.cluster.local ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.082/0.082/0.082/0.000 ms
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值