如何在 Kubernetes 集群中修改 Pod CIDR 范围及合理规划集群大小

在 Kubernetes 集群中,Pod CIDR 范围用于指定分配给 Pod 的 IP 地址段。在某些情况下,可能需要修改集群的 Pod CIDR 范围,例如为了适应新的网络规划或拓展集群的 IP 地址池。此外,合理规划集群大小以及配置相关的网络参数(如 --cluster-cidr--node-cidr-mask-size)对于集群的可扩展性和性能至关重要。

本篇文章将介绍如何通过修改 kubeadm-configkube-controller-manager 配置来修改 Pod CIDR 范围,同时讲解如何判断和合理规划集群大小,设置 --cluster-cidr--node-cidr-mask-size 的值。

1. 背景介绍

Kubernetes 使用 kubeadm 来初始化集群。默认情况下,Pod CIDR 配置会在 kubeadm 初始化过程中设置,并存储在集群的 kubeadm-config ConfigMap 中。如果集群已经创建并在运行,你可能需要调整网络配置以扩展或改变 Pod CIDR 范围。

2. Pod CIDR 的作用

Pod CIDR 范围是 Kubernetes 集群中分配给 Pod 的 IP 地址范围。这个配置在以下几个方面起着关键作用:

  • CNI 插件:如 Calico、Weave 等网络插件会根据 podSubnet 配置来分配 Pod 的 IP 地址。
  • 集群网络策略:控制器会依据 podSubnet 配置管理集群内的网络流量。
  • Pod 调度:Pod 的 IP 地址需要与控制平面中的调度策略保持一致。

如果你修改了 Pod CIDR 范围,需要确保集群中的所有相关组件都同步更新配置,以避免网络不一致的问题。

3. 修改 Pod CIDR 范围的步骤

以下是通过修改 kubeadm-configkube-controller-manager 配置来修改 Pod CIDR 范围的步骤。这个方法适用于已经运行的 Kubernetes 集群,无需重新初始化。

3.1 修改 kubeadm-config ConfigMap

kubeadm-config ConfigMap 存储了集群的配置,包括 Pod CIDR 信息。你需要修改 podSubnet 配置,来指定新的 Pod CIDR 范围。

  1. 查看当前配置
    运行以下命令,查看 kubeadm-config ConfigMap 中的当前配置:

    kubectl get configmap kubeadm-config -n kube-system -o yaml
    

    找到 ClusterConfiguration 配置中的 podSubnet 项:

    apiVersion: v1
    data:
      ClusterConfiguration: |
        apiVersion: kubeadm.k8s.io/v1beta3
        kind: ClusterConfiguration
        networking:
          podSubnet: "192.168.0.0/16"  # 修改为你需要的 CIDR
    
  2. 编辑 ConfigMap
    你可以通过以下命令编辑 kubeadm-config 配置:

    kubectl edit configmap kubeadm-config -n kube-system
    

    ClusterConfiguration 中修改 podSubnet 为新的 CIDR 范围。

3.2 修改 kube-controller-manager 配置

kube-controller-manager 控制器负责管理 Pod 和服务的生命周期,它需要知道新的 Pod CIDR 范围。你需要更新 kube-controller-manager 部署的启动参数,添加或修改 --cluster-cidr 参数。

  1. 编辑 kube-controller-manager 部署
    运行以下命令编辑 kube-controller-manager 的配置或直接editpod:

    vim /etc/kubernetes/manifests/kube-controller-manager.yaml
    
  2. 更新启动参数
    spec.containers.args 部分,添加或修改 --cluster-cidr 参数,确保它与新的 Pod CIDR 配置一致:

    spec:
      containers:
      - name: kube-controller-manager
        command:
        - /bin/kube-controller-manager
        - --cluster-cidr=192.168.0.0/16  # 修改为新的 CIDR
    
  3. 保存并退出
    保存文件并退出编辑器,Kubernetes 会自动更新 kube-controller-manager 配置。

3.5 修改node资源的podcidr

   $ kubectl get node <nodename> -oyaml > <nodename>.yaml
   # 修改<nodename>.yaml中.spec.podCIDR和.spec.podCIDRs的配置,分配一个未使用的地址段
   $ kubectl delete node <nodename>
   $ kubectl apply -f <nodename>.yaml

3.4 更新节点上的 kubelet 配置

在每个工作节点(Node)上,kubelet 需要使用新的 Pod CIDR 来管理 Pod 网络。如果你在启动时传递了 --pod-cidr 参数,你需要更新该参数。

  1. 检查 kubelet 启动参数
    使用以下命令查看 kubelet 的启动参数:

    ps -ef | grep kubelet
    

    或者,检查 systemd 的配置文件(通常是 10-kubeadm.conf),确保包含 --pod-cidr 参数。

  2. 更新启动参数
    如果你找到了 --pod-cidr 参数,直接修改为新的 CIDR 范围。修改后,重载 systemd 配置并重启 kubelet 服务:

    sudo systemctl daemon-reload
    sudo systemctl restart kubelet
    

3.5 更新网络插件配置

如果你使用的是网络插件(如 Calico、Flannel 等),需要根据新的 CIDR 范围更新插件的配置。

例如,对于 Calico 插件,你需要修改 calicoctl--ip-pool 参数,确保它与新的 CIDR 范围一致。不同的网络插件配置方式有所不同,请参考相关插件的文档进行配置。

4. 合理规划集群大小

在规划 Kubernetes 集群时,合理选择 --cluster-cidr--node-cidr-mask-size 的值是确保集群可扩展性和高效性的关键。

4.1 如何选择 --cluster-cidr--node-cidr-mask-size

  • --cluster-cidr:此参数定义了整个集群中 Pod 网络的 IP 范围。它指定了所有 Pod 的 IP 地址池。例如,192.168.0.0/16 为集群内的所有 Pod 提供一个 65536 个 IP 地址的池。

    • 选择合适的 --cluster-cidr 范围非常重要,因为它直接影响集群的可扩展性。一般来说,选择一个足够大的 CIDR 范围来确保未来能够容纳更多的 Pod。例如,如果你的集群预计有 10,000 个节点和每个节点最多 110 个 Pod,那么你需要足够大的 CIDR 范围(如 10.0.0.0/8)来容纳这么多 Pod。

4.2 --node-cidr-mask-size 的作用

  • --node-cidr-mask-size:此参数指定每个节点分配给它的 Pod 网络的子网掩码。通常,--node-cidr-mask-size 的默认值为 24,即每个节点可以最多支持 256 个 Pod。如果你选择 --node-cidr-mask-size=24,则每个节点的 Pod 网络将是一个 /24 子网,从而最多有 256 个 Pod 地址。

    • 合理选择 --node-cidr-mask-size:如果你的节点上预计会有更多的 Pod,你可以调整该值以扩大每个节点的 IP 地址池。例如,选择 --node-cidr-mask-size=23 可以让每个节点最多支持 512 个 Pod。

4.3 如何规划集群大小

  • 计算集群的大小时,考虑以下因素:

    • 预计节点数
    • 每个节点上的 Pod 数量
    • 集群规模的增长
    • 网络插件的性能和限制

    比如,假设你的集群预计有 1000 个节点,每个节点上最多运行 200 个 Pod,那么:

    • 你需要为每个节点分配一个足够大的 IP 范围,可以选择 --node-cidr-mask-size=23,使每个节点支持最多 512 个 Pod。
    • --cluster-cidr 应该至少为 192.168.0.0/16 或更大,确保集群中所有 Pod 都能获得唯一的 IP 地址。

5. 验证配置

完成以上修改后,验证新的 Pod CIDR 是否生效:

  1. 检查节点 IP 地址
    使用以下命令查看每个节点的 Pod IP 地址范围是否已更新:

    kubectl get nodes -o wide
    kubectl get nodes -ojsonpath="{range .items[*]}{.metadata.name}{'\t'}{.spec.podCIDR}{'\n'}{end}"
    
  2. 检查 Pod 网络
    创建一些新的 Pod,并验证它们的 IP 地址是否位于新的 CIDR 范围内。

    kubectl get pods