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
posted @ 2020-03-28 15:34  老村长de  阅读(3220)  评论(0编辑  收藏  举报