前言
共享网卡非固定 IP 模式的集群移除子网需严格按此项流程操作,如果 Pod 仍在使用子网就移除了子网,那么会影响后续新增 Pod IP 分配,即便分配其他子网也会受到影响。如果移除后,发现仍有 Pod 在使用,需尽快重建 Pod 到其他子网。
如何确定集群网络类型
操作步骤如下:
1. 登录 容器服务控制台,选择左侧导航中的集群。
2. 在集群页面,选择目标集群名称,进入集群详情页,查看集群基础信息下的节点和网络信息。
3. 查看容器网络插件是否为 VPC-CNI 共享网卡多 IP 以及是否固定 Pod IP 为否。

如何确定 eniipamd 组件版本
操作步骤如下:
1. 登录 容器服务控制台,选择左侧导航中的集群。
2. 在集群页面,选择目标集群名称,进入集群详情页。
3. 选择左侧导航栏中的组件管理,在组件页面查看 eniipamd 组件版本。

查看集群内是否有网卡使用待移除子网
首先通过子网 ID 确定子网对应 CIDR:
1. 在集群详情页面,查看集群基础信息下的节点和网络信息。
2. 在容器子网一栏确认待移除子网的 CIDR。

通过如下命令查找该子网内的网卡信息:
kubectl get nec -ocustom-columns=Name:.metadata.name,eni:.status.eniInfos | grep <CIDR>
禁止在子网中分配 IP
操作步骤如下:
1. 登录 容器服务控制台,选择左侧导航中的集群。
2. 在集群页面,选择目标集群名称,进入集群详情页。
3. 选择左侧导航栏中的组件管理,在组件页面选择 eniipamd 组件右侧的修改全局配置。

4. 将待删除的子网 ID 添加到 “ipam.onlyNominatedEniSubnets” 列表中。修改后保存并退出。

释放子网内的存量 IP
存量 IP 的释放涉及到 IP 地址的解绑以及弹性网卡的清理,当前有如下两种方式进行释放:
Pod 迁移释放:封锁并驱逐使用了目标子网内弹性网卡的所有节点,将这些节点上的 Pod 迁移到其他节点。清理被封锁节点用到的弹性网卡之后,将这些节点解封锁。
Pod 原地释放:通过命令查找出集群中所有目标子网内的弹性网卡,并删除对应的 VpcIP 资源,随后将目标子网内的 Pod 进行重建。
警告:
eniipamd 组件版本在 3.5.3 及以下的集群如果采用 Pod 原地释放的方式释放存量 IP,则在删除 VpcIP 资源后,目标子网内的 Pod 会立即断网。
Pod 迁移释放
封锁所有目标网段内的节点
使用如下命令查找目标网段内的网卡以及节点名称:
kubectl get nec -ocustom-columns=Name:.metadata.name,eni:.status.eniInfos | grep <CIDR>
该命令的执行输出示例如下:
10.0.0.111 [map[eniID:eni-fkvhcqky mac:20:90:6F:E9:B9:D5 primaryIP:10.0.0.63 securityGroups:[sg-205mc63l] subnetCIDR:10.0.0.0/24]]
其中第一列对应的即为节点名称。节点名称之后的 primaryIP 对应弹性网卡的主 IP 地址。
使用如下的命令对相关的节点进行封锁:
kubectl cordon <nodeName> # 如上方示例图中检索到的节点名称为 10.0.0.111
在集群中添加新节点
操作步骤如下:
1. 登录 容器服务控制台,选择左侧导航中的集群。
2. 在集群页面,选择目标集群名称,进入集群详情页。
3. 在左侧导航栏中选择节点管理,在节点管理页面新建节点池或者在已有节点池中添加节点。
驱逐目标网段内的网卡所在的节点
使用以下命令驱逐已封锁的节点:
kubectl drain <nodeName>
清理弹性网卡
执行以下命令,删除弹性网卡主 IP 对应的 VpcIP 资源,以触发弹性网卡自动清理:
kubectl delete vip <primaryIP>
恢复节点
执行以下命令,将节点恢复为可调度状态:
kubectl uncordon <nodeName>
Pod 原地释放
查询并清理目标网段内的弹性网卡
通过以下命令查询目标网段内的所有弹性网卡对应的 primaryIP:
kubectl get nec -ocustom-columns=Name:.metadata.name,eni:.status.eniInfos | grep <CIDR> # <CIDR> 填写目标网段 CIDR
使用以下命令删除查询到的所有 primaryIP 对应的 VpcIP 资源,进而触发弹性网卡的释放:
kubectl delete vip <primaryIP>
警告:
eniipamd 组件版本在 3.5.3 及以下的集群如果采用 Pod 原地释放的方式释放存量 IP,则在删除 VpcIP 资源后,目标子网内的 Pod 会立即断网。
查询并重建所有目标网段内的 Pod
确认待删除子网的 CIDR,例如
21.9.32.0/19,其 IP 范围为 21.9.32.0 - 21.9.63.255,对应的正则表达式为 "21\\.9\\.(3[2-9]|[4-5][0-9]|6[0-3])"。使用以下命令检索目标网段内的所有 Pod:
# 查询所有目标网段的 Podkubectl get pod -owide -A | grep -E "21\\.9\\.(3[2-9]|[4-5][0-9]|6[0-3])"
从集群配置中移除子网
确认所有子网内的 IP 都释放后,可以移除子网。
操作步骤如下:
1. 登录 容器服务控制台,选择左侧导航中的集群。
2. 在集群页面,选择目标集群名称,进入集群详情页。
3. 选择左侧导航栏中的组件管理,在组件页面选择 eniipamd 组件右侧的修改全局配置。
4. 将待删除的子网 ID 从
ipam.subnetIds 以及 ipam.onlyNominatedEniSubnets 列表中移除。修改后保存并退出。