部署 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 的示例:

下面定义了一个名叫 macvlan1multus-cni NetworkAttachmentDefinitionmulticast 命名空间中,桥接到宿主机的 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'

References

Kubernetes #MultusCNI

最后修改:2024 年 11 月 15 日
如果觉得我的文章对你有用,请随意赞赏