前言介紹
使用Calico IPAM時,會為每個工作負載分配一個來自所選IP地址池的地址。您可能希望修改正在運行的集群的IP池的CIDR,原因如下:
遷移到可以容納更多工作負載的更大CIDR,離開意外使用的CIDR。本頁的目的提供有關如何在正在運行的群集上從一個IP池CIDR更改為另一個IP池的指導。
先決條件
本文檔僅適用於使用Calico IPAM的情況。雖然Calico支持更改IP池,但並非所有orchestrator都支持。請務必查閱您正在使用的文檔,以確保它支持更改工作負載CIDR。
例如,在Kubernetes中,以下所有三個參數必須等於或包含Calico IP池CIDR:
KUBE-API服務器: --pod-network-cidr
KUBE-代理: --cluster-cidr
KUBE-控制器經理: --cluster-cidr
注意:此過程將需要重新創建所有Calico網絡工作負載,這將對您的應用程序的可用性產生一些影響。在不遵循此遷移過程的情況下刪除IP池可能會導致任何正在運行的工作負載中的網絡連接中斷,其中包含來自該IP池的地址。即:
1.如果在IP池上啟用了IP-in-IP或VXLAN,則這些工作負載將不再封裝其流量。
2.如果在IP池上啟用了nat-outgoing,則這些工作負載將不再具有NAT'd流量。
如果使用Calico BGP路由,將不再聚合到pod的路由。更改IP池基本流程如下:
1.添加新的IP池。
2.禁用舊的IP池。這可以防止舊IP池中的新IPAM分配,而不會影響現有工作負載的網絡連接。
3.重新創建從舊IP池分配地址的所有現有工作負載。
4.刪除舊的IP池。
示例:
在此示例中,我們使用kubeadm創建了一個集群。我們希望pod在一定范圍內使用IP, 因此我們在運行時設置kubeadm init的時候使用的地址是10.0.0.0/16 如:(--pod-network-cidr=10.0.0.0/16)。但是,我們在沒有設置默認IP池的情況下安裝了Calico。運行calicoctl get ippool -o wide顯示Calico創建了其默認IP池192.168.0.0/16:
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED
default-ipv4-ippool 192.168.0.0/16 true Always Never false
根據輸出calicoctl get wep --all-namespaces,我們看到kube-dns已經從錯誤的范圍分配了一個地址:
NAMESPACE WORKLOAD NODE NETWORKS INTERFACE
kube-system kube-dns-6f4fd4bdf-8q7zp vagrant 192.168.52.130/32 cali800a63073ed
開始更改
1.添加新的IP池:
1 calicoctl create -f -<<EOF 2 apiVersion: projectcalico.org/v3 3 kind: IPPool 4 metadata: 5 name: new-pool 6 spec: 7 cidr: 10.0.0.0/16 8 ipipMode: Always 9 natOutgoing: true 10 EOF
我們現在應該有兩個啟用的IP池,我們可以在運行時看到,查看命令:calicoctl get ippool -o wide
1 NAME CIDR NAT IPIPMODE DISABLED 2 default-ipv4-ippool 192.168.0.0/16 true Always false 3 new-pool 10.0.0.0/16 true Always false
2.禁用舊的IP池,首先將IP池定義保存到磁盤:
1 calicoctl get ippool -o yaml > pool.yaml
pool.yaml 文件內容:
1 apiVersion: projectcalico.org/v3 2 items: 3 - apiVersion: projectcalico.org/v3 4 kind: IPPool 5 metadata: 6 name: default-ipv4-ippool 7 spec: 8 cidr: 192.0.0.0/16 9 ipipMode: Always 10 natOutgoing: true 11 - apiVersion: projectcalico.org/v3 12 kind: IPPool 13 metadata: 14 name: new-pool 15 spec: 16 cidr: 10.0.0.0/16 17 ipipMode: Always 18 natOutgoing: true
注意:已經編輯了一些額外的特定於群集的信息以提高可讀性,編輯文件,添加disabled: true到default-ipv4-ippoolIP池:
1 apiVersion: projectcalico.org/v3 2 kind: IPPool 3 metadata: 4 name: default-ipv4-ippool 5 spec: 6 cidr: 192.0.0.0/16 7 ipipMode: Always 8 natOutgoing: true 9 disabled: true
應用更改:
1 calicoctl apply -f pool.yaml
我們可以看到產生了一下變化,查看命令:
1 calicoctl get ippool -o wide 2 NAME CIDR NAT IPIPMODE DISABLED 3 default-ipv4-ippool 192.168.0.0/16 true Always true 4 new-pool 10.0.0.0/16 true Always false
使用禁用池中的IP重新創建所有現有工作負載。在此示例中,kube-dns是Calico聯網的唯一工作負載:
1 kubectl delete pod -n kube-system kube-dns-6f4fd4bdf-8q7zp
通過運行以下命令檢查新工作負載現在是否在新IP池中具有地址:
1 calicoctl get wep --all-namespaces 2 NAMESPACE WORKLOAD NODE NETWORKS INTERFACE 3 kube-system kube-dns-6f4fd4bdf-8q7zp vagrant 10.0.24.8/32 cali800a63073ed
刪除舊的IP池:
1 calicoctl delete pool default-ipv4-ippool