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#
Проверка установки#
Чтобы проверить установку, выполните следующие действия:
Проверьте, что все 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.
Убедитесь, что автоматически сгенерированный файл конфигурации существует в директории
/etc/cni/net.d/:ls /etc/cni/net.d/
Создание дополнительных интерфейсов#
Создайте конфигурации для каждого из дополнительных интерфейсов, которые подключаете к контейнерам, и пользовательские ресурсы для каждого интерфейса. В рамках процесса быстрой установки создается CRD - пользовательское определение ресурса, которое служит местом для хранения ресурсов. В CRD будут храниться конфигурации для каждого интерфейса.
Создайте конфигурацию для дополнительного интерфейса. Например, создайте конфигурацию
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-адреса выбранной подсети.Получите более подробную информацию о конфигурации:
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>Проверьте созданную конфигурацию:
oc get network-attachment-definitionsПример вывода команды:
NAME AGE <conf_name> <time>Где:
<conf_name>- имя конфигурации;<time>- время с момента создания ресурса.
Добавьте дополнительные интерфейсы в pod (опционально). Для добавления новых интерфейсов создайте соответствующие конфигурации и аннотируйте pods. Например, добавьте два
macvlancat <<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