Встановлення Primary-Remote
Слідуйте цьому посібнику, щоб встановити панель управління Istio в cluster1
(primary кластер) та налаштувати cluster2
(remote кластер) для використання панелі управління в cluster1
. Обидва кластери знаходяться в мережі network1
, що означає пряму взаємодію між podʼами в обох кластерах.
Перед тим, як продовжити, обовʼязково виконайте кроки, наведені в розділі перш ніж почати.
У цій конфігурації кластер cluster1
буде спостерігати за API-серверами в обох кластерах для моніторингу точок доступу. Таким чином, панель управління зможе забезпечити виявлення сервісів для робочих навантажень в обох кластерах.
Сервісні навантаження спілкуються безпосередньо (pod-pod) через межі кластерів.
Сервіси у cluster2
отримають доступ до панелі управління в cluster1
через спеціальний шлюз для трафіку east-west.
Налаштування 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
як 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/network1
global:
remotePilotAddress: ${DISCOVERY_ADDRESS}
EOF
Застосуйте конфігурацію до cluster2
:
$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml
Встановіть Istio як віддалений у cluster2
за допомогою наступних команд Helm:
Встановіть чарт base
у 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 istiodRemote.injectionPath=/inject/cluster/cluster2/net/network1 --set global.configCluster=true --set global.remotePilotAddress="${DISCOVERY_ADDRESS}" --kube-context "${CTX_CLUSTER2}"
Приєднання cluster2
як remote кластера до 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}"
Вітаємо! Ви успішно встановили сервісну мережу Istio на основний та віддалений кластери!
Наступні кроки
Тепер ви можете перевірити встановлення.
Очищення
Видаліть 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-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}"