VPC-ENI指定子网分配IP(容器网络 v2)
概述
本文档介绍在 VPC-ENI 容器网络模式下,为 Pod 指定子网分配 IP 的使用方法。通过 PodSubnetTopologySpread,可以为不同业务应用的 Pod 规划并分配不同子网的 IP 地址。
说明:使用该功能需要联系百度智能云客服开启白名单。
前提条件
- 已准备容器网络 v2 版本的 VPC-ENI CCE 集群,并获取可写的集群凭证。
- 已在 百度智能云 VPC 控制台->子网选项卡 创建与 CCE 集群节点位于同一可用区的私有子网,并获取子网 ID。
- 固定 IP 和 IP 重用场景已准备专属子网,且该子网仅供当前 CCE 集群使用。
- 如需新建或扩容 CCE 集群,账号余额、权限和配额需满足创建要求。## 需求场景
场景 1:指定子网动态分配 IP
从与 Pod 匹配的子网拓扑约束策略关联的子网中动态为 Pod 分配 IP。匹配了子网拓扑约束策略(psts)的所有 Pod 只从策略包含的子网分配 IP 地址。
场景 2:手动分配 IP
手动分配 IP 策略的含义是给定一个 IP 列表,CCE 从这个 IP 列表中给 Pod 分配 IP。Pod 删除后 IP 地址保留,在 IP 地址过期之前,Pod 重建或者迁移后,IP 地址仍然不变。默认情况下,Pod 删除后,IP 地址会保留 7 天。
场景 3:固定 IP
固定 IP 策略的含义是给定一个 IP 列表,CCE 从这个 IP 列表中给有状态负载的 Pod 分配 IP。Pod 删除后 IP 地址保留,Pod 重建或者迁移后,IP 地址仍然不变。 无论 Pod 是否删除,已经分配的 IP 地址不会被释放,直到工作负载被删除后,IP 地址才会被回收。
方案概述
如下CRD数据结构所示,CCE提供了自定义CRD来指定Pod子网拓扑分布策略,用于在CCE集群中实施制定子网分配IP功能。
关键数据结构介绍
Pod子网拓扑分布 PodSubnetTopologySpread
子网拓扑分布对象是指定子网分配IP的核心工作对象,它的核心数据结构定义如下:
1apiVersion: cce.baidubce.com/v2
2kind: PodSubnetTopologySpread
3metadata:
4 name: your-psts
5 namespace: your-namespace
6spec:
7 name: your-psts
8 priority: 0
9 subnets:
10 sbn-your-subnet-id: []
11 strategy:
12 releaseStrategy: TTL
13 ttl: 168h0m0s
14 type: Elastic
15 selector:
16 matchLabels:
17 app: your-app
该对象的核心字段如下:
| 域 | 数据类型 | 必须 | 默认值 | 描述 |
|---|---|---|---|---|
name |
string |
拓扑分布对象名,在通过 PodSubnetTopologySpread 创建子网拓扑分布时必填。 |
||
priority |
int32 |
否 | 0 | 多个子网拓扑约束之间的优先级,数字越大,优先级越高。 |
selector |
object |
否 | 使用该条件对Pod做标签匹配,符合条件的Pod将在分配IP地址时使用该规则。如果selector为空,则同namespace下的所有Pod都匹配该规则。 |
|
subnets |
object |
是 | 策略要使用的子网。CCE会从这些子网中为Pod分配IP地址。 | |
subnets.[].family |
string |
是 | IP 地址协议族。取值 "4" 或 "6" |
|
subnets.[].range |
array |
是 | IP 地址范围 | |
subnets.[].range[].start |
string |
是 | 起始 IP 地址 | |
subnets.[].range[].end |
string |
是 | 结束 IP 地址 | |
strategy |
object |
是 | IP 地址使用和回收策略 | |
strategy.type |
string |
是 | Elastic | Elastic: 动态分配 IP 地址,可以使用任意工作负载; Fixed:永久固定 IP 地址,仅搭配 sts 工作负载使用;PrimaryENI:独占 ENI 专用 IP 地址 |
strategy.releaseStrategy |
string |
是 | TTL | IP 地址释放策略。 TTL: Pod 被删除后,IP 地址随时间过期。其中在动态 IP 分配模式下,Pod 删除后,IP 立刻回收。 开启 enableReuseIPAddress 时,默认 7 天回收。Never: 仅搭配 strategy.type: Fixed 使用,代表永不回收。 |
strategy.enableReuseIPAddress |
bool |
否 | false | 是否在 strategy.type: Elastic 的场景下开启 IP 重用。如开启 IP 重用,则在 IP 地址过期之前,如果有同名的 Pod 重复创建,则尽力去复用 IP,以达到类似固定 IP 的效果。 |
strategy.ttl |
string |
否 | 168h0m0s | 在开启 IP 地址重用时,Pod 删除后,保留 IP 的时间。默认值是 7 天(168h0m0s) |
使用限制
- 该功能需使用VPC的ENI跨子网分配IP功能,请提交工单申请使用ENI跨子网分配IP功能。
kube-system命名空间的Pod无法使用指定子网分配IP功能。- 在使用
ipRange功能时,请确保指定的IP范围不包括特殊IP地址,如IPv4的网络地址、网关地址、广播地址和多播地址。包含这些特殊地址可能会导致IP分配出现问题。 - 指定子网的Pod只能调度到子网所在可用区的节点,请确认可用区有Ready状态的节点。
- 固定IP和IP复用场景下只能使用专属子网(指定的子网只能供单个CCE集群使用),专属子网不支持变更为普通子网、不支持从集群内删除,详情见专属子网说明。
- 该功能仅适用于容器网络 v2 版本的集群。
专属子网: 当用户需要为Pod分配指定子网下的某几个IP时,IP所属的子网将自动被标记为手动分配IP模式。手动分配IP模式下的子网有以下特征:
- 专属子网应为当前CCE集群专属,CCE会自动为子网增加专属标签,其它的CCE集群拒绝使用该子网。(用户可以操作百度云其它产品使用该子网)
- 对专属子网仅支持手动分配IP,不会自动分配IP。这需要用户自己管理IP地址规划
- 专属子网下IP和Pod的关系可以有优先分配和固定绑定两种。固定绑定策略使用Pod名作为绑定标识,同一个Pod名的IP地址相同
- 集群Pod的默认子网不能是专属子网,否则可能导致集群中的其它Pod无法正常分配IP
- 专属子网不支持变更为普通子网、不支持从集群内删除
配置步骤
环境准备
创建私有子网
在百度智能云VPC控制台->子网选项卡,为自己的VPC新建一个子网,并保存子网ID (以sbn-xxx格式命名的是子网ID)。注意创建子网时应选择与CCE集群节点相关的可用区,否则可能导致调度失败。
说明: 如需使用ENI跨子网分配IP功能,请提交工单申请。
在 CCE 上操作指定子网分配 IP
以下操作需在已配置目标集群凭证的终端执行。
场景 1:指定子网动态分配 IP
操作入口:已配置目标集群凭证的终端。
从与Pod匹配的子网拓扑约束策略关联的子网中动态为Pod分配IP。匹配了子网拓扑约束策略(psts)的所有Pod只从策略包含的子网分配IP地址。
适用场景:
- 以子网维度对流量做统计
- 以子网维度做安全策略,如ACL规则控制
- 通过NAT网关为特定子网开启互联网访问
- 创建
psts。
1apiVersion: cce.baidubce.com/v2
2kind: PodSubnetTopologySpread
3metadata:
4 name: your-psts
5 namespace: your-namespace
6spec:
7 priority: 0
8 name: your-psts
9 strategy:
10 releaseStrategy: TTL
11 type: Elastic
12 subnets:
13 sbn-your-subnet-id-1: []
14 sbn-your-subnet-id-2: []
15 selector:
16 matchLabels:
17 app: your-app
- 创建工作负载。
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: your-deployment
5 namespace: your-namespace
6spec:
7 replicas: 1
8 selector:
9 matchLabels:
10 app: your-app
11 template:
12 metadata:
13 labels:
14 app: your-app
15 spec:
16 containers:
17 - image: nginx
18 name: nginx
- 验证 IP 分配结果。
1kubectl get pod <pod-name> -o yaml
1apiVersion: v1
2kind: Pod
3metadata:
4 annotations:
5 cce.baidubce.com/PodSubnetTopologySpread: your-psts
6 labels:
7 app: your-app
8 name: <pod-name>
9 namespace: your-namespace
10spec:
11 affinity:
12 nodeAffinity:
13 requiredDuringSchedulingIgnoredDuringExecution:
14 nodeSelectorTerms:
15 - matchExpressions:
16 - key: topology.kubernetes.io/zone
17 operator: In
18 values:
19 - <zone-name>
20 containers:
21 - image: nginx
22 imagePullPolicy: IfNotPresent
23 name: nginx
24 resources:
25 limits:
26 cce.baidubce.com/ip: "1"
27 requests:
28 cce.baidubce.com/ip: "1"
场景 2:手动分配 IP
操作入口:已配置目标集群凭证的终端。 手动分配 IP 策略的含义是给定一个IP列表,CCE从这个IP列表中给 Pod 分配 IP 。Pod 删除后 IP 地址保留,在 IP 地址过期之前,Pod重建或者迁移后,IP地址仍然不变。默认情况下,Pod 删除后,IP 地址会保留 7 天。
适用场景:
- 固定Pod IP,要求Pod迁移后IP支持不变
- 使用专属子网,并完全手动管理该子网的IP
- Pod 多次重建后名字不变,例如使用有状态工作负载(
apps/v1 StatefulSet)创建的 Pod
- 创建
psts。
1apiVersion: cce.baidubce.com/v2
2kind: PodSubnetTopologySpread
3metadata:
4 name: your-psts
5 namespace: your-namespace
6spec:
7 priority: 0
8 subnets:
9 sbn-your-dedicated-subnet-id:
10 - family: 4
11 range:
12 - start: <start-ip>
13 end: <end-ip>
14 strategy:
15 releaseStrategy: TTL
16 ttl: 168h0m0s
17 type: Elastic
18 enableReuseIPAddress: true
19 selector:
20 matchLabels:
21 workloadType: sts
22 fixedIP: "true"
23 app: your-app
- 创建工作负载。
1apiVersion: apps/v1
2kind: StatefulSet
3metadata:
4 name: your-statefulset
5 namespace: your-namespace
6spec:
7 replicas: 1
8 selector:
9 matchLabels:
10 app: your-app
11 serviceName: your-service
12 template:
13 metadata:
14 labels:
15 workloadType: sts
16 fixedIP: "true"
17 app: your-app
18 spec:
19 containers:
20 - image: nginx
21 name: nginx
- 验证 IP 分配结果。
1kubectl get pod <pod-name> -o yaml
1apiVersion: v1
2kind: Pod
3metadata:
4 annotations:
5 cce.baidubce.com/PodSubnetTopologySpread: your-psts
6 labels:
7 app: your-app
8 name: <pod-name>
9 namespace: your-namespace
10spec:
11 affinity:
12 nodeAffinity:
13 requiredDuringSchedulingIgnoredDuringExecution:
14 nodeSelectorTerms:
15 - matchExpressions:
16 - key: topology.kubernetes.io/zone
17 operator: In
18 values:
19 - <zone-name>
20 containers:
21 - image: nginx
22 imagePullPolicy: IfNotPresent
23 name: nginx
24 resources:
25 limits:
26 cce.baidubce.com/ip: "1"
27 requests:
28 cce.baidubce.com/ip: "1"
场景 3:固定 IP
操作入口:已配置目标集群凭证的终端。 固定 IP 策略的含义是给定一个IP列表,CCE从这个IP列表中给有状态负载的Pod分配IP。Pod删除后IP地址保留,Pod重建或者迁移后,IP地址仍然不变。 无论 Pod 是否删除,已经分配的IP地址不会被释放,直到工作负载被删除后,IP 地址才会被回收。
适用场景:
- 指定的子网必须是单个CCE集群使用,且该子网不再用于动态分配IP地址(子网会被CCE标记为专属子网)。
- 以IP地址为维度做安全策略,如以子网维度制定ACL。
- 仅适用于有状态工作负载(
apps/v1 StatefulSet)创建的 Pod。
- 创建
psts。
1apiVersion: cce.baidubce.com/v2
2kind: PodSubnetTopologySpread
3metadata:
4 name: your-psts
5 namespace: your-namespace
6spec:
7 subnets:
8 sbn-your-dedicated-subnet-id:
9 - family: 4
10 range:
11 - start: <start-ip>
12 end: <end-ip>
13 strategy:
14 releaseStrategy: Never
15 type: Fixed
16 enableReuseIPAddress: true
17 selector:
18 matchLabels:
19 workloadType: sts
20 fixedIP: "true"
21 app: your-app
- 创建工作负载。
1apiVersion: apps/v1
2kind: StatefulSet
3metadata:
4 name: your-statefulset
5 namespace: your-namespace
6spec:
7 replicas: 1
8 selector:
9 matchLabels:
10 app: your-app
11 serviceName: your-service
12 template:
13 metadata:
14 labels:
15 workloadType: sts
16 fixedIP: "true"
17 app: your-app
18 spec:
19 containers:
20 - image: nginx
21 name: nginx
- 验证 IP 分配结果。
1kubectl get pod <pod-name> -o yaml
1apiVersion: v1
2kind: Pod
3metadata:
4 annotations:
5 cce.baidubce.com/PodSubnetTopologySpread: your-psts
6 labels:
7 app: your-app
8 name: <pod-name>
9 namespace: your-namespace
10spec:
11 affinity:
12 nodeAffinity:
13 requiredDuringSchedulingIgnoredDuringExecution:
14 nodeSelectorTerms:
15 - matchExpressions:
16 - key: topology.kubernetes.io/zone
17 operator: In
18 values:
19 - <zone-name>
20 containers:
21 - image: nginx
22 imagePullPolicy: IfNotPresent
23 name: nginx
24 resources:
25 limits:
26 cce.baidubce.com/ip: "1"
27 requests:
28 cce.baidubce.com/ip: "1"
相关产品
评价此篇文章
