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

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

    NOTE

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

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

    Топология

    Рабочие нагрузки сервисов по разные стороны границ кластеров взаимодействуют косвенно через выделенные gateway для east-west трафика. Gateway в каждом кластере должен быть доступен из другого кластера.

    Сервисы в cluster2 будут обращаться к control plane в cluster1 через тот же east-west gateway.

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

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

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

      В режиме primary-remote, если адрес внешнего load balancer представляет собой IP-адрес и он является IPv6, развертывание primary-remote не поддерживается в версиях Alauda Service Mesh до v2.1.2.

    • На всех кластерах, входящих в mesh, установлен Alauda Service Mesh v2 Operator.
    • Вы выполнили Создание сертификатов для multi-cluster mesh.
    • Вы выполнили Применение сертификатов к multi-cluster topology.
    • Локально установлен istioctl, чтобы вы могли использовать его для выполнения этих инструкций.

    Процедура

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

    export ISTIO_VERSION=1.28.6

    Установите 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 in 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. Это позволяет control plane, установленному на кластере East, выступать в роли внешнего control plane для других удаленных кластеров.

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

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

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

      WARNING

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

      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 gateway на Infra Nodes (нажмите, чтобы развернуть)

      Выполните следующую команду, чтобы применить patch к deployment gateway:

      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. Откройте доступ к control plane через gateway, чтобы сервисы в кластере West могли обращаться к control plane, выполнив следующую команду:

      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. Откройте доступ к application services через gateway, выполнив следующую команду:

      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 in ACP 4.0
          excludeNamespaces:
            - istio-cni
            - kube-system
    EOF

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

    1. Сохраните IP-адрес East-West gateway, работающего на кластере 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. Добавьте аннотацию к namespace istio-system на кластере West, чтобы он управлялся control plane на кластере East, выполнив следующую команду:

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

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

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

      WARNING

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

      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 gateway на Infra Nodes (нажмите, чтобы развернуть)

      Выполните следующую команду, чтобы применить patch к deployment gateway:

      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 profile, открытие доступа к application services на кластере East делает их доступными на East-West gateways обоих кластеров.

    Проверка primary-remote topology

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

    Процедура

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

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

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

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

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

      a. Сначала создайте endpoint сервиса 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. Затем разверните экземпляр v1 приложения helloworld.

      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. Подождите, пока deployment helloworld-v1 станет полностью доступным и готовым.

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

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

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

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

    1. Создайте namespace sample на кластере West.

      kubectl --context="${CTX_CLUSTER2}" create namespace sample
    2. Также включите для этого namespace sidecar injection 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. Разверните экземпляр v2 приложения helloworld.

      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. Дождитесь, пока deployment helloworld-v2 станет полностью доступным.

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

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

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

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

    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), что подтверждает маршрутизацию запросов service mesh через границы кластеров.

      Пример вывода
      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 topology из среды разработки

    После завершения проверки и экспериментов следует удалить конфигурацию 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