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

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

    NOTE

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

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

    Топология

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

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

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

    • Вы установили плагин Alauda Container Platform Networking for Multus во всех кластерах, входящих в mesh, и kube-ovn должен быть версии v4.1.5 или новее.
    • У вас есть доступ к двум кластерам с поддержкой внешнего load balancer.
    • Вы установили оператор Alauda Service Mesh v2 Operator во всех кластерах, входящих в mesh.
    • Вы выполнили Создание сертификатов для multi-cluster mesh.
    • Вы выполнили Применение сертификатов к multi-network multi-cluster mesh.
    • У вас локально установлен 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, выполнив следующую команду:

      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. Дождитесь, пока control plane вернет условие состояния Ready, выполнив следующую команду:

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

      WARNING

      Для узлов, работающих под управлением Linux kernel версии ниже 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 на инфраструктурных узлах (нажмите, чтобы развернуть)

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

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

      WARNING

      Для узлов, работающих под управлением Linux kernel версии ниже 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 на инфраструктурных узлах (нажмите, чтобы развернуть)

      Выполните следующую команду, чтобы изменить 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"
                  }
                ]
              }
            }
          }
        }'
    4. Опубликуйте сервисы через gateway, выполнив следующую команду:

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

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

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

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

    Проверка multi-cluster topology

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

    Порядок действий

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

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

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

      kubectl --context="${CTX_CLUSTER1}" create namespace sample
    2. Включите автоматическую инъекцию Istio sidecar для namespace 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. Приостановите выполнение, пока deployment helloworld-v1 не станет полностью доступным и готовым.

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

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

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

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

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

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

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

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

    Удаление multi-cluster topology из среды разработки

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

    Порядок действий

    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