• Русский
  • Установка агента узла Istio CNI

    Агент узла Istio CNI используется для настройки перенаправления трафика для подов в mesh. Он запускается как DaemonSet на каждом узле с повышенными правами. Агент узла Istio CNI может использоваться в двух режимах плоскости данных Istio.

    Для режима sidecar плоскости данных агент узла Istio CNI является необязательным. Он устраняет необходимость запуска привилегированных init контейнеров в каждом поде mesh, заменяя эту модель одним привилегированным подом агента узла на каждом узле Kubernetes.

    Агент узла Istio CNI обязателен в режиме ambient плоскости данных.

    Этот документ сосредоточен на использовании агента узла Istio CNI как опциональной части режима sidecar плоскости данных.

    TIP

    Если вы создаёте сервисный mesh в кластере OpenShift, Istio CNI включён по умолчанию, поэтому вам не нужно выполнять шаги из этого документа.

    Содержание

    Предварительные требования

    Среды, где необходимо использовать Istio CNI

    • Huawei Cloud CCE
    • Среды с высокими требованиями к безопасности. (Например, среды, запрещающие использование разрешений NET_ADMIN и NET_RAW в бизнес-нагрузках)

    Среды, где можно использовать Istio CNI

    • Любой Kubernetes кластер с включённой поддержкой CNI

    Среды, где нельзя использовать Istio CNI

    • Кластеры с отключённой поддержкой Kubernetes CNI (только среды разработки, такие как KIND)

    Установка агента узла Istio CNI

    Сначала установите сервисный mesh как обычно. После установки пока не добавляйте никаких сервисов (то есть не внедряйте Sidecar). Затем выполните следующие шаги для установки и настройки Istio CNI.

    Установка с компонентом ServiceMesh Istio CNI

    В большинстве сред базовый кластер Istio с включённым компонентом istioCni можно установить с помощью следующих команд:

    apiVersion: asm.alauda.io/v1alpha1
    kind: ServiceMesh
    spec:
      componentConfig:
        - name: istioCni
          group: istio
          cni:
            namespace: kube-system
    1. istioCni необходим для установки агента узла Istio CNI.
    2. Обычно устанавливается в namespace kube-system.

    Дополнительная конфигурация

    apiVersion: asm.alauda.io/v1alpha1
    kind: ServiceMesh
    spec:
      componentConfig:
        - name: istioCni
          group: istio
          cni:
            namespace: kube-system
            # Расширенная конфигурация
            values:
              logLevel: info
              cniBinDir: ""
              cniConfDir: /etc/cni/net.d
              cniConfFileName: ""
              cniNetnsDir:
              excludeNamespaces:
                - istio-system
                - kube-system
              chained: true
              provider: default
    CAUTION

    При использовании OpenShift или Multus CNI:

    • cni.values.chained должен быть false.
    • cni.values.provider должен быть multus.
    1. Уровень логирования. (По умолчанию: info)
    2. Каталог бинарных файлов CNI. (По умолчанию: /opt/cni/bin)
    3. Каталог конфигурации CNI. (По умолчанию: /etc/cni/net.d)
    4. Файл конфигурации для вставки конфигурации плагина istioCni, по умолчанию это будет первый найденный файл в cniConfDir.
    5. Этот каталог должен существовать на узле, если его нет, обратитесь к документации вашего контейнерного рантайма для определения правильного пути. (По умолчанию: /var/run/netns, в minikube/docker/других может быть /var/run/docker/netns)
    6. Разворачивать конфигурационные файлы как цепочку плагинов (значение true) или как отдельные файлы в каталоге конфигурации (значение false).
    7. Пользовательская конфигурация зависит от провайдера CNI, возможные значения: default и multus. (По умолчанию: default)

    Проверка

    NOTE

    Убедитесь, что все поды агента узла CNI находятся в состоянии Running перед переходом к следующему шагу.

    # При необходимости измените часть -nkube-system, если агент Istio CNI установлен в другом namespace:
    kubectl -nkube-system get po -lk8s-app=istio-cni-node

    Управление внедрением init контейнера

    По умолчанию Istio использует webhook для внедрения контейнера istio-init для прозрачного перехвата трафика. Чтобы использовать Istio CNI вместо контейнера istio-init, необходимо изменить ресурс ServiceMesh следующим образом:

    apiVersion: asm.alauda.io/v1alpha1
    kind: ServiceMesh
    spec:
      istioConfig:
        cni:
          enabled: true
          provider: default
    1. Включение Istio CNI вместо контейнера istio-init. (По умолчанию: false)
    2. Провайдер CNI. Должен быть multus, если используется Multus CNI. (По умолчанию: default)

    Использование и проверка

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

    После установки и правильной настройки компонента Istio CNI в подах произойдут следующие изменения:

    • Контейнер istio-init больше не будет присутствовать (прозрачный перехват трафика будет обрабатываться агентом узла Istio CNI).
    • Вместо него Istio внедрит контейнер с именем istio-validation, который проверяет, успешно ли установлены правила iptables для прозрачного перехвата трафика.

    Состояние гонки и способы её устранения

    DaemonSet Istio CNI устанавливает сетевой плагин CNI на каждом узле. Однако существует временной промежуток между тем, когда под DaemonSet планируется на узел, и моментом, когда плагин CNI установлен и готов к использованию. Существует вероятность, что в этот промежуток времени запустится под приложения, и kubelet не будет знать о плагине Istio CNI. В результате под приложения запускается без перенаправления трафика Istio и обходит sidecar Istio.

    Для устранения гонки между подом приложения и DaemonSet Istio CNI в составе внедрения sidecar добавляется init контейнер istio-validation, который проверяет корректность настройки перенаправления трафика и блокирует запуск пода, если настройка некорректна. DaemonSet CNI обнаружит и обработает любой под, застрявший в таком состоянии; способ обработки пода зависит от конфигурации, описанной ниже. Это средство устранения включено по умолчанию и может быть отключено установкой cni.values.repair.enabled в false.

    apiVersion: asm.alauda.io/v1alpha1
    kind: ServiceMesh
    spec:
      componentConfig:
        - name: istioCni
          group: istio
          cni:
            values:
              repair:
                enabled: true
                repairPods: true
                deletePods: false
                labelPods: false
    1. Включение средства устранения. (По умолчанию: true)
    2. При включении поды динамически перенастраиваются с правильной конфигурацией. При перезапуске контейнера под продолжит нормальную работу. (По умолчанию: true)
    3. При включении поды удаляются, при повторном планировании они будут иметь правильную конфигурацию. (По умолчанию: false)
    4. При включении поды только помечаются меткой cni.istio.io/uninitialized=true. Пользователю потребуется вручную решить проблему. (По умолчанию: false)
    NOTE

    Приоритет конфигурации: repairPods > deletePods > labelPods. Поэтому будет использовано первое поле со значением true с более высоким приоритетом.

    Например, чтобы активировать deletePods, недостаточно установить true для deletePods, необходимо также установить false для repairPods.

    См. также

    Troubleshooting the Istio CNI plugin