Встановлення Primary-Remote в різних мережах
Дотримуйтесь цього посібника для встановлення панелі управління Istio на cluster1
(primary кластер) та налаштування cluster2
(remote кластер) для використання панелі управління в cluster1
. Кластер cluster1
розміщений в мережі network1
, а cluster2
— в мережі network2
. Це означає, що між podʼами в різних кластерах немає прямого зʼєднання.
Перш ніж продовжити, переконайтеся, що ви виконали кроки з розділу перш ніж почати.
У цій конфігурації кластер cluster1
буде спостерігати за API серверами в обох кластерах для пошуку точок доступу. Таким чином, панель управління зможе забезпечити виявлення сервісів для робочих навантажень в обох кластерах.
Робочі навантаження між кластерами взаємодіють опосередковано, через спеціалізовані шлюзи для трафіку east-west. Шлюз у кожному кластері повинен бути досяжним з іншого кластера.
Сервіси в cluster2
будуть мати доступ до панелі управління в cluster1
через той самий шлюз east-west.
Налаштування стандартної мережі для 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
).
Встановіть Istio як primary у cluster1
за допомогою наступних команд Helm:
Встановіть чарт base
у cluster1
:
$ helm install istio-base istio/base -n istio-system --kube-context "${CTX_CLUSTER1}"
Потім встановіть чарт istiod
в cluster1
з наступними налаштуваннями мультикластера:
$ helm install istiod istio/istiod -n istio-system --kube-context "${CTX_CLUSTER1}" --set global.meshID=mesh1 --set global.externalIstiod=true --set global.multiCluster.clusterName=cluster1 --set global.network=network1
Зверніть увагу, що values.global.externalIstiod
має значення true
. Це дозволить панелі управління, встановленій на cluster1
, також слугувати зовнішньою панеллю управління для інших віддалених кластерів. Коли цю можливість увімкнено, istiod
намагатиметься отримати блокування лідерства, а отже, керувати відповідно анотованими віддаленими кластерами, які до нього приєднано (у цьому випадку, cluster2
).
Встановлення шлюзу east-west в cluster1
Встановіть шлюз у cluster1
, який буде призначений для трафіку east-west. Стандартно цей шлюз буде доступний в Інтернеті. Операційні розгортання можуть вимагати додаткових обмежень доступу (наприклад, через правила брандмауера), щоб запобігти зовнішнім атакам. Зверніться до свого хмарного постачальника, щоб дізнатися про доступні варіанти.
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network network1 | \
istioctl --context="${CTX_CLUSTER1}" install -y -f -
Встановіть шлюз east-west у cluster1
за допомогою наступної команди Helm:
$ helm install istio-eastwestgateway istio/gateway -n istio-system --kube-context "${CTX_CLUSTER1}" --set name=istio-eastwestgateway --set networkGateway=network1
Очікуйте на призначення зовнішньої 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
могли отримувати доступ до виявлення сервісів:
$ 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
Встановіть Istio як remote у cluster2
за допомогою наступних команд Helm:
Install the base
chart in cluster2
:
$ helm install istio-base istio/base -n istio-system --set profile=remote --kube-context "${CTX_CLUSTER2}"
Потім встановіть чарт istiod
у cluster2
з наступними налаштуваннями мультикластера:
$ helm install istiod istio/istiod -n istio-system --set profile=remote --set global.multiCluster.clusterName=cluster2 --set global.network=network2 --set istiodRemote.injectionPath=/inject/cluster/cluster2/net/network2 --set global.configCluster=true --set global.remotePilotAddress="${DISCOVERY_ADDRESS}" --kube-context "${CTX_CLUSTER2}"
Приєднання 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 та експонує сервіси користувача.
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network network2 | \
istioctl --context="${CTX_CLUSTER2}" install -y -f -
Встановіть шлюз east-west у cluster2
за допомогою наступної команди Helm:
$ helm install istio-eastwestgateway istio/gateway -n istio-system --kube-context "${CTX_CLUSTER2}" --set name=istio-eastwestgateway --set networkGateway=network2
Очікуйте, поки для шлюзу 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 та ідентифікаторами робочих навантажень, так само як якби вони були в одній мережі.
$ 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}"
Видаліть встановлення Istio Helm з cluster1
:
$ helm delete istiod -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istio-eastwestgateway -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istio-base -n istio-system --kube-context "${CTX_CLUSTER1}"
Видаліть простір імен istio-system
з cluster1
:
$ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"
Видаліть встановлення Istio Helm з cluster2
:
$ helm delete istiod -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istio-eastwestgateway -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istio-base -n istio-system --kube-context "${CTX_CLUSTER2}"
Видаліть простір імен istio-system
з cluster2
:
$ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"
(Опціонально) Видаліть CRD, встановлені Istio:
Видалення CRD назавжди видаляє всі ресурси Istio, які ви створили у ваших кластерах. Щоб видалити Istio CRD, встановлені у ваших кластерах:
$ kubectl get crd -oname --context "${CTX_CLUSTER1}" | grep --color=never 'istio.io' | xargs kubectl delete --context "${CTX_CLUSTER1}"
$ kubectl get crd -oname --context "${CTX_CLUSTER2}" | grep --color=never 'istio.io' | xargs kubectl delete --context "${CTX_CLUSTER2}"