Установка узлового агента Istio CNI
Узловой агент Istio CNI используется для настройки перенаправления трафика для podов в mesh. Он запускается как DaemonSet, на каждом узле, с повышенными привилегиями. Узловой агент Istio CNI можно использовать в двух режимах data plane Istio.
Для режима sidecar data plane узловой агент Istio CNI является необязательным. Он устраняет необходимость запуска привилегированных init-контейнеров в каждом podе в mesh, заменяя эту модель одним привилегированным podом узлового агента на каждом узле Kubernetes.
Узловой агент Istio CNI обязателен в режиме ambient data plane.
В этом документе рассматривается использование узлового агента Istio CNI как необязательной части режима sidecar data plane.
Если вы создаете service mesh в кластере OpenShift, Istio CNI включен по умолчанию, поэтому вам не нужно выполнять шаги, описанные в этом документе.
Содержание
Предварительные требованияСреды, в которых необходимо использовать Istio CNIСреды, в которых можно использовать Istio CNIСреды, в которых нельзя использовать Istio CNIУстановка узлового агента Istio CNIУстановка с компонентом ServiceMesh Istio CNIДополнительная конфигурацияПроверкаОбработка внедрения init containerИспользование и проверкаСостояние гонки и меры по его устранениюСм. такжеПредварительные требования
Среды, в которых необходимо использовать Istio CNI
- Huawei Cloud CCE
- Среды с высокими требованиями к безопасности. (Например, среды, в которых запрещено использовать разрешения
NET_ADMINиNET_RAWв рабочих нагрузках)
Среды, в которых можно использовать Istio CNI
- Любой кластер Kubernetes, в котором включена поддержка CNI
Среды, в которых нельзя использовать Istio CNI
- Кластеры, в которых отключена поддержка Kubernetes CNI (только среды разработки, такие как
KIND)
Установка узлового агента Istio CNI
Сначала установите service mesh как обычно. После установки пока не добавляйте никаких сервисов (то есть не выполняйте внедрение Sidecar). Затем выполните следующие шаги для установки и настройки Istio CNI.
Установка с компонентом ServiceMesh Istio CNI
В большинстве сред базовый кластер Istio с включенным компонентом istioCni можно установить с помощью следующих команд:
- istioCni требуется для установки узлового агента Istio CNI.
- Обычно устанавливается в пространстве имен
kube-system.
Дополнительная конфигурация
При использовании OpenShift или Multus CNI:
- cni.values.chained должно быть
false. - cnivalues.provider должно быть
multus.
- Уровень логирования. (По умолчанию:
info) - Каталог двоичных файлов CNI. (По умолчанию:
/opt/cni/bin) - Каталог конфигурации CNI. (По умолчанию:
/etc/cni/net.d) - Файл конфигурации, в который будет вставлена конфигурация плагина istioCni; по умолчанию это будет первый найденный файл в cniConfiDir.
- Этот каталог должен существовать на узле; если его нет, обратитесь к документации вашего container runtime, чтобы определить подходящий путь. (По умолчанию:
/var/run/netns, в minikube/docker/others может быть/var/run/docker/netns) - Развертывать конфигурационные файлы как цепочку плагинов (значение
true) или как отдельные файлы в каталоге conf (значениеfalse). - Пользовательская конфигурация зависит от CNI provider, возможные значения:
defaultиmultus. (По умолчанию:default)
Проверка
Убедитесь, что все podы узлового агента CNI находятся в состоянии Running, прежде чем переходить к следующему шагу.
Обработка внедрения init container
По умолчанию Istio использует webhook для внедрения контейнера istio-init для прозрачного перехвата трафика.
Чтобы использовать Istio CNI вместо контейнера istio-init, необходимо настроить ресурс ServiceMesh следующим образом:
- Нужно ли включать Istio CNI вместо контейнера
istio-init. (По умолчанию:false) - CNI provider. Должно быть
multus, если используется Multus CNI. (По умолчанию:default)
Использование и проверка
После установки и настройки используйте обычный процесс внедрения без каких-либо дополнительных изменений.
После того как компонент Istio CNI установлен и правильно настроен, в podах будут выполнены следующие изменения:
- Контейнер
istio-initбольше не будет присутствовать (прозрачный перехват трафика будет выполняться узловым агентом Istio CNI). - Вместо него Istio внедрит контейнер с именем
istio-validation, который проверяет, успешно ли заданы правила iptables для прозрачного перехвата трафика.
Состояние гонки и меры по его устранению
DaemonSet Istio CNI устанавливает сетевой плагин CNI на каждом узле. Однако существует временной разрыв между моментом, когда pod DaemonSet назначается на узел, и моментом, когда плагин CNI установлен и готов к использованию.
Существует вероятность, что в течение этого временного промежутка запустится pod приложения, а kubelet не будет знать о плагине Istio CNI.
В результате pod приложения поднимется без перенаправления трафика Istio и обойдет sidecar Istio.
Чтобы устранить гонку между podом приложения и DaemonSet Istio CNI, в рамках внедрения sidecar добавляется init container istio-validation,
который определяет, правильно ли настроено перенаправление трафика, и блокирует запуск podа, если это не так.
DaemonSet CNI обнаружит и обработает любой pod, застрявший в таком состоянии; способ обработки podа зависит от
конфигурации, описанной ниже.
Эта мера по устранению проблемы включена по умолчанию и может быть отключена путем установки cni.values.repair.enabled в false.
- Нужно ли включать эту меру по устранению проблемы. (По умолчанию:
true) - Если функция включена, podы динамически перенастраиваются с корректной конфигурацией. При перезапуске контейнера pod продолжит обычное выполнение. (По умолчанию:
true) - Если функция включена, podы будут удалены, и при повторном планировании у них будет корректная конфигурация. (По умолчанию:
false) - Если функция включена, podы только помечаются меткой
cni.istio.io/uninitialized=true. Пользователю потребуется выполнить действия вручную для устранения проблемы. (По умолчанию:false)
Приоритет конфигурации: repairPods > deletePods > labelPods. Поэтому будет использовано первое поле со значением true и более высоким приоритетом.
Например, чтобы deletePods вступил в силу, недостаточно установить true для deletePods; также необходимо установить false для repairPods.