• Русский
  • Установка мультисетевой сетки с первичным и удалённым кластерами

    Установите Istio в топологии с первичным и удалённым кластерами в мультисетевой конфигурации на двух кластерах.

    NOTE

    В этой процедуре CLUSTER1 — это Восточный кластер, а CLUSTER2Западный кластер. Восточный кластер является первичным, а Западный — удалённым.

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

    Содержание

    Топология

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

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

    Топология мультисетевой сетки с первичным и удалённым кластерами

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

    Процедура

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

    export ISTIO_VERSION=1.26.3

    Установите IstioCNI в Восточном кластере

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

    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 в Восточном кластере

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

      Сохраните следующий ресурс 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. Это позволяет управляющей плоскости, установленной в Восточном кластере, выступать в роли внешней управляющей плоскости для других удалённых кластеров.

      Примените ресурс 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. Создайте шлюз Восток-Запад в Восточном кластере, выполнив:

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

      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 в Западном кластере

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

    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 в Западном кластере

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

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

      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 в Западном кластере, чтобы оно управлялось управляющей плоскостью в Восточном кластере:

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

      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. Создайте шлюз Восток-Запад в Западном кластере:

      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
      NOTE

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

    Проверка топологии с первичным и удалённым кластерами

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

    Процедура

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

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

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

      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 \
        -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld.yaml \
        -l service=helloworld -n sample

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

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

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

      kubectl --context="${CTX_CLUSTER1}" wait --for condition=available -n sample deployment/helloworld-v1
    6. Аналогично дождитесь готовности развертывания sleep.

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

    Повторите настройку в Западном кластере.

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

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

      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 в Западном кластере.

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

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

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

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

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

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

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

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

    1. Из pod в Восточном кластере отправьте серию из 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 (Восток) и helloworld-v2 (Запад), что доказывает маршрутизацию запросов через границы кластеров.

      Пример вывода
      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. Выполните тот же тест из Западного кластера.

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

    Удаление топологии с первичным и удалённым кластерами из среды разработки

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

    Процедура

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

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

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