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

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

    NOTE

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

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

    Топология

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

    Мульти-первичная мульти-сетевая топология

    Требования

    Процедура

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

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

      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 в Восточном кластере, выполнив команду:

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

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

      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"
                  }
                ]
              }
            }
          }
        }'
    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 в Восточном кластере для доступа к API серверу Западного кластера

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

    Установите remote secret в Западном кластере для доступа к API серверу Восточного кластера

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

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

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

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

    Этот кластер будет хостить версию 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. Создайте общий сервис helloworld в Западном кластере.

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

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

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

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

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

    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