所有文档

          容器引擎 CCE

          容器网段空间耗尽如何继续扩容

          概述

          一个集群中最大的节点数量由容器网段的大小和每个节点上最大 Pod 数量所决定,例如:

          • 容器网段选择 172.16.0.0/16,每个节点最大 Pod 数量为 256,则一个集群中最多只能有 256 个节点;
          • 容器网段选择 192.168.0.0/22,每个节点最大 Pod 数量为 128,则一个集群中最多只能有 8 个节点;

          在某些情况下,由于用户创建的集群时,选择的容器网段过小或者每个节点上最大的容器数量过大,在后续对集群进行扩容时,节点数量超过了集群中最大的节点数量。由于 kube-controller-manager 无法为这些扩容的节点分配Pod 的网段,会导致节点状态 notReady。

          解决方法

          第一步

          修改集群中 master 节点上 kube-controller-manager 的配置,需要修改的字段是 --node-cidr-mask-size。由于修改目的是让集群中可以容纳更多节点,也就是让节点上最大的 Pod 数量变小,我们需要修改 --node-cidr-mask-size 值使其变大。

          如果是多副本的 master,需要逐一修改各 master 节点上的配置。

          注意: 不能修改 --node-cidr-mask-size 比当前值更小,否则会造成网段冲突导致网络不通

          第二步

          从集群中移出节点再加入,包括的方法有两种:

          • 从 CCE 产品 console 界面上选择“移出节点”或“删除节点”, 之后再“移入节点”或“添加节点”。
          • 执行 kubectl delete node <nodeName> 从 k8s 集群中删除节点。执行 kubectl get pods --all-namespaces=true -o wide | grep <nodeName> 确保该节点上没有 Pod 之后,在节点上重启 kubelet 将节点重新加入到 k8s 集群。

          注意:不论哪种方式将节点从集群中删除,都会导致移出的节点上的所有 Pod 漂移。对于承载了线上服务的节点,需要谨慎操作。

          实际案例

          问题场景

          目前有一个集群的容器网段是 172.26.0.0/22,kube-controller-manager 配置中 --node-cidr-mask-size=24。也就是说,集群中最多容纳 4 个节点,每个节点上最大 Pod 数量是 256。

          集群中已经有 4 个节点了,如果再扩容节点将会导致新扩容的节点不可用。

          [root@instance-rhkiutp6-3 ~]# kubectl get node
          NAME       STATUS   ROLES    AGE    VERSION
          10.0.5.3   Ready    <none>   119m   v1.13.10
          10.0.5.4   Ready    <none>   117m   v1.13.10
          10.0.5.5   Ready    <none>   20m    v1.13.10
          10.0.5.6   Ready    <none>   118m   v1.13.10
          [root@instance-rhkiutp6-3 ~]# kubectl describe node | grep -i podcidr
          PodCIDR:                     172.26.2.0/24
          PodCIDR:                     172.26.1.0/24
          PodCIDR:                     172.26.3.0/24
          PodCIDR:                     172.26.0.0/24

          修改步骤

          第一步

          在 master 上执行 vim /etc/systemd/system/kube-controller.service 查看 kube-controller-manager 配置:

          [Unit]
          Description=Kubernetes Controller Manager
          After=network.target
          After=kube-apiserver.service
          
          [Service]
          ExecStart=/opt/kube/bin/kube-controller-manager \
          --allocate-node-cidrs=true \
          --cloud-config=/etc/kubernetes/cloud.config \
          --cluster-cidr=172.26.0.0/22 \
          --node-cidr-mask-size=24 \   #修改这里
          .......
          --kubeconfig=/etc/kubernetes/controller-manager.conf \
          --leader-elect=true \
          --logtostderr=true \
          --master=https://100.64.230.195:6443 \
          --v=6
          Restart=always
          Type=simple
          LimitNOFILE=65536
          
          [Install]
          WantedBy=multi-user.target

          修改 --node-cidr-mask-size 值从 24 变更为 26。这样修改后,集群中最多可以容纳 16 个节点,每个节点上最大 Pod 数量则减少为 64。

          依次在每个 master 节点修改配置后执行以下命令重启 kube-controller-manager。

          systemctl daemon-reload
          systemctl restart kube-controller.service

          第二步

          执行 kubectl delete node 10.0.5.4,此时集群状态中已经没有 10.0.5.4 节点:

          [root@instance-rhkiutp6-3 ~]# kubectl get node
          NAME       STATUS   ROLES    AGE    VERSION
          10.0.5.3   Ready    <none>   132m   v1.13.10
          10.0.5.5   Ready    <none>   33m    v1.13.10
          10.0.5.6   Ready    <none>   132m   v1.13.10
          [root@instance-rhkiutp6-3 ~]# kubectl describe node | grep -i podcidr
          PodCIDR:                     172.26.2.0/24
          PodCIDR:                     172.26.3.0/24
          PodCIDR:                     172.26.0.0/24

          执行 kubectl get pods --all-namespaces=true -o wide | grep <nodeName> 确保 10.0.5.4 上没有 Pod。

          在 10.0.5.4 节点上执行 systemctl restart kubelet.service 重启 kubelet,此时集群状态中表明 10.0.5.4 节点又被加入并且容器网段变为了 172.26.1.0/26:

          [root@instance-rhkiutp6-3 ~]# kubectl get node
          NAME       STATUS   ROLES    AGE     VERSION
          10.0.5.3   Ready    <none>   138m    v1.13.10
          10.0.5.4   Ready    <none>   3m55s   v1.13.10
          10.0.5.5   Ready    <none>   40m     v1.13.10
          10.0.5.6   Ready    <none>   138m    v1.13.10
          [root@instance-rhkiutp6-3 ~]# kubectl describe node | grep -i podcidr
          PodCIDR:                     172.26.2.0/24
          PodCIDR:                     172.26.1.0/26
          PodCIDR:                     172.26.3.0/24
          PodCIDR:                     172.26.0.0/24

          每移入移出一个已有节点将会创造出 3 个节点的扩容空间。例如现在可以给集群继续扩容 3 台节点,分配的 PodCIDR 将会是 172.26.1.64/26172.26.1.128/26 以及 172.26.1.192/26

          用户继续执行以上步骤移入移出所有节点,以创造更多的扩容空间。

          注意:PodCIDR 掩码不同的节点理论上可以存在于同一集群中,但还是建议用户将所有节点移入移出一遍,让节点拥有相同掩码的 PodCIDR。

          上一篇
          创建VPC-CNI模式集群
          下一篇
          CCE 支持 IPv4 和 IPv6 双栈网络