IP 池使用¶
IP 池(IPPool)是比子网(Subnet)更细粒度的 IPAM 管理单元。你可以通过 IP 池将子网网段细分为多个单元,每个单元绑定到特定的命名空间(Namespace)或者 Workload 之上。
使用方法¶
使用示例:
apiVersion: kubeovn.io/v1
kind: IPPool
metadata:
name: pool-1
spec:
subnet: ovn-default
ips:
- "10.16.0.201"
- "10.16.0.210/30"
- "10.16.0.220..10.16.0.230"
namespaces:
- ns-1
enableAddressSet: true
绑定到特定 Workload:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ippool
labels:
app: ippool
spec:
replicas: 2
selector:
matchLabels:
app: ippool
template:
metadata:
labels:
app: ippool
annotations:
ovn.kubernetes.io/ip_pool: pool-1
spec:
containers:
- name: ippool
image: docker.io/library/nginx:alpine
使用命名 IP 池¶
当 ovn.kubernetes.io/ip_pool 的值是 IPPool 名称(例如 pool-1)时,默认网络的 Pod 可以不设置 ovn.kubernetes.io/logical_switch。控制器会使用 pool-1.spec.subnet 作为 Pod 的子网, 并设置 Pod 的 logical_switch、cidr 和 gateway 注解:
metadata:
annotations:
ovn.kubernetes.io/ip_pool: pool-1
如果显式设置 ovn.kubernetes.io/logical_switch,应确保它与 IPPool.spec.subnet 一致; 子网不一致未必会被拒绝。
对于多网卡 Pod,可以使用 <provider>.kubernetes.io/ip_pool 为指定 provider 选择命名 IP 池。provider 的子网独立于 IPPool 选择;应确保两者一致,包括显式设置 <provider>.kubernetes.io/logical_switch 时。子网不一致未必会被拒绝。值为单个 IP、 逗号分隔的 IP 列表,或每组 IPv4、IPv6 地址以逗号配对且各组以分号分隔的双栈列表时, 仍按固定 IP 注解处理,而不是按 IPPool 名称解析。
spec.namespaces 指定该 IPPool 可参与自动选池的命名空间,不限制显式指定该 IPPool 的 Pod。 列表为空时不会自动选择该池。普通 Pod 删除后,其地址会释放,IPPool 的使用计数也会更新; StatefulSet 和 VM 的 Pod 可能保留地址,直到所属 Workload 被删除。
字段说明:
| 名称 | 用途 | 备注 |
|---|---|---|
| subnet | 指定所属子网 | 必填 |
| ips | 指定包含的 IP 范围 | 支持 |
| ipCount | 自动选取的地址数量 | 可选,范围 1-32。从子网空闲地址中自动选取指定数量的地址,双栈子网会同时选取等量的 IPv4 和 IPv6 地址。选取的地址会记录在 status.ips 中,增大的值追加地址,减小值会释放最近添加的地址。与 ips 互斥。 |
| namespaces | 绑定命名空间 | 可选。列出该 IPPool 可参与自动选池的命名空间,不限制显式指定该池的 Pod。 |
| enableAddressSet | 是否自动创建同名的 AddressSet | 默认 false,设置为 true 后 ACL 和策略路由可以使用对应 AddressSet 进行策略控制 |
使用 ipCount 自动选取地址¶
当不需要精确指定 IP 范围时,可以使用 ipCount 让控制器从子网空闲地址中自动选取:
apiVersion: kubeovn.io/v1
kind: IPPool
metadata:
name: pool-auto
spec:
subnet: ovn-default
ipCount: 5
namespaces:
- ns-1
控制器会选取 5 个空闲地址并记录在 status.ips 中。增大 ipCount 会追加地址,减小会释放最近添加的地址。删除 IPPool 时所有地址会被释放。
注意事项¶
- 为保证与 Workload 通用 IP Pool 固定地址 的兼容性,IP 池的名称不能是一个 IP 地址。
- IP 池的
.spec.ips可指定超出子网范围的 IP 地址,但实际有效的 IP 地址是.spec.ips与子网 CIDR 的交集。 - 同一个子网的不同 IP 池,不能包含相同的(有效)IP 地址。
- IP 池的
.spec.ips可动态修改。 - IP 池会继承子网的保留 IP,从 IP 池随机分配 IP 地址时,会跳过包含在 IP 池中的保留 IP。
- 从子网随机分配 IP 地址时,只会从子网所有 IP 池以外的范围分配。
- 多个 IP 池可以绑定同一个 Namespace。
- IP 池的
.spec.enableAddressSet默认为false。设置为true后,会创建一个与 IP 池对应的 OVN NB 数据库 AddressSet 对象,并将 IP 池中的所有 IP 地址添加到该 AddressSet 中。你可以在 NetworkPolicy 或 VPC 逻辑路由策略中使用该 AddressSet 对象。