Все Об Openshift Egress. Часть 2

В первой части статьи По поводу OpenShift Egress мы рассмотрели варианты организации фиксированных исходящих IP-адресов для POD в кластере.

Но что, если вам необходимо предоставить доступ к внешним по отношению к кластеру сегментам сети, расположенным в определенных VLAN?

Все об OpenShift Egress. Часть 2

Манипулирование IP-адресацией здесь не поможет. Единственным решением в этом случае будет организация дополнительных интерфейсов на узлах кластера, которые будут располагаться в необходимых VLAN, и организация доступа к дополнительным интерфейсам от нужных нам проектов внутри кластера.

И проект под названием Мультис ЦНИ .



Мультис ЦНИ

Как вы знаете, по умолчанию POD в Kubernetes имеет один интерфейс, через который происходит все взаимодействие с ним.

Multus позволяет создавать в POD несколько интерфейсов помимо интерфейса по умолчанию.

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

По этой причине Multus называется мета-плагином CNI. Что делает Мультус наглядно показано на картинке из статьи Демистифицируя Мултус :

Все об OpenShift Egress. Часть 2

Разумеется, количество дополнительных интерфейсов может быть больше одного.



Настройка Multus CNI в OpenShift

Итак, попробуем решить проблему доступа к выделенному VLAN на нашем стенде.

По умолчанию всем узлам кластера выделяется один интерфейс, расположенный в OpenShift VLAN (IP: 192.168.111/24).

Хотим организовать доступ из проекта multes-test к ресурсам сети 192.168.112/24, расположенным в VLAN Restricted. VLAN Restricted и VLAN OpenShift не маршрутизируются между собой.



Все об OpenShift Egress. Часть 2

Для начала добавим интерфейс из VLAN Restricted на ряд узлов (в нашем случае Node1 и Node2), и поставим метку на эти узлы node-role.kubernetes.io/multus-node= 'да'.

Узлы, помеченные как multi-node, будут иметь доступ к ресурсам из ограниченной VLAN. Создадим наш мультитестовый проект:

  
  
  
  
   

[ocp@shift-is01 macvlan]$ oc new-project multus-test

Поддержка Multus CNI присутствует в OpenShift уже давно; нет необходимости добавлять его отдельно.

Конфигурация Multus управляется через CR в CRD. network.operator.openshift.io .

Вам необходимо отредактировать этот ресурс, добавив конфигурацию плагина CNI для нового интерфейса: oc редактировать кластер network.operator.openshift.io

spec: additionalNetworks: - name : net1 namespace: multus-test type: Raw rawCNIConfig: |- { "cniVersion": "0.3.1", "type": "ipvlan", "mode": "l2", "master": "ens224", "ipam": { "type": "static" } }

Этот момент требует расшифровки.

Что мы определили по этой конфигурации?

  1. Для POD в проект multus-test будет добавлен интерфейс под названием «net1».

  2. Конфигурация этого интерфейса будет определяться через плагин CNI «ipvlan»;
  3. Плагин CNI ipvlan будет настроен в режиме L2;
  4. Физический интерфейс узла ens224 используется в качестве основного интерфейса для net1;
  5. Наконец, статический плагин IPAM будет использоваться для управления IP-адресацией.



Выбор плагина CNI

Для нашего дополнительного интерфейса нам нужно выбрать используемый плагин CNI. Список возможных плагинов CNI можно найти на веб-сайте.

www.cni.dev .

В нашем примере мы используем плагин ipvlan .

По сути, это простейший мост, позволяющий контейнерам взаимодействовать через внешний сетевой интерфейс хоста.

В этом случае все исходящие соединения будут использовать собственный IP-адрес, но будут иметь MAC-адрес внешнего сетевого интерфейса.

Картинка с сайта hicu.be хорошо иллюстрирует работу плагина ipvlan:

Все об OpenShift Egress. Часть 2

В продуктивной среде они с большей вероятностью будут выбирать плагин macvlan , который отличается от ipvlan тем, что исходящие соединения имеют уникальные MAC-адреса.

Но в этом случае зачастую необходимо подготовить сетевую инфраструктуру так, чтобы сетевое оборудование позволяло передавать с одного и того же порта пакеты с разными MAC-адресами.



Выберите плагин IPAM

Помимо организации сетевого интерфейса нам необходимо определить правила выдачи IP-адреса новому интерфейсу.

Это также делается с помощью плагина CNI, который реализует функции управления IP-адресами (или IPAM).

Список возможных IPAM-плагинов также можно найти на сайте.

www.cni.dev .

В этом примере мы использовали простейший плагин статического IPAM, который назначает нашему POD фиксированный адрес.

Если таких POD много, использовать статический IPAM станет неудобно.

Хорошим выбором здесь было бы либо использовать плагин DHCP (он назначает IP-адреса POD через запрос к внешнему DHCP-серверу), либо использовать плагин местонахождения .

Поддержка этих плагинов IPAM также доступна по умолчанию в Опеншифт , вам не нужно устанавливать их отдельно.



Доступ к ограниченной VLAN

После определения нашей конфигурации Multus в кластере должен появиться ресурс под названием Network Attachment Definition, который отражает текущую конфигурацию Multus: Определение сетевого подключения

[ocp@shift-is01 macvlan]$ oc get network-attachment-definitions --all-namespaces NAMESPACE NAME AGE multus-test net1 3m4s [ocp@shift-is01 macvlan]$ oc get network-attachment-definitions.k8s.cni.cncf.io -n multus-test net1 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: creationTimestamp: "2020-11-02T16:44:46Z" generation: 1 managedFields: - apiVersion: k8s.cni.cncf.io/v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:ownerReferences: .

: {} k:{"uid":"01a4f46a-fc3c-495f-b196-b39352421e2a"}: .

: {} f:apiVersion: {} f:blockOwnerDeletion: {} f:controller: {} f:kind: {} f:name: {} f:uid: {} f:spec: .

: {} f:config: {} manager: cluster-network-operator operation: Update time: "2020-11-02T16:44:46Z" name: net1 namespace: multus-test ownerReferences: - apiVersion: operator.openshift.io/v1 blockOwnerDeletion: true controller: true kind: Network name: cluster uid: 01a4f46a-fc3c-495f-b196-b39352421e2a resourceVersion: "25898949" selfLink: /apis/k8s.cni.cncf.io/v1/namespaces/multus-test/network-attachment-definitions/net1 uid: 7a7d718b-82c5-46fe-8f72-8fd4299508ec spec: config: |- { "cniVersion": "0.3.1", "type": "ipvlan", "mode": "l2", "master": "ens224", "ipam": { "type": "static" } }

Давайте создадим тестовый POD с дополнительным интерфейсом, который будет иметь доступ к нашей ограниченной VLAN: pod-ipvlan-static.yaml

[ocp@shift-is01 ipvlan]$ cat .

/pod-ipvlan-static.yaml apiVersion: v1 kind: Pod metadata: namespace: multus-test name: test-multus-pod labels: app: test-multus-pod annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "net1", "ips": ["192.168.112.250/24"] } ]' spec: nodeSelector: node-role.kubernetes.io/multus-node: yes containers: - name: test-multus-pod image: centos/tools command: ["/bin/bash", "-c", "sleep 9000000"]

Зайдем в созданный POD, чтобы просмотреть его сетевую конфигурацию и проверить наличие адресов в ограниченном VLAN (в сети 192.168.112.0/24):

ocp@shift-is01 ipvlan]$ oc rsh test-multus-pod sh-4.2# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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@if2142: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default link/ether 0a:58:0a:fe:04:a0 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.254.4.160/24 brd 10.254.4.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::bc4b:abff:fe0b:91f8/64 scope link valid_lft forever preferred_lft forever 4: net1@if826: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether 00:50:56:96:f3:02 brd ff:ff:ff:ff:ff:ff inet 192.168.112.250/24 brd 192.168.112.255 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::50:5600:196:f302/64 scope link valid_lft forever preferred_lft forever sh-4.2# ping 192.168.112.1 -c 3 PING 192.168.112.1 (192.168.112.1) 56(84) bytes of data. 64 bytes from 192.168.112.1: icmp_seq=1 ttl=64 time=0.179 ms 64 bytes from 192.168.112.1: icmp_seq=2 ttl=64 time=0.230 ms 64 bytes from 192.168.112.1: icmp_seq=3 ttl=64 time=0.223 ms --- 192.168.112.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2041ms rtt min/avg/max/mdev = 0.179/0.210/0.230/0.028 ms

Как видно из вывода команды «ip a», POD получил дополнительный сетевой интерфейс net1@if826 и IP-адрес, который мы указали в его манифесте.

Поскольку дополнительный интерфейс работает через Ethernet-адаптер, расположенный в ограниченной VLAN, из этого POD мы получили доступ к нужному нам сегменту сети.

Автор: Сергей Артемов, руководитель направления DevOps-решений компании «Инфосистемы Джет».

Присоединяйтесь к нашему каналу в Telegram Переговоры @DevSecOps !

Библиография

  1. OpenShift 4 с MacVLAN и местонахождение
  2. Демистифицируя Мултус
  3. Маквлан против IPvlan
Теги: #ИТ-инфраструктура #DevOps #Openshift
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.