部署 multus-cni
git clone https://github.com/k8snetworkplumbingwg/multus-cni.git
cat ./deployments/multus-daemonset-thick.yml | kubectl apply -f -
创建 NetworkAttachmentDefinition
NetworkAttachmentDefinition
是 Kubernetes 中的一个自定义资源定义(Custom Resource Definition,简称 CRD)。这是由 Multus CNI 插件引入的,用于在 Kubernetes 中定义和管理额外的网络接口。
Multus CNI 是一个插件,允许 Kubernetes Pods 同时连接到多个网络。默认情况下,Kubernetes Pod 只有一个网络接口,即使你有多个网络,Pod 也只能连接到一个。Multus 解决了这个问题,使得 Pod 可以连接到多个网络。
NetworkAttachmentDefinition
对象定义了如何创建这些额外的网络接口。它包含了必要的配置信息,例如 CNI 插件的类型(如 flannel,macvlan,vlan等)、网络配置参数等。当你创建一个 Pod,并希望它连接到额外的网络时,你可以在 Pod 的定义中引用相应的 NetworkAttachmentDefinition
。
例如,以下是一个 NetworkAttachmentDefinition
的示例:
下面定义了一个名叫 macvlan1
的 multus-cni NetworkAttachmentDefinition
在 multicast
命名空间中,桥接到宿主机的 eth0
接口:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan1
namespace: multicast
spec:
config: '{
"cniVersion": "0.3.0",
"type": "macvlan",
"master": "eth0",
"mode": "bridge",
"ipam": {
"type": "host-local",
"ranges": [
[ {
"subnet": "192.168.24.0/22",
"rangeStart": "192.168.25.60",
"rangeEnd": "192.168.25.70",
"gateway": "192.168.27.254"
} ]
],
"routes": [
{
"dst": "192.168.24.0/22",
"dst": "192.168.5.0/24",
"gw": "192.168.27.254"
}
]
}
}'
其中的 ranges
字段定义了用于 multus 子接口分配的 ip 资源信息,routes
字段定义了桥接后增加到 pod 中的路由信息, dst
定义了通过该接口的网段,gw
字段定义这些网段的网关。
描述使用子接口的 pod 资源
apiVersion: v1
kind: Pod
metadata:
name: pod-case-01
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf-1, macvlan-conf-2
spec:
containers:
- name: pod-case-01
image: docker.io/centos/tools:latest
command:
- /sbin/init
还可以通过添加@<ifname>
来指定接口名称,例如macvlan-conf-1@eth1
描述使用子接口的 deployment 资源
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: broadcast
name: broadcast
namespace: multicast
spec:
replicas: 1
selector:
matchLabels:
app: broadcast
template:
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: macvlan1@eth1
labels:
app: broadcast
spec:
containers:
- name: broadcast
command:
- /bin/sh
args:
- '-c'
- "while true; do echo 1;sleep 10; done"
image: '192.168.25.9/hello_multicast_iperf:1_aarch64'
imagePullPolicy: Always
resources:
limits:
cpu: '2'
requests:
cpu: '2'