3

我部署了添加了 --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 的范围

4

1 回答 1

10

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

更改 IP 池

过程如下:

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

让我们开始吧。

在本例中,我们将替换192.168.0.0/1610.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: truedefault-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 源范围覆盖podCIDR特定 k8s 节点资源上的参数,使用以下命令的理想方式:

    $ 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

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

$ 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
    

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

    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/24192.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
    
于 2020-02-12T09:40:15.447 回答