如何在使用 kubeadm 部署的 kubernetes 集群中扩大 pod CIDR 范围?
How to make the pod CIDR range larger in kubernetes cluster deployed with kubeadm?
我部署了添加了 --pod-network-cidr 的集群,并使用 calicoctl 将 pods 更改为此范围创建了新的 ip 池。我遇到的问题正是我需要在 kubernetes 方面进行更改以更改 pod cidr 范围?我是在 API 服务器、控制器管理器和调度程序中进行更改,还是只需要更改特定部分。我只尝试更改控制器管理器,并且那些控制平面 pods 在更改 yaml 中的 --cluster-cidr 后进入崩溃循环。
controller-manager 日志中的输出如下?
controllermanager.go:235] 启动控制器时出错:无法将 idx [0] 处的 cidr[192.168.0.0/24] 标记为节点占用::cidr 192.168.0.0/24 超出范围集群 cidr 10.0.0.0/16
更改集群 CIDR 不是一项简单的任务。我设法重现了您的场景,并设法使用以下步骤对其进行了更改。
更改 IP 池
过程如下:
- 将 calicoctl 安装为 Kubernetes pod (Source)
- 添加新的 IP 池 (Source)。
- 禁用旧 IP 池。这可以防止从旧 IP 池分配新的 IPAM,而不会影响现有工作负载的网络。
- 更改节点
podCIDR
参数(Source)
- 在主节点上
kube-controller-manager.yaml
上更改 --cluster-cidr
。 (感谢 OP)
- 重新创建从旧 IP 池分配地址的所有现有工作负载。
- 删除旧 IP 池。
让我们开始吧。
在这个例子中,我们要将 192.168.0.0/16
替换为 10.0.0.0/8
。
- 将 calicoctl 安装为 Kubernetes pod
$ kubectl apply -f https://docs.projectcalico.org/manifests/calicoctl.yaml
设置别名:
$ alias calicoctl="kubectl exec -i -n kube-system calicoctl -- /calicoctl "
添加新 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
禁用旧 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
Note: Some extra cluster-specific information has been redacted to improve readibility.
编辑文件,将 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
更改节点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 范围,它们在一个节点与另一个节点之间是不同的。
更改 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
使用禁用池中的 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
删除旧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 文件并更改网络范围。
- 下载 Kubernetes 的 Calico 网络清单。
$ curl https://docs.projectcalico.org/manifests/calico.yaml -O
- 如果您使用的是 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
- 使用以下命令应用清单。
$ kubectl apply -f calico.yaml
我部署了添加了 --pod-network-cidr 的集群,并使用 calicoctl 将 pods 更改为此范围创建了新的 ip 池。我遇到的问题正是我需要在 kubernetes 方面进行更改以更改 pod cidr 范围?我是在 API 服务器、控制器管理器和调度程序中进行更改,还是只需要更改特定部分。我只尝试更改控制器管理器,并且那些控制平面 pods 在更改 yaml 中的 --cluster-cidr 后进入崩溃循环。
controller-manager 日志中的输出如下?
controllermanager.go:235] 启动控制器时出错:无法将 idx [0] 处的 cidr[192.168.0.0/24] 标记为节点占用::cidr 192.168.0.0/24 超出范围集群 cidr 10.0.0.0/16
更改集群 CIDR 不是一项简单的任务。我设法重现了您的场景,并设法使用以下步骤对其进行了更改。
更改 IP 池
过程如下:
- 将 calicoctl 安装为 Kubernetes pod (Source)
- 添加新的 IP 池 (Source)。
- 禁用旧 IP 池。这可以防止从旧 IP 池分配新的 IPAM,而不会影响现有工作负载的网络。
- 更改节点
podCIDR
参数(Source) - 在主节点上
kube-controller-manager.yaml
上更改--cluster-cidr
。 (感谢 OP) - 重新创建从旧 IP 池分配地址的所有现有工作负载。
- 删除旧 IP 池。
让我们开始吧。
在这个例子中,我们要将 192.168.0.0/16
替换为 10.0.0.0/8
。
- 将 calicoctl 安装为 Kubernetes pod
设置别名:$ kubectl apply -f https://docs.projectcalico.org/manifests/calicoctl.yaml
$ alias calicoctl="kubectl exec -i -n kube-system calicoctl -- /calicoctl "
添加新 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
禁用旧 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
Note: Some extra cluster-specific information has been redacted to improve readibility.
编辑文件,将
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
更改节点
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 范围,它们在一个节点与另一个节点之间是不同的。
更改 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
使用禁用池中的 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
删除旧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 文件并更改网络范围。
- 下载 Kubernetes 的 Calico 网络清单。
$ curl https://docs.projectcalico.org/manifests/calico.yaml -O
- 如果您使用的是 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
- 使用以下命令应用清单。
$ kubectl apply -f calico.yaml