Kube-OVN 默认会根据 Pod 所在 Namespace 所属的子网中随机分配 IP 和 Mac。 针对工作负载需要固定地址的情况,Kube-OVN 根据不同的场景,提供了多种固定地址的方法:
在创建 Pod 时通过 annotation 来指定 Pod 运行时所需的 IP/Mac, kube-ovn-controller
运行时将会跳过地址随机分配阶段,经过冲突检测后直接使用指定地址,如下所示:
apiVersion: v1
kind: Pod
metadata:
name: static-ip
namespace: ls1
annotations:
ovn.kubernetes.io/ip_address: 10.16.0.15
ovn.kubernetes.io/mac_address: 00:00:00:53:6B:B6
spec:
containers:
- name: static-ip
image: nginx:alpine
在使用 annotation 定义单个 Pod IP/Mac 时需要注意以下几点:
Kube-OVN 支持通过 annotation ovn.kubernetes.io/ip_pool
给 Workload(Deployment/StatefulSet/DaemonSet/Job/CronJob)设置固定 IP。 kube-ovn-controllerr
会自动选择 ovn.kubernetes.io/ip_pool
中指定的 IP 并进行冲突检测。
IP Pool 的 Annotation 需要加在 template
内的 annotation
字段,除了 Kubernetes 内置的 Workload 类型, 其他用户自定义的 Workload 也可以使用同样的方式进行固定地址分配。
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: ls1
name: starter-backend
labels:
app: starter-backend
spec:
replicas: 2
selector:
matchLabels:
app: starter-backend
template:
metadata:
labels:
app: starter-backend
annotations:
ovn.kubernetes.io/ip_pool: 10.16.0.15,10.16.0.16,10.16.0.17
spec:
containers:
- name: backend
image: nginx:alpine
注意:
ovn.kubernetes.io/ip_pool
中的 IP 应该属于所在子网的 CIDR 内。ovn.kubernetes.io/ip_pool
中的 IP 不能和已使用的 IP 冲突。ovn.kubernetes.io/ip_pool
中的 IP 数量小于 replicas 数量时,多出的 Pod 将无法创建。你需要根据 Workload 的更新策略以及扩容规划调整 ovn.kubernetes.io/ip_pool
中 IP 的数量。Kube-OVN针对StatefulSet有状态服务,做了特殊强化:
ovn.kubernetes.io/ip_pool
中的 IP。例如 StatefulSet 的名字为 web,则 web-0 会使用 ovn.kubernetes.io/ip_pool
中的第一个 IP, web-1 会使用第二个 IP,以此类推。ovn.kubernetes.io/ip_pool
注解的 StatefulSet,Pod 第一次生成时会随机分配 IP/Mac,之后在整个 StatefulSet 的生命周期内,网络信息都会保持固定。针对 Kubevirt 创建的 VM 实例,kube-ovn-controller
可以按照类似 StatefulSet Pod 的方式进行 IP 地址分配和管理。 以达到 VM 实例在生命周期内启停,升级,迁移等操作过程中地址固定不变。