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

    Установите Istio в топологии мульти-первичной мульти-сетевой mesh-сети на двух кластерах.

    NOTE

    В этой процедуре CLUSTER1 — это кластер East, а CLUSTER2 — кластер West.

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

    Топология

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

    Топология мульти-первичной мульти-сетевой mesh-сети

    Требования

    Содержание

    Процедура

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

    export ISTIO_VERSION=1.26.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, выполнив следующую команду:

      cat <<EOF | kubectl --context "${CTX_CLUSTER1}" apply -f -
      apiVersion: sailoperator.io/v1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-system
        values:
          global:
            meshID: mesh1
            network: network1
            multiCluster:
              clusterName: cluster1
      EOF
    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
    4. Откройте доступ к сервисам через шлюз, выполнив команду:

      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. Создайте ресурс 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
        values:
          global:
            meshID: mesh1
            network: network2
            multiCluster:
              clusterName: cluster2
      EOF
    2. Дождитесь, пока управляющая плоскость не вернёт состояние Ready, выполнив команду:

      kubectl --context "${CTX_CLUSTER2}" wait --for condition=Ready istio/default --timeout=3m
    3. Создайте шлюз 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
    4. Откройте доступ к сервисам через шлюз, выполнив команду:

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

    Установите remote secret в кластере East для доступа к API серверу кластера West

    istioctl create-remote-secret \
      --context="${CTX_CLUSTER2}" \
      --name=cluster2 \
      --create-service-account=false | \
      kubectl --context="${CTX_CLUSTER1}" apply -f -

    Установите remote secret в кластере West для доступа к API серверу кластера East

    istioctl create-remote-secret \
      --context="${CTX_CLUSTER1}" \
      --name=cluster1 \
      --create-service-account=false | \
      kubectl --context="${CTX_CLUSTER2}" apply -f -

    Проверка мульти-кластерной топологии

    Чтобы убедиться, что ваша мульти-кластерная топология работает корректно, разверните примерные приложения на двух отдельных кластерах 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. Сначала создайте сервисный endpoint 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. Затем разверните экземпляр v1 приложения helloworld.

      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. Аналогично дождитесь состояния Ready для развертывания sleep.

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

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

      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 в кластере West.

      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 в кластере West готово.

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

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

    После развертывания и запуска приложений в обоих кластерах следующий шаг — отправить запросы и подтвердить, что трафик корректно балансируется по всей 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), что доказывает маршрутизацию запросов через границы кластеров.

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

    Удаление мульти-кластерной топологии из среды разработки

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

    Процедура

    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