【问题标题】:How to make the pod CIDR range larger in kubernetes cluster deployed with kubeadm?如何让 kubeadm 部署的 kubernetes 集群中的 pod CIDR 范围更大?
【发布时间】:2023-03-26 23:19:01
【问题描述】:

我部署了添加了 --pod-network-cidr 的集群,并使用 calicoctl 创建了新的 ip 池以将 pod 更改为此范围。我遇到的问题正是我需要在 kubernetes 方面进行更改以使 pod cidr 范围更改?我是在 API 服务器、控制器管理器和调度程序中进行更改,还是只需要更改特定部分。我只尝试更改控制器管理器,并且在更改 yaml 中的 --cluster-cidr 后,这些控制平面 pod 进入崩溃循环。

控制器管理器日志中的输出如下?

controllermanager.go:235] 启动控制器时出错:无法将 idx [0] 处的 cidr[192.168.0.0/24] 标记为节点占用:: cidr 192.168.0.0/24 超出集群 cidr 10.0 的范围。 0.0/16

【问题讨论】:

    标签: kubernetes kubernetes-pod project-calico calico


    【解决方案1】:

    更改集群 CIDR 并不是一项简单的任务。我设法重现了您的场景,并设法使用以下步骤对其进行了更改。

    更改 IP 池

    流程如下:

    1. 将 calicoctl 安装为 Kubernetes pod (Source)
    2. 添加新的 IP 池 (Source)。
    3. 禁用旧 IP 池。这可以防止从旧 IP 池分配新的 IPAM,而不会影响现有工作负载的网络。
    4. 更改节点podCIDR参数(Source
    5. 在主节​​点上的 kube-controller-manager.yaml 上更改 --cluster-cidr。 (感谢OP
    6. 重新创建从旧 IP 池分配地址的所有现有工作负载。
    7. 删除旧 IP 池。

    让我们开始吧。

    在本例中,我们将把192.168.0.0/16 替换为10.0.0.0/8

    1. 将 calicoctl 安装为 Kubernetes pod
      $ kubectl apply -f https://docs.projectcalico.org/manifests/calicoctl.yaml
      
      设置别名:
      $ alias calicoctl="kubectl exec -i -n kube-system calicoctl -- /calicoctl "
      
    2. 添加新的 IP 池:

      calicoctl create -f -<<EOF
      apiVersion: projectcalico.org/v3
      kind: IPPool
      metadata:
        name: new-pool
      spec:
        cidr: 10.0.0.0/8
        ipipMode: Always
        natOutgoing: true
      EOF
      

      我们现在应该有两个启用的 IP 池,我们可以在运行 calicoctl get ippool -o wide 时看到它们:

      NAME                  CIDR             NAT    IPIPMODE   DISABLED
      default-ipv4-ippool   192.168.0.0/16   true   Always     false
      new-pool              10.0.0.0/8       true   Always     false
      
    3. 禁用旧 IP 池。

      首先将 IP 池定义保存到磁盘:

      calicoctl get ippool -o yaml > pool.yaml
      

      pool.yaml 应如下所示:

      apiVersion: projectcalico.org/v3
      items:
      - apiVersion: projectcalico.org/v3
        kind: IPPool
        metadata:
          name: default-ipv4-ippool
        spec:
          cidr: 192.168.0.0/16
          ipipMode: Always
          natOutgoing: true
      - apiVersion: projectcalico.org/v3
        kind: IPPool
        metadata:
          name: new-pool
        spec:
          cidr: 10.0.0.0/8
          ipipMode: Always
          natOutgoing: true
      

      注意:一些额外的集群特定信息已被编辑以提高可读性。

      编辑文件,将disabled: true 添加到default-ipv4-ippool IP 池:

      apiVersion: projectcalico.org/v3
      kind: IPPool
      metadata:5
        name: default-ipv4-ippool
      spec:
        cidr: 192.168.0.0/16
        ipipMode: Always
        natOutgoing: true
        disabled: true
      

      应用更改:

      calicoctl apply -f pool.yaml
      

      我们应该看到calicoctl get ippool -o wide的输出中反映的变化:

      NAME                  CIDR             NAT    IPIPMODE   DISABLED
      default-ipv4-ippool   192.168.0.0/16   true   Always     true
      new-pool              10.0.0.0/8       true   Always     false
      
    4. 更改节点podCIDR参数:

      使用新的 IP 源范围覆盖特定 k8s 节点资源上的 podCIDR 参数,可使用以下命令:

      $ kubectl get no kubeadm-0 -o yaml > file.yaml; sed -i "s~192.168.0.0/24~10.0.0.0/16~" file.yaml; kubectl delete no kubeadm-0 && kubectl create -f file.yaml
      $ kubectl get no kubeadm-1 -o yaml > file.yaml; sed -i "s~192.168.1.0/24~10.1.0.0/16~" file.yaml; kubectl delete no kubeadm-1 && kubectl create -f file.yaml
      $ kubectl get no kubeadm-2 -o yaml > file.yaml; sed -i "s~192.168.2.0/24~10.2.0.0/16~" file.yaml; kubectl delete no kubeadm-2 && kubectl create -f file.yaml    
      

      我们必须为我们拥有的每个节点执行此操作。注意 IP 范围,它们从一个节点到另一个节点是不同的。

    5. 在 kubeadm-config ConfigMap 和 kube-controller-manager.yaml 上更改 CIDR

    编辑 kubeadm-config ConfigMap 并将 podSubnet 更改为新的 IP 范围:

    kubectl -n kube-system edit cm kubeadm-config
    

    另外,更改位于主节点的 /etc/kubernetes/manifests/kube-controller-manager.yaml 上的 --cluster-cidr

    $ sudo cat /etc/kubernetes/manifests/kube-controller-manager.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        component: kube-controller-manager
        tier: control-plane
      name: kube-controller-manager
      namespace: kube-system
    spec:
      containers:
      - command:
        - kube-controller-manager
        - --allocate-node-cidrs=true
        - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
        - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
        - --bind-address=127.0.0.1
        - --client-ca-file=/etc/kubernetes/pki/ca.crt
        - --cluster-cidr=10.0.0.0/8
        - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
        - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
        - --controllers=*,bootstrapsigner,tokencleaner
        - --kubeconfig=/etc/kubernetes/controller-manager.conf
        - --leader-elect=true
        - --node-cidr-mask-size=24
        - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
        - --root-ca-file=/etc/kubernetes/pki/ca.crt
        - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
        - --service-cluster-ip-range=10.96.0.0/12
        - --use-service-account-credentials=true
    
    1. 使用已禁用池中的 IP 重新创建所有现有工作负载。在此示例中,kube-dns 是 Calico 联网的唯一工作负载:

      kubectl delete pod -n kube-system kube-dns-6f4fd4bdf-8q7zp
      

      通过运行 calicoctl get wep --all-namespaces 检查新工作负载现在是否在新 IP 池中有地址:

      NAMESPACE     WORKLOAD                   NODE      NETWORKS            INTERFACE
      kube-system   kube-dns-6f4fd4bdf-8q7zp   vagrant   10.0.24.8/32   cali800a63073ed
      
    2. 删除旧IP池:

      calicoctl delete pool default-ipv4-ippool
      

    从头开始正确创建它

    要使用 Kubeadm 和 Calico 在特定 IP 范围下部署集群,您需要使用 --pod-network-cidr=192.168.0.0/24(其中 192.168.0.0/24 是您想要的范围)初始化集群,然后您需要在将 Calico 清单应用到您的新鲜的集群。

    要在申请前调整 Calico,您必须下载它的 yaml 文件并更改网络范围。

    1. 下载 Kubernetes 的 Calico 网络清单。
      $ curl https://docs.projectcalico.org/manifests/calico.yaml -O
      
    2. 如果您使用的是 pod CIDR 192.168.0.0/24,请跳到下一步。如果您使用不同的 pod CIDR,请使用以下命令设置名为 POD_CIDR 的环境变量,其中包含您的 pod CIDR,并将清单中的 192.168.0.0/24 替换为您的 pod CIDR。
      $ POD_CIDR="<your-pod-cidr>" \
      sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" calico.yaml
      
    3. 使用以下命令应用清单。
      $ kubectl apply -f calico.yaml
      

    【讨论】:

    • 如果我们最初按照上述步骤制作集群,后来意识到我们需要扩展范围以包含更多IP地址,有没有办法进行这种更改?我们是这样部署的,有上面提到的需求,不需要重建整个集群。
    • 我更新了我的答案,包括如何在不需要重建集群的情况下更改它的步骤。
    • 这对我来说很有意义。使用 10.0.0.0/16、10.1.0.0/16 和 10.2.0.0/16 可能是一个非常好的主意。
    • 我编辑了我的答案,包括您提到的要点以及 kubeadm-config ConfigMap 中的额外更改。
    • 我对示例中使用的 IP 范围感到困惑。 calico 中定义的 IP 池是 10.0.0.0/16,但是节点使用的是 10.1.0.0/16 和 10.2.0.0/16 - 这些 IP 不包括在 calico IP 池的范围内,那么它们是如何使用的对于 IP 范围的节点变量?你能确认上面的配置是正确的吗?
    猜你喜欢
    • 2019-05-08
    • 2018-12-10
    • 1970-01-01
    • 2019-08-19
    • 2018-11-02
    • 2020-12-10
    • 2017-10-26
    • 2020-08-05
    • 1970-01-01
    相关资源
    最近更新 更多