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

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

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

    В режиме data plane ambient агент узла Istio CNI обязателен.

    Этот документ посвящен использованию агента узла Istio CNI как необязательной части режима data plane sidecar.

    TIP

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

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

    Окружения, в которых необходимо использовать 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 можно установить с помощью следующих команд:

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

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

    apiVersion: asm.alauda.io/v1alpha1
    kind: ServiceMesh
    spec:
      componentConfig:
        - name: istioCni
          group: istio
          cni:
            namespace: kube-system
            # Advanced configuration
            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.
    • cnivalues.provider должно быть multus.
    1. Уровень логирования. (По умолчанию: info)
    2. Каталог бинарных файлов CNI. (По умолчанию: /opt/cni/bin)
    3. Каталог конфигурации CNI. (По умолчанию: /etc/cni/net.d)
    4. Файл конфигурации, в который нужно вставить конфигурацию плагина istioCni; по умолчанию это будет первый найденный файл в cniConfiDir.
    5. Этот каталог должен существовать на узле; если его нет, обратитесь к документации вашего container runtime для определения подходящего пути. (По умолчанию: /var/run/netns)
    6. Развертывать файлы конфигурации как цепочку плагинов (значение true) или как автономные файлы в каталоге conf (значение false).
    7. Пользовательская конфигурация выполняется в зависимости от CNI provider; возможные значения: default и multus. (По умолчанию: default)

    Проверка

    NOTE

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

    # Adjust the -nkube-system part if the Istio CNI agent is installed in another namespace:
    kubectl -nkube-system get po -lk8s-app=istio-cni-node

    Обработка внедрения init container

    По умолчанию 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 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.

    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. Если включено, pod'ы динамически перенастраиваются на соответствующую конфигурацию. Когда контейнер перезапускается, pod продолжает нормальное выполнение. (По умолчанию: true)
    3. Если включено, pod'ы удаляются; после повторного планирования у них будет правильная конфигурация. (По умолчанию: false)
    4. Если включено, pod'ы только помечаются как cni.istio.io/uninitialized=true. Пользователю потребуется выполнить ручные действия для устранения проблемы. (По умолчанию: false)
    NOTE

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

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

    См. также

    Устранение неполадок с плагином Istio CNI