从 v1.1 版本开始,Kube-OVN 可以为其他 CNI 网络插件,例如 macvlan、vlan、host-device 等插件提供集群级别的 IPAM 能力,其他网络插件也可以使用到 Kube-OVN 中子网以及固定 IP 功能。

工作原理

通过使用 Intel Multus CNI, 我们可以给一个 Pod 添加多块不同网络的网卡。然而我们仍然缺乏对集群范围内不同网络的 IP 地址进行管理的能力。在 Kube-OVN 中,我们已经能过通过 Subnet 和 IP 的 CRD 来进行 IP 的高级管理,例如子网管理,IP 预留,随机分配,固定分配等。现在我们对子网进行扩展,来接入其他不同的网络插件,使得其他网络插件也可以使用 Kube-OVN 的IPAM功能。

工作流程

work-flow

上图展示了如何通过 Kube-OVN 来管理其他网络插件的 IP 地址。其中容器的 eth0 网卡接入 OVN 网络,net1 网卡接入其他 CNI 网络。net1 网络的网络定义来自于 multus-cni 中的 NetworkAttachmentDefinition CRD。

当 Pod 创建时,kube-ovn-controller 会监听到 Pod 添加事件,并根据 Pod 中的 annotation 去寻找到对应的 Subnet CRD 并从中进行 IP 的分配和管理,并将 Pod 所分配到的地址信息写回到 Pod annotation 中。

在容器所在机器的 CNI 可以通过在配置中配置 kube-ovn-cni 作为 ipam 插件, kube-ovn-cni 将会读取 Pod annotation 并将地址信息通过CNI 协议的标准格式返回给相应的 CNI 插件。

存在的限制

  1. 目前只能使用 OVN 作为 Pod 的默认网络,其他网络插件作为 Multus-CNI 中的附属网络。如果未来有强烈的需求,我们可以把 IPAM 功能完全提取出来作为单独的组件。
  2. Multus-CNI 中的静态 IP 功能会和 Kube-OVN 中的静态 IP 功能存在冲突,需要使用 Kube-OVN 格式的静态 IP annotation。

使用方法

安装 Kube-OVN 和 Multus

请参考 Kube-OVN installationMultus how to use 来安装 Kube-OVN 和 Multus-CNI。

创建 network attachment definition

这里我们使用 macvlan 作为容器网络的第二个网络,并将其 ipam 设置为 kube-ovn

  1. apiVersion: "k8s.cni.cncf.io/v1"
  2. kind: NetworkAttachmentDefinition
  3. metadata:
  4. name: macvlan
  5. namespace: default
  6. spec:
  7. config: '{
  8. "cniVersion": "0.3.0",
  9. "type": "macvlan",
  10. "master": "eth0",
  11. "mode": "bridge",
  12. "ipam": {
  13. "type": "kube-ovn",
  14. "server_socket": "/run/openvswitch/kube-ovn-daemon.sock",
  15. "provider": "macvlan.default"
  16. }
  17. }'

type: 需要为 kube-ovn 来调用 kube-ovn 的插件来获取地址信息

server_socket: Kube-OVN 通信使用的 socket 文件。 默认位置为 /run/openvswitch/kube-ovn-daemon.sock

provider: 当前 NetworkAttachmentDefinition 的 <namespace>.<name> , Kube-OVN 将会使用这些信息找到对应的 Subnet 资源。

创建一个 Kube-OVN Subnet

创建一个 Kube-OVN Subnet,设置对应的 CIDR 和 exclude_ips, provider 应该设置为对应的 NetworkAttachmentDefinition

  1. apiVersion: kubeovn.io/v1
  2. kind: Subnet
  3. metadata:
  4. name: macvlan
  5. spec:
  6. protocol: IPv4
  7. provider: macvlan.default
  8. cidrBlock: 172.17.0.0/16
  9. gateway: 172.17.0.1
  10. excludeIps:
  11. - 172.17.0.0..172.17.0.10

gateway, private, nat 只对 provider 类型为 ovn 的网络生效,不适用于 attachment network。

创建一个多网络的 Pod

对于地址随机分配的 Pod,只需要添加如下 annotation k8s.v1.cni.cncf.io/networks:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: samplepod
  5. namespace: default
  6. annotations:
  7. k8s.v1.cni.cncf.io/networks: macvlan
  8. spec:
  9. containers:
  10. - name: samplepod
  11. command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
  12. image: alpine

创建固定 IP 的 Pod

对于固定 IP 的 Pod,添加 <networkAttachmentName>.<networkAttachmentNamespace>.kubernetes.io/ip_address annotations:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: static-ip
  5. namespace: default
  6. annotations:
  7. k8s.v1.cni.cncf.io/networks: macvlan
  8. ovn.kubernetes.io/ip_address: 10.16.0.15
  9. ovn.kubernetes.io/mac_address: 00:00:00:53:6B:B6
  10. macvlan.default.kubernetes.io/ip_address: 172.17.0.100
  11. macvlan.default.kubernetes.io/mac_address: 00:00:00:53:6B:BB
  12. spec:
  13. containers:
  14. - name: static-ip
  15. image: nginx:alpine

创建使用固定 IP 的工作负载

对于使用 ippool 的工作负载, 添加 <networkAttachmentName>.<networkAttachmentNamespace>.kubernetes.io/ip_pool annotations:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. namespace: default
  5. name: static-workload
  6. labels:
  7. app: static-workload
  8. spec:
  9. replicas: 2
  10. selector:
  11. matchLabels:
  12. app: static-workload
  13. template:
  14. metadata:
  15. labels:
  16. app: static-workload
  17. annotations:
  18. k8s.v1.cni.cncf.io/networks: macvlan
  19. ovn.kubernetes.io/ip_pool: 10.16.0.15,10.16.0.16,10.16.0.17
  20. macvlan.default.kubernetes.io/ip_pool: 172.17.0.200,172.17.0.201,172.17.0.202
  21. spec:
  22. containers:
  23. - name: static-workload
  24. image: nginx:alpine