• Русский
  • Установка мультисетевой сетки primary-remote

    Установите Istio в топологии primary-remote multi-network на двух кластерах.

    NOTE

    В этой процедуре CLUSTER1 — это кластер East, а CLUSTER2 — кластер West. Кластер East является основным (primary), а кластер West — удалённым (remote).

    Вы можете адаптировать эти инструкции для сетки, охватывающей более двух кластеров.

    Топология

    Сервисные рабочие нагрузки, расположенные в разных кластерах, обмениваются данными косвенно через выделенные шлюзы для трафика east-west. Шлюз в каждом кластере должен быть доступен из другого кластера.

    Сервисы в cluster2 будут обращаться к контрольной плоскости в cluster1 через тот же шлюз east-west.

    Топология Primary-Remote Multi-Network

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

    • В каждом кластере, входящем в сетку, установлен плагин Alauda Container Platform Networking для Multus, при этом kube-ovn должен быть версии v4.1.5 или выше.
    • У вас есть доступ к двум кластерам с поддержкой внешнего балансировщика нагрузки.
      WARNING

      В режиме primary-remote, если адрес внешнего балансировщика нагрузки — это IPv6-адрес, то установка в режиме primary-remote в настоящее время не поддерживается.

    • На всех кластерах, входящих в сетку, установлен Alauda Service Mesh v2 Operator.
    • Вы завершили создание сертификатов для мультикластерной сетки.
    • Вы завершили применение сертификатов к мультисетевой мультикластерной топологии.
    • У вас локально установлен istioctl для выполнения этих инструкций.

    Процедура

    Создайте переменную окружения ISTIO_VERSION, определяющую версию Istio для установки

    export ISTIO_VERSION=1.28.3

    Установите IstioCNI в кластере East

    Установите ресурс IstioCNI в кластере East, выполнив следующую команду:

    kubectl --context "${CTX_CLUSTER1}" create namespace istio-cni
    cat <<EOF | kubectl --context "${CTX_CLUSTER1}" apply -f -
    apiVersion: sailoperator.io/v1
    kind: IstioCNI
    metadata:
      name: default
    spec:
      version: v${ISTIO_VERSION}
      namespace: istio-cni
      values:
        cni:
          cniConfDir: /etc/cni/multus/net.d # /etc/cni/net.d в ACP 4.0
          excludeNamespaces:
            - istio-cni
            - kube-system
    EOF

    Установите Istio в кластере East

    1. Создайте ресурс Istio в кластере East, выполнив следующую команду:

      Сохраните следующий ресурс Istio в файл istio-external.yaml:

      istio-external.yaml
      apiVersion: sailoperator.io/v1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-system
        values:
          global:
            meshID: mesh1
            multiCluster:
              clusterName: cluster1
            network: network1
            externalIstiod: true
      1. Это позволяет контрольной плоскости, установленной в кластере East, выступать в роли внешней контрольной плоскости для других удалённых кластеров.

      Примените ресурс Istio с помощью kubectl:

      envsubst < istio-external.yaml | kubectl --context "${CTX_CLUSTER1}" apply -f -
    2. Дождитесь, пока контрольная плоскость не вернёт статус "Ready", выполнив команду:

      kubectl --context "${CTX_CLUSTER1}" wait --for condition=Ready istio/default --timeout=3m
    3. Создайте шлюз East-West в кластере East, выполнив команду:

      WARNING

      Для узлов с версиями ядра Linux ниже 4.11 (например, CentOS 7) требуется дополнительная настройка перед установкой шлюза.

      kubectl --context "${CTX_CLUSTER1}" apply -f https://raw.githubusercontent.com/alauda-mesh/sail-operator/main/docs/deployment-models/resources/east-west-gateway-net1.yaml
      Опционально: Развернуть шлюз East-West на Infra Nodes (нажмите для раскрытия)

      Выполните следующую команду для патча деплоймента шлюза:

      kubectl --context "${CTX_CLUSTER1}" patch deployment istio-eastwestgateway -n istio-system \
        --type='merge' \
        --patch '{
          "spec": {
            "template": {
              "spec": {
                "nodeSelector": {
                  "node-role.kubernetes.io/infra": ""
                },
                "tolerations": [
                  {
                    "effect": "NoSchedule",
                    "key": "node-role.kubernetes.io/infra",
                    "value": "reserved",
                    "operator": "Equal"
                  }
                ]
              }
            }
          }
        }'
    4. Откройте доступ к контрольной плоскости через шлюз, чтобы сервисы в кластере West могли получить к ней доступ, выполнив команду:

      kubectl --context "${CTX_CLUSTER1}" apply -n istio-system -f https://raw.githubusercontent.com/alauda-mesh/sail-operator/main/docs/deployment-models/resources/expose-istiod.yaml
    5. Откройте доступ к сервисам приложений через шлюз, выполнив команду:

      kubectl --context "${CTX_CLUSTER1}" apply -n istio-system -f https://raw.githubusercontent.com/alauda-mesh/sail-operator/main/docs/deployment-models/resources/expose-services.yaml

    Установите IstioCNI в кластере West

    Установите ресурс IstioCNI в кластере West, выполнив следующую команду:

    kubectl --context "${CTX_CLUSTER2}" create namespace istio-cni
    cat <<EOF | kubectl --context "${CTX_CLUSTER2}" apply -f -
    apiVersion: sailoperator.io/v1
    kind: IstioCNI
    metadata:
      name: default
    spec:
      version: v${ISTIO_VERSION}
      namespace: istio-cni
      values:
        cni:
          cniConfDir: /etc/cni/multus/net.d # /etc/cni/net.d в ACP 4.0
          excludeNamespaces:
            - istio-cni
            - kube-system
    EOF

    Установите Istio в кластере West

    1. Сохраните IP-адрес шлюза East-West, работающего в кластере East, выполнив команду:

      export DISCOVERY_ADDRESS=$(kubectl --context="${CTX_CLUSTER1}" \
         -n istio-system get svc istio-eastwestgateway \
         -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      echo "DISCOVERY_ADDRESS=${DISCOVERY_ADDRESS}"
    2. Создайте ресурс Istio в кластере West, выполнив команду:

      cat <<EOF | kubectl --context "${CTX_CLUSTER2}" apply -f -
      apiVersion: sailoperator.io/v1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-system
        profile: remote
        values:
          istiodRemote:
            injectionPath: /inject/cluster/cluster2/net/network2
          global:
            remotePilotAddress: ${DISCOVERY_ADDRESS}
      EOF
    3. Добавьте аннотацию к пространству имён istio-system в кластере West, чтобы оно управлялось контрольной плоскостью в кластере East, выполнив команду:

      kubectl --context="${CTX_CLUSTER2}" annotate namespace istio-system topology.istio.io/controlPlaneClusters=cluster1
    4. Установите удалённый секрет в кластере East, предоставляющий доступ к API-серверу кластера West, выполнив команду:

      istioctl create-remote-secret \
        --context="${CTX_CLUSTER2}" \
        --name=cluster2 | \
        kubectl --context="${CTX_CLUSTER1}" apply -f -
    5. Дождитесь, пока ресурс Istio не вернёт статус "Ready", выполнив команду:

      kubectl --context "${CTX_CLUSTER2}" wait --for condition=Ready istio/default --timeout=3m
    6. Создайте шлюз East-West в кластере West, выполнив команду:

      WARNING

      Для узлов с версиями ядра Linux ниже 4.11 (например, CentOS 7) требуется дополнительная настройка перед установкой шлюза.

      kubectl --context "${CTX_CLUSTER2}" apply -f https://raw.githubusercontent.com/alauda-mesh/sail-operator/main/docs/deployment-models/resources/east-west-gateway-net2.yaml
      Опционально: Развернуть шлюз East-West на Infra Nodes (нажмите для раскрытия)

      Выполните следующую команду для патча деплоймента шлюза:

      kubectl --context "${CTX_CLUSTER2}" patch deployment istio-eastwestgateway -n istio-system \
        --type='merge' \
        --patch '{
          "spec": {
            "template": {
              "spec": {
                "nodeSelector": {
                  "node-role.kubernetes.io/infra": ""
                },
                "tolerations": [
                  {
                    "effect": "NoSchedule",
                    "key": "node-role.kubernetes.io/infra",
                    "value": "reserved",
                    "operator": "Equal"
                  }
                ]
              }
            }
          }
        }'
      NOTE

      Поскольку кластер West установлен с профилем remote, открытие доступа к сервисам приложений в кластере East открывает их на шлюзах East-West обоих кластеров.

    Проверка топологии primary-remote

    Чтобы убедиться, что ваша топология primary-remote функционирует корректно, разверните примерные приложения на двух отдельных кластерах Alauda Container Platform. Цель — создать базовую среду, в которой можно генерировать и наблюдать межкластерный трафик.

    Процедура

    Начните с развертывания необходимых примерных приложений в кластере East.

    В этом кластере будет размещена версия v1 сервиса helloworld.

    1. Создайте отдельное пространство имён для приложений в кластере East.

      kubectl --context="${CTX_CLUSTER1}" create namespace sample
    2. Включите автоматическую инъекцию sidecar Istio для пространства имён sample, применив соответствующую метку.

      kubectl --context="${CTX_CLUSTER1}" label namespace sample istio-injection=enabled
    3. Разверните компоненты приложения helloworld.

      a. Сначала создайте конечную точку сервиса helloworld.

      kubectl --context="${CTX_CLUSTER1}" apply \
        -l service=helloworld -n sample \
        -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld.yaml

      b. Затем разверните экземпляр приложения helloworld версии v1.

      kubectl --context="${CTX_CLUSTER1}" apply \
        -l version=v1 -n sample \
        -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld.yaml
    4. Разверните приложение sleep, которое будет выступать в роли клиента для отправки тестовых запросов.

      kubectl --context="${CTX_CLUSTER1}" apply \
        -n sample \
        -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/sleep/sleep.yaml
    5. Подождите, пока деплоймент helloworld-v1 не станет полностью доступен и готов.

      kubectl --context="${CTX_CLUSTER1}" wait --for condition=available -n sample deployment/helloworld-v1
    6. Аналогично дождитесь, пока деплоймент sleep не получит статус Ready.

      kubectl --context="${CTX_CLUSTER1}" wait --for condition=available -n sample deployment/sleep

    Повторите настройку в кластере West.

    В этом кластере будет размещена версия v2 сервиса helloworld.

    1. Создайте пространство имён sample в кластере West.

      kubectl --context="${CTX_CLUSTER2}" create namespace sample
    2. Включите инъекцию sidecar Istio для этого пространства имён.

      kubectl --context="${CTX_CLUSTER2}" label namespace sample istio-injection=enabled
    3. Разверните компоненты приложения helloworld.

      a. Создайте общий сервисный endpoint helloworld в кластере West.

      kubectl --context="${CTX_CLUSTER2}" apply \
        -l service=helloworld -n sample \
        -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld.yaml

      b. Разверните экземпляр приложения helloworld версии v2.

      kubectl --context="${CTX_CLUSTER2}" apply \
        -l version=v2 -n sample \
        -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld.yaml
    4. Разверните клиентское приложение sleep в кластере West.

      kubectl --context="${CTX_CLUSTER2}" apply \
        -n sample \
        -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/sleep/sleep.yaml
    5. Подождите, пока деплоймент helloworld-v2 не станет полностью доступен.

      kubectl --context="${CTX_CLUSTER2}" wait --for condition=available -n sample deployment/helloworld-v2
    6. Наконец, убедитесь, что деплоймент sleep в кластере West готов.

      kubectl --context="${CTX_CLUSTER2}" wait --for condition=available -n sample deployment/sleep

    Проверка потоков трафика между кластерами

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

    1. Из pod в кластере East отправьте серию из 10 запросов к сервису helloworld.

      for i in {0..9}; do \
        kubectl --context="${CTX_CLUSTER1}" exec -n sample deploy/sleep -c sleep -- curl -sS helloworld.sample:5000/hello; \
      done

      Ожидаемый результат — смешанные ответы от helloworld-v1 (East) и helloworld-v2 (West), что доказывает маршрутизацию запросов по границам кластеров.

      Пример вывода
      Hello version: v1, instance: helloworld-v1-644474db4b-7cwhz
      Hello version: v2, instance: helloworld-v2-645cb7fc46-lnbb7
      Hello version: v1, instance: helloworld-v1-644474db4b-7cwhz
      Hello version: v1, instance: helloworld-v1-644474db4b-7cwhz
      Hello version: v1, instance: helloworld-v1-644474db4b-7cwhz
      Hello version: v2, instance: helloworld-v2-645cb7fc46-lnbb7
      Hello version: v2, instance: helloworld-v2-645cb7fc46-lnbb7
      Hello version: v1, instance: helloworld-v1-644474db4b-7cwhz
      Hello version: v2, instance: helloworld-v2-645cb7fc46-lnbb7
      Hello version: v1, instance: helloworld-v1-644474db4b-7cwhz
    2. Выполните тот же тест из кластера West.

      for i in {0..9}; do \
        kubectl --context="${CTX_CLUSTER2}" exec -n sample deploy/sleep -c sleep -- curl -sS helloworld.sample:5000/hello; \
      done

      Опять же, вы должны увидеть ответы от обеих версий v1 и v2 сервиса, подтверждающие корректную работу балансировки нагрузки primary-remote независимо от источника запроса.

    Удаление топологии primary-remote из среды разработки

    После завершения проверки и экспериментов следует удалить конфигурацию primary-remote, чтобы очистить среду разработки и освободить ресурсы.

    Процедура

    1. Выполните одну команду для удаления всех компонентов Istio и примерных приложений из кластера East.

      kubectl --context="${CTX_CLUSTER1}" delete istio/default istiocni/default ns/sample ns/istio-system ns/istio-cni
    2. Выполните соответствующую команду для очистки кластера West.

      kubectl --context="${CTX_CLUSTER2}" delete istio/default istiocni/default ns/sample ns/istio-system ns/istio-cni