Kubernetes 当中启用IPVS模式

kubernetes自1.8版本开始强推ipvs,之前版本默认使用iptables,这个iptables大家应该比较熟悉的,Linux默认防火墙嘛,它是比较古老的一种网络模式。

kubernetes在版本v1.6中已经支持5000个节点,但使用iptables 的 kube-proxy 实际上是将集群扩展到5000个节点的瓶颈。 在5000节点集群中使用 NodePort 服务,如果有2000个服务并且每个服务有10个 pod,这将在每个工作节点上至少产生20000个iptable 记录,这可能使内核非常繁忙。因此,如果是大集群的话,iptables可能会造成集群崩溃。

IPVS模式与iptables同样基于Netfilter,作为linux内核的一部分实现传输层负载均衡的技术,通常称为第4层LAN交换。但是ipvs采用的hash表(性能更加高效),Iptables采用一条条的规则列表。

kubernetes启用ipvs模式 (以kubeadm安装的集群为例)


启用ipvs而不使用iptables的原因

  • ipvs 可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs 为负载均衡算法提供了更多选项,例如:
  1. rr :轮询调度
  2. lc :最小连接数
  3. dh :目标哈希
  4. sh :源哈希
  5. sed :最短期望延迟
  6. nq : 不排队调度

前提条件:确保IPVS需要内核模块(由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块)

  • ip_vs
  • ip_vs_rr
  • ip_vs_wrr
  • ip_vs_sh
  • nf_conntrack_ipv4

检查已编译到节点内核中

每个节点都进行如下操作:

安装ipvs相关软件包

yum -y install ipvsadm ipset

modprobe ip_vs
lsmod | grep ip_vs

修改内核参数,vim /etc/sysctl.conf 添加

net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

# 应用生效
sysctl -p

修改kube-proxy模式

kubectl edit configmap -n kube-system kube-proxy

    mode: "ipvs"
    nodePortAddresses: null


如果要修改调度算法使用,默认为空 
    scheduler: ""


[root@k8s-master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

依次重启/删除kube-proxy的pod 


Kubeadm不仅仅将k8s集群搭建简化了,还采用了容器化的方式去部署k8s组件,这里只需要知道采用了容器化部署,因为帮我们封装好了。唯一一个采用的不是容器化部署的是kubelet,这个使用的是传统的systemd去管理的,在宿主机进行管理。其他的都是采用容器化部署,也就是通过启动容器帮你拉起组件。

[root@k8s-master ~]# kubectl get pod -n kube-system -o wide
NAME                                       READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE   READINESS GATES        1/1     Running   6          2d12h   192.168.179.102   k8s-master   <none>           <none>
kube-proxy-7wgls                           1/1     Running   2          2d11h   192.168.179.103   k8s-node1    <none>           <none>
kube-proxy-vkt7g                           1/1     Running   3          2d11h   192.168.179.104   k8s-node2    <none>           <none>
kube-proxy-xth6p                           1/1     Running   2          2d12h   192.168.179.102   k8s-master   <none>           <none>

删除pod之后 会新起一个新的pod 

[root@k8s-master ~]# kubectl delete pod kube-proxy-7wgls -n kube-system 
pod "kube-proxy-7wgls" deleted
[root@k8s-master ~]# kubectl delete pod kube-proxy-vkt7g -n kube-system 
pod "kube-proxy-vkt7g" deleted
[root@k8s-master ~]# kubectl delete pod kube-proxy-xth6p -n kube-system 
pod "kube-proxy-xth6p" deleted

等容器重启完毕再去看看

[root@k8s-master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  127.0.0.1:32567 rr
  -> 10.244.169.137:80            Masq    1      0          0         
TCP  172.17.0.1:31332 rr
  -> 10.244.169.139:80            Masq    1      0          0         
TCP  172.17.0.1:31383 rr
  -> 10.244.169.138:8443          Masq    1      0          0         
TCP  172.17.0.1:32567 rr
  -> 10.244.169.137:80            Masq    1      0          0         
TCP  192.168.179.102:31332 rr
  -> 10.244.169.139:80            Masq    1      0          0         
TCP  192.168.179.102:31383 rr
  -> 10.244.169.138:8443          Masq    1      0          0         
TCP  192.168.179.102:32567 rr
  -> 10.244.169.137:80            Masq    1      0          0         
TCP  10.96.0.1:443 rr
  -> 192.168.179.102:6443         Masq    1      0          0         
TCP  10.96.0.10:53 rr
  -> 10.244.36.73:53              Masq    1      0          0         
  -> 10.244.36.75:53              Masq    1      0          0         
TCP  10.96.0.10:9153 rr
  -> 10.244.36.73:9153            Masq    1      0          0         
  -> 10.244.36.75:9153            Masq    1      0          0         
TCP  10.98.137.105:80 rr
  -> 10.244.169.137:80            Masq    1      0          0         
TCP  10.99.50.2:80 rr
  -> 10.244.169.139:80            Masq    1      0          0         
TCP  10.99.68.0:443 rr
  -> 192.168.179.103:4443         Masq    1      0          0         
TCP  10.106.187.194:443 rr
  -> 10.244.169.138:8443          Masq    1      0          0         
TCP  10.108.138.194:8000 rr
  -> 10.244.36.74:8000            Masq    1      0          0         
TCP  127.0.0.1:31332 rr
  -> 10.244.169.139:80            Masq    1      0          0         
TCP  127.0.0.1:31383 rr
  -> 10.244.169.138:8443          Masq    1      0          0         
UDP  10.96.0.10:53 rr
  -> 10.244.36.73:53              Masq    1      0          0         
  -> 10.244.36.75:53              Masq    1      0          0   


TCP  172.17.0.1:31332 rr
  -> 10.244.169.139:80            Masq    1      0          0 

[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP        2d12h
nginx        NodePort    10.99.50.2   <none>        80:31332/TCP   2d11h 

[root@k8s-master ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-mkq8g   1/1     Running   0          10m   10.244.169.139   k8s-node2   <none>           <none>  
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值