Ovs-cni Quick Start
English | 简体中文
Spiderpool 可用作 Underlay 网络场景下提供固定 IP 的一种解决方案,本文将以 Multus、Ovs-cni 、Spiderpool 为例,搭建一套完整的 Underlay 网络解决方案,该方案能将可用的网桥公开为节点资源,供集群使用。
先决条件
-
一个多节点的 Kubernetes 集群
-
必须在主机上安装并运行 Open vSwitch,可参考官方安装说明
以下示例是基于 Ubuntu 22.04.1。主机系统不同,安装方式可能不同。
~# sudo apt-get install -y openvswitch-switch ~# sudo systemctl start openvswitch-switch
安装 Ovs-cni
ovs-cni
是一个基于 Open vSwitch(OVS)的 Kubernetes CNI 插件,它提供了一种在 Kubernetes 集群中使用 OVS 进行网络虚拟化的方式。
确认节点上是否存在二进制文件 /opt/cni/bin/ovs 。如果节点上不存在该二进制文件,可参考如下命令,在所有节点上下载安装:
~# wget https://github.com/k8snetworkplumbingwg/ovs-cni/releases/download/v0.31.1/plugin
~# mv ./plugin /opt/cni/bin/ovs
~# chmod +x /opt/cni/bin/ovs
Ovs-cni 不会配置网桥,由用户创建它们,并将它们连接到 L2、L3 网络。以下是创建网桥的示例,请在每个节点上执行:
-
创建 Open vSwitch 网桥。
~# ovs-vsctl add-br br1
-
网络接口连接到网桥
此过程取决于您的平台,以下命令只是示例说明,它可能会破坏您的系统。首先使用
ip link show
查询主机的可用接口,示例中使用主机上的接口:eth0
为例。~# ovs-vsctl add-port br1 eth0 ~# ip addr add <IP地址>/<子网掩码> dev br1 ~# ip link set br1 up ~# ip route add default via <默认网关IP> dev br1
-
创建后,可以在每个节点上查看到如下的网桥信息:
~# ovs-vsctl show ec16d9e1-6187-4b21-9c2f-8b6cb75434b9 Bridge br1 Port eth0 Interface eth0 Port br1 Interface br1 type: internal Port veth97fb4795 Interface veth97fb4795 ovs_version: "2.17.3"
安装 Spiderpool
-
安装 Spiderpool。
helm repo add spiderpool https://spidernet-io.github.io/spiderpool helm repo update spiderpool helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="ovs-conf"
如果您是国内用户,可以指定参数
--set global.imageRegistryOverride=ghcr.m.daocloud.io
以帮助您快速的拉取镜像。通过
multus.multusCNI.defaultCniCRName
指定集群的 Multus clusterNetwork,clusterNetwork 是 Multus 插件的一个特定字段,用于指定 Pod 的默认网络接口。 -
创建 SpiderIPPool 实例。
Pod 会从该 IP 池中获取 IP,进行 Underlay 的网络通讯,所以该 IP 池的子网需要与接入的 Underlay 子网对应。以下是创建相关的 SpiderIPPool 示例:
cat <<EOF | kubectl apply -f - apiVersion: spiderpool.spidernet.io/v2beta1 kind: SpiderIPPool metadata: name: ippool-test spec: ipVersion: 4 ips: - "172.18.30.131-172.18.30.140" subnet: 172.18.0.0/16 gateway: 172.18.0.1 multusName: - ovs-conf EOF
-
验证安装:
~# kubectl get po -n kube-system |grep spiderpool spiderpool-agent-7hhkz 1/1 Running 0 13m spiderpool-agent-kxf27 1/1 Running 0 13m spiderpool-controller-76798dbb68-xnktr 1/1 Running 0 13m spiderpool-init 0/1 Completed 0 13m spiderpool-multus-7vkm2 1/1 Running 0 13m spiderpool-multus-rwzjn 1/1 Running 0 13m ~# kubectl get sp ippool-test NAME VERSION SUBNET ALLOCATED-IP-COUNT TOTAL-IP-COUNT DEFAULT ippool-test 4 172.18.0.0/16 0 10 false ~#
-
Spiderpool 为简化书写 JSON 格式的 Multus CNI 配置,它提供了 SpiderMultusConfig CR 来自动管理 Multus NetworkAttachmentDefinition CR。如下是创建 Ovs SpiderMultusConfig 配置的示例:
- 确认 ovs-cni 所需的网桥名称,本例子以 br1 为例:
BRIDGE_NAME="br1" cat <<EOF | kubectl apply -f - apiVersion: spiderpool.spidernet.io/v2beta1 kind: SpiderMultusConfig metadata: name: ovs-conf namespace: kube-system spec: cniType: ovs ovs: bridge: "${BRIDGE_NAME}" EOF
创建应用
以下的示例 Yaml 中, 会创建 2 个副本的 Deployment,其中:
v1.multus-cni.io/default-network
:用于指定 Multus 的 NetworkAttachmentDefinition 配置,会基于它为应用创建一张默认网卡。
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-app
spec:
replicas: 2
selector:
matchLabels:
app: test-app
template:
metadata:
annotations:
ipam.spidernet.io/ippool: |-
{
"ipv4": ["ippool-test"]
}
labels:
app: test-app
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: test-app
topologyKey: kubernetes.io/hostname
containers:
- name: test-app
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
EOF
SpiderIPPool 为应用分配了 IP,应用的 IP 将会自动固定在该 IP 范围内:
~# kubectl get po -l app=test-app -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-app-6f8dddd88d-hstg7 1/1 Running 0 3m37s 172.18.30.131 ipv4-worker <none> <none>
test-app-6f8dddd88d-rj7sm 1/1 Running 0 3m37s 172.18.30.132 ipv4-control-plane <none> <none>
~# kubectl get spiderippool
NAME VERSION SUBNET ALLOCATED-IP-COUNT TOTAL-IP-COUNT DEFAULT DISABLE
ippool-test 4 172.18.0.0/16 2 2 false false
~# kubectl get spiderendpoints
NAME INTERFACE IPV4POOL IPV4 IPV6POOL IPV6 NODE
test-app-6f8dddd88d-hstg7 eth0 ippool-test 172.18.30.131/16 ipv4-worker
test-app-6f8dddd88d-rj7sm eth0 ippool-test 172.18.30.132/16 ipv4-control-plane
测试 Pod 与 Pod 的通讯情况,以跨节点 Pod 为例:
~#kubectl exec -ti test-app-6f8dddd88d-hstg7 -- ping 172.18.30.132 -c 2
PING 172.18.30.132 (172.18.30.132): 56 data bytes
64 bytes from 172.18.30.132: seq=0 ttl=64 time=1.882 ms
64 bytes from 172.18.30.132: seq=1 ttl=64 time=0.195 ms
--- 172.18.30.132 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.195/1.038/1.882 ms