kubernetes Calico网络更改IP池
前言介绍
使用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