标签归档:Multus

Kubernetes 使用 multus 插件增加子接口并固定 ip

apiVersion: "k8s.cni.cncf.io/v1"  
kind: NetworkAttachmentDefinition  
metadata:  
 name: macvlan8  
 namespace: multicast  
spec:  
 config: '{  
   "cniVersion": "0.3.1",  
   "plugins": [  
     {  
       "type": "macvlan",  
       "capabilities": { "ips": true },  
       "master": "eth1",  
       "mode": "bridge",  
       "ipam": {  
         "type": "static",  
         "addresses": [  
             {  
                 "address": "192.168.25.62/22",  
                 "gateway": "192.168.27.254"  
             }  
         ],  
         "routes": [  
             { "dst": "192.168.24.0/22", "gw": "192.168.27.254" },  
             { "dst": "192.168.5.0/24" }  
         ]  
       }  
     }  
   ]  
 }'

示例负载:

---  
apiVersion: apps/v1  
kind: Deployment  
metadata:  
 labels:  
   app: demo8  
 name: demo8  
 namespace: multicast  
spec:  
 replicas: 1  
 selector:  
   matchLabels:  
     app: demo8  
 template:  
   metadata:  
     annotations:  
       k8s.v1.cni.cncf.io/networks: macvlan8  
     labels:  
       app: demo8  
   spec:  
     containers:  
       - name: demo8  
         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'

测试效果:

[root@node1 multus]# kubectl -n multicast exec -it demo8-578986878b-6m5nr -- sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: eth0@if75: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1430 qdisc noqueue state UP 
    link/ether 02:0c:78:14:6e:f9 brd ff:ff:ff:ff:ff:ff
    inet 10.233.71.42/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::c:78ff:fe14:6ef9/64 scope link 
       valid_lft forever preferred_lft forever
4: net1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether ca:35:41:d3:92:3e brd ff:ff:ff:ff:ff:ff
    inet 192.168.25.62/22 brd 192.168.27.255 scope global net1
       valid_lft forever preferred_lft forever
    inet6 fe80::c835:41ff:fed3:923e/64 scope link 
       valid_lft forever preferred_lft forever
/ # ip r
default via 169.254.1.1 dev eth0 
169.254.1.1 dev eth0 scope link 
192.168.5.0/24 via 192.168.27.254 dev net1 
192.168.24.0/22 via 192.168.27.254 dev net1 
192.168.24.0/22 dev net1 scope link  src 192.168.25.62

References

kubernetes 使用 multus 为 pod 增加子接口

部署 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

还可以通过添加 `@

` 来指定接口名称,例如 `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