Встановлення Primary-Remote в різних мережах

Дотримуйтесь цього посібника для встановлення панелі управління Istio на cluster1 (primary кластер) та налаштування cluster2 (remote кластер) для використання панелі управління в cluster1. Кластер cluster1 розміщений в мережі network1, а cluster2 — в мережі network2. Це означає, що між podʼами в різних кластерах немає прямого зʼєднання.

Перш ніж продовжити, переконайтеся, що ви виконали кроки з розділу перш ніж почати.

У цій конфігурації кластер cluster1 буде спостерігати за API серверами в обох кластерах для пошуку точок доступу. Таким чином, панель управління зможе забезпечити виявлення сервісів для робочих навантажень в обох кластерах.

Робочі навантаження між кластерами взаємодіють опосередковано, через спеціалізовані шлюзи для трафіку east-west. Шлюз у кожному кластері повинен бути досяжним з іншого кластера.

Сервіси в cluster2 будуть мати доступ до панелі управління в cluster1 через той самий шлюз east-west.

Primary і remote кластери в різних мережах
Primary і remote кластери в різних мережах

Налаштування стандартної мережі для cluster1

Якщо простір імен istio-system вже створений, необхідно встановити для нього мережу кластера:

$ kubectl --context="${CTX_CLUSTER1}" get namespace istio-system && \
  kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1

Налаштування cluster1 як primary кластера

Створіть конфігурацію istioctl для cluster1:

Встановіть Istio як primary у cluster1 за допомогою istioctl та API IstioOperator.

$ cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster1
      network: network1
      externalIstiod: true
EOF

Застосуйте конфігурацію до cluster1:

$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml

Зверніть увагу, що параметр values.global.externalIstiod встановлено як true. Це дозволяє панелі управління, встановленій в cluster1, також слугувати зовнішньою панеллю управління для інших віддалених кластерів. Коли цю функцію увімкнено, istiod намагатиметься отримати блокування лідерства і, відповідно, керувати належним чином позначеними віддаленими кластерами, які приєднані до нього (у цьому випадку, cluster2).

Встановлення шлюзу east-west в cluster1

Встановіть шлюз у cluster1, який буде призначений для трафіку east-west. Стандартно цей шлюз буде доступний в Інтернеті. Операційні розгортання можуть вимагати додаткових обмежень доступу (наприклад, через правила брандмауера), щоб запобігти зовнішнім атакам. Зверніться до свого хмарного постачальника, щоб дізнатися про доступні варіанти.

Zip
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --network network1 | \
    istioctl --context="${CTX_CLUSTER1}" install -y -f -

Очікуйте на призначення зовнішньої IP-адреси для шлюзу east-west:

$ kubectl --context="${CTX_CLUSTER1}" get svc istio-eastwestgateway -n istio-system
NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
istio-eastwestgateway   LoadBalancer   10.80.6.124   34.75.71.237   ...       51s

Відкриття доступу до панелі управління в cluster1

Перш ніж ми зможемо виконати встановлення в cluster2, необхідно спочатку відкрити доступ до панелі управління в cluster1, щоб сервіси в cluster2 могли отримувати доступ до виявлення сервісів:

Zip
$ kubectl apply --context="${CTX_CLUSTER1}" -n istio-system -f \
    @samples/multicluster/expose-istiod.yaml@

Налаштування панелі управління для cluster2

Необхідно визначити зовнішню панель управління, яка повинна керувати cluster2, анотувавши простір імен istio-system:

$ kubectl --context="${CTX_CLUSTER2}" create namespace istio-system
$ kubectl --context="${CTX_CLUSTER2}" annotate namespace istio-system topology.istio.io/controlPlaneClusters=cluster1

Встановлення анотації простору імен topology.istio.io/controlPlaneClusters в cluster1 інструктує istiod, що працює в тому ж просторі імен (istio-system у цьому випадку) в cluster1, управляти cluster2, коли він буде приєднаний як віддалений кластер.

Налаштування стандартної мережі для cluster2

Встановіть мережу для cluster2, додавши мітку до простору імен istio-system:

$ kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2

Налаштування cluster2 як remote кластера

Збережіть адресу шлюзу east-west cluster1.

$ export DISCOVERY_ADDRESS=$(kubectl \
    --context="${CTX_CLUSTER1}" \
    -n istio-system get svc istio-eastwestgateway \
    -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

Тепер створіть віддалену конфігурацію на cluster2.

$ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: remote
  values:
    istiodRemote:
      injectionPath: /inject/cluster/cluster2/net/network2
    global:
      remotePilotAddress: ${DISCOVERY_ADDRESS}
EOF

Застосуйте конфігурацію до cluster2:

$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml

Приєднання cluster2 як віддаленого кластера до cluster1

Щоб приєднати віддалений кластер до його панелі управління, ми надаємо панелі управління в cluster1 доступ до API сервера в cluster2. Це зробить наступне:

  • Дозволяє панелі управління автентифікувати запити на зʼєднання від робочих навантажень, що працюють в cluster2. Без доступу до API сервера панель управління відхилить запити.

  • Дозволяє виявлення точок доступу сервісів, що працюють в cluster2.

Оскільки це включено в анотацію простору імен topology.istio.io/controlPlaneClusters, панель управління на cluster1 також:

  • Застосовує патчі сертифікати в вебхуках в cluster2.

  • Запускає контролер просторів імен, який записує configmap в простори імен в cluster2.

Щоб надати доступ до API сервера для cluster2, ми створюємо віддалений секрет і застосовуємо його до cluster1:

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

Встановлення шлюзу east-west в cluster2

Як і в cluster1 вище, встановіть шлюз у cluster2, який буде призначений для трафіку east-west та експонує сервіси користувача.

Zip
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --network network2 | \
    istioctl --context="${CTX_CLUSTER2}" install -y -f -

Очікуйте, поки для шлюзу east-west буде призначена зовнішня IP-адреса:

$ kubectl --context="${CTX_CLUSTER2}" get svc istio-eastwestgateway -n istio-system
NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
istio-eastwestgateway   LoadBalancer   10.0.12.121   34.122.91.98   ...       51s

Експонування сервісів у cluster1 та cluster2

Оскільки кластери знаходяться в окремих мережах, нам також потрібно відкрити всі сервіси користувачів (*.local) шлюзі east-west в обох кластерах. Хоча ці шлюзи є публічними в Інтернет, сервіси за ними можуть бути доступні тільки сервісам з довіреними сертифікатами mTLS та ідентифікаторами робочих навантажень, так само як якби вони були в одній мережі.

Zip
$ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
    @samples/multicluster/expose-services.yaml@

Вітаємо! Ви успішно встановили Istio mesh в основному та віддаленому кластерах в різних мережах!

Подальші кроки

Тепер ви можете перевірити встановлення.

Очищення

Видаліть Istio з cluster1 і cluster2 за допомогою того ж механізму, за допомогою якого ви встановлювали Istio (istioctl або Helm).

Видаліть Istio з cluster1:

$ istioctl uninstall --context="${CTX_CLUSTER1}" -y --purge
$ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"

Видаліть Istio з cluster2:

$ istioctl uninstall --context="${CTX_CLUSTER2}" -y --purge
$ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"
Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!