Multus CNI#

Multus CNI — это плагин контейнерного сетевого интерфейса (CNI) для Kubernetes, разработанный для поддержки нескольких сетевых интерфейсов в одном pod.

В стандартной конфигурации Kubernetes каждый pod имеет всего один сетевой интерфейс, но с Multus CNI можно создавать pod с несколькими интерфейсами. Это достигается за счет того, что Multus CNI способен вызывать несколько других CNI-плагинов, чтобы настроить дополнительные сети. Плагин соответствует стандарту пользовательских ресурсов сети (CRD) и предоставляет унифицированный механизм для указания конфигураций дополнительных интерфейсов.

Multus особенно полезен в сценариях, где требуется одновременное подключение pod к нескольким сетям или обеспечение изолированных сетевых путей для разных типов трафика внутри кластера.

Во время использования Multus появляется возможность связать два интерфейса, которые ранее были переданы в контейнер.

Multus CNI предоставляет функции:

  • поддержка добавления нескольких сетевых интерфейсов к pods;

  • использование Custom Resource Definitions (CRD) для хранения конфигураций дополнительных интерфейсов;

  • поддержка различных типов сетевых интерфейсов, таких как MACVLAN, VLAN, VXLAN и другие;

  • возможность управления сетевыми конфигурациями через аннотации и настройки CRD;

  • расширяемость и гибкость конфигурации сетевых интерфейсов.

Основные команды и флаги для работы с Multus CNI:

  • oc apply -f <file>: команда для установки Multus CNI с помощью YAML-файла.

  • oc get pods --all-namespaces | grep -i multus: команда для проверки запущенных pods Multus CNI.

  • oc get network-attachment-definitions: команда для получения списка созданных конфигураций дополнительных интерфейсов.

  • oc describe network-attachment-definitions <name_interface>: команда для подробного описания конфигурации определенного дополнительного интерфейса.

Предварительные условия: перед выполнением сценария настройте Kubelet на использование CNI.

Сценарий установки Multus CNI:#

Рекомендуемый метод установки - установка через Daemonset.

Для установки плагина используйте команду:

oc apply -f <repo_route>

Где:

  • -f - опция, указывающая на то, что следующий аргумент - путь к файлу или URL, содержащий YAML-конфигурацию;

  • <repo_route> - URL или путь до локального репозитория, содержащий YAML-конфигурацию. Например:

oc apply -f /k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset.yml

Пример вывода команды:

serviceaccount/multus created
daemonset.apps/multus created
configmap/multus-cni-config created

Сценарии использования Multus CNI#

Проверка установки#

Чтобы проверить установку, выполните следующие действия:

  1. Проверьте, что все pods Multus CNI запущены без ошибок:

    oc get pods --all-namespaces | grep -i multus
    

    Пример вывода команды:

    <namespace>   <pod_name>                                1/1     Running   0      5m
    <namespace>   <pod_name>                                1/1     Running   0      5m
    

    Где:

    • <namespace> - namespace, в котором работает pod;

    • <pod_name> - имя pod.

  2. Убедитесь, что автоматически сгенерированный файл конфигурации существует в директории /etc/cni/net.d/:

    ls /etc/cni/net.d/
    

Создание дополнительных интерфейсов#

Создайте конфигурации для каждого из дополнительных интерфейсов, которые подключаете к контейнерам, и пользовательские ресурсы для каждого интерфейса. В рамках процесса быстрой установки создается CRD - пользовательское определение ресурса, которое служит местом для хранения ресурсов. В CRD будут храниться конфигурации для каждого интерфейса.

  1. Создайте конфигурацию для дополнительного интерфейса. Например, создайте конфигурацию macvlan:

    cat <<EOF | oc create -f -
    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: macvlan-conf
    spec:
      config: '{
          "cniVersion": "0.3.0",
          "type": "macvlan",
          "master": "eth0",
          "mode": "bridge",
          "ipam": {
            "type": "host-local",
            "subnet": "NNN.NNN.N.0/24",
            "rangeStart": "NNN.NNN.N.200",
            "rangeEnd": "NNN.NNN.N.216",
            "routes": [
              { "dst": "0.0.0.0/0" }
            ],
            "gateway": "NNN.NNN.N.1"
          }
        }'
    EOF
    

    Где NNN.NNN.N.0/24 – выбранная подсеть, а NNN.NNN.N.200, NNN.NNN.N.216, NNN.NNN.N.1 – актуальные IP-адреса выбранной подсети.

  2. Получите более подробную информацию о конфигурации:

    oc describe network-attachment-definitions macvlan-conf
    

    Пример вывода команды:

    Name:         macvlan-conf
    Namespace:    default
    Labels:       <none>
    Annotations:  kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"macvlan-conf","namespace":"default"},"spec":{"config":"{\"cniVersion\":\"0.3.1\",\"name\":\"macvlan-net\",\"type\":\"macvlan\",\"master\":\"eth0\",\"mode\":\"bridge\",\"ipam\":{\"type\":\"host-local\",\"subnet...
    API Version: k8s.cni.cncf.io/v1
    Kind:        NetworkAttachmentDefinition
    Metadata:
      Creation Timestamp:  2025-06-20T14:30:00Z
      Generation:          1
      Managed Fields:
        API Version:  k8s.cni.cncf.io/v1
        Fields Type:  FieldsV1
        fields:
          f:metadata:
            f:annotations:
            f:labels:
          f:spec:
            f:config:
      Manager:         kubectl
      Operation:       Update
      Time:            2025-06-20T14:30:00Z
    Spec:
      Config:  {"cniVersion":"0.3.1","name":"macvlan-net","type":"macvlan","master":"eth0","mode":"bridge","ipam":{"type":"host-local","subnet...
    Events:    <none>
    
  3. Проверьте созданную конфигурацию:

    oc get network-attachment-definitions
    

    Пример вывода команды:

    NAME             AGE
    <conf_name>     <time>
    

    Где:

    • <conf_name> - имя конфигурации;

    • <time> - время с момента создания ресурса.

  4. Добавьте дополнительные интерфейсы в pod (опционально). Для добавления новых интерфейсов создайте соответствующие конфигурации и аннотируйте pods. Например, добавьте два macvlan

    cat <<EOF | oc create -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: samplepod
      annotations:
        k8s.v1.cni.cncf.io/networks: macvlan-conf,macvlan-conf
    spec:
      containers:
      - name: samplepod
        command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
        image: alpine
    EOF
    

Примечание

Аннотация теперь выглядит так: k8s.v1.cni.cncf.io/networks: macvlan-conf,macvlan-conf. Где одна и та же конфигурация используется дважды, разделенная запятой.

Создание pod с дополнительным интерфейсом#

Создайте pods с аннотациями, указывающими на использование созданной конфигурации. Например, создайте pod с использованием конфигурации macvlan:

cat <<EOF | oc create -f -
apiVersion: v1
kind: Pod
metadata:
  name: samplepod
  annotations:
    k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
  containers:
  - name: samplepod
    command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
EOF

Проверка созданного pod#

Проверьте, какие интерфейсы присоединены к созданному pod:

oc exec -it samplepod -- ip a

Проверка аннотаций Network Status#

Получите информацию об аннотациях Network Status для подтверждения успешной работы CNI-плагинов:

oc describe pod samplepod