Встановлення Istio із зовнішньою панеллю управління
Цей посібник проведе вас через процес встановлення зовнішньої панелі управління та зʼєднання одного або кількох віддалених кластерів з нею. Модель розгортання зовнішньої панелі управління дозволяє оператору мережі встановлювати та керувати панеллю управління у зовнішньому кластері, відокремленому від кластера даних (або кількох кластерів), які складають мережу. Ця модель розгортання забезпечує чітке розмежування між операторами мережі та адміністраторами мережі. Оператори мережі встановлюють та керують панелями управління Istio, тоді як адміністратори мережі лише конфігурують мережу.
Проксі Envoy (sidecars та шлюзи), що працюють у віддаленому кластері, отримують доступ до зовнішнього istiod через шлюз вхідного трафіку, який відкриває точки доступу, необхідні для виявлення, CA, інʼєкції та валідації.
Хоча конфігурація та управління зовнішньою панеллю управління здійснюється оператором мережі у зовнішньому кластері, перший віддалений кластер, підключений до зовнішньої панелі управління, служить конфігураційним кластером для самої мережі. Адміністратор мережі використовуватиме конфігураційний кластер для налаштування ресурсів мережі (шлюзи, віртуальні сервіси тощо), а також для мережевих служб самої мережі. Зовнішня панель управління віддалено отримуватиме цю конфігурацію з API-сервера Kubernetes, як показано на діаграмі вище.
Перед початком
Кластери
Цей посібник передбачає наявність двох кластерів Kubernetes з будь-якою з підтримуваною версією Kubernetes: 1.28, 1.29, 1.30, 1.31.
Перший кластер буде хостити зовнішню панель управління, встановлену в просторі імен external-istiod
. Також буде встановлено ingress gateway в просторі імен istio-system
, щоб забезпечити доступ до зовнішньої панелі управління з інших кластерів.
Другий кластер є віддаленим кластером, який буде запускати робочі навантаження мережі. Його API-сервер Kubernetes також надає конфігурацію мережі, яку використовує зовнішня панель управління (istiod) для налаштування проксі-серверів навантаження.
Доступ до API-сервера
API-сервер Kubernetes у віддаленому кластері має бути доступний для зовнішньої панелі управління. Багато постачальників хмарних послуг роблять API-сервери публічно доступними через мережеві балансувальники навантаження (NLB). Якщо API-сервер недоступний безпосередньо, вам потрібно буде змінити процедуру встановлення для забезпечення доступу. Наприклад, шлюз east-west, який використовується в мультикластерній конфігурації, також можна використовувати для надання доступу до API-сервера.
Змінні середовища
У цьому посібнику будуть використовуватися наступні змінні середовища для спрощення інструкцій:
Змінна | Опис |
---|---|
CTX_EXTERNAL_CLUSTER | Імʼя контексту у файлі конфігурації Kubernetes, який використовується для доступу до зовнішнього кластера управління. |
CTX_REMOTE_CLUSTER | Імʼя контексту у файлі конфігурації Kubernetes, який використовується для доступу до віддаленого кластера. |
REMOTE_CLUSTER_NAME | Імʼя віддаленого кластера. |
EXTERNAL_ISTIOD_ADDR | Імʼя хосту для шлюзу доступу у кластері зовнішнього управління. Використовується віддаленим кластером для доступу до зовнішнього контролера. |
SSL_SECRET_NAME | Імʼя секрету, що містить TLS сертифікати для шлюзу доступу у кластері зовнішнього управління. |
Налаштуйте змінні CTX_EXTERNAL_CLUSTER
, CTX_REMOTE_CLUSTER
та REMOTE_CLUSTER_NAME
зараз. Інші змінні будуть налаштовані пізніше.
$ export CTX_EXTERNAL_CLUSTER=<your external cluster context>
$ export CTX_REMOTE_CLUSTER=<your remote cluster context>
$ export REMOTE_CLUSTER_NAME=<your remote cluster name>
Конфігурація кластерів
Кроки для оператора сервісної мережі
Оператор мережі відповідає за встановлення та управління зовнішньою панеллю управління Istio на зовнішньому кластері. Це включає в себе: конфігурацію ingress gateway у зовнішньому кластері, що дозволяє віддаленому кластеру отримати доступ до панелі управління; встановлення конфігурації веб-хука інжектора sidecar на віддаленому кластері, щоб він використовував зовнішню панель управління.
Налаштування шлюзу у зовнішньому кластері
Створіть конфігураційний файл для установки шлюзу доступу (ingress gateway), який відкриє порти панелі управління для інших кластерів:
$ cat <<EOF > controlplane-gateway.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: istio-system spec: components: ingressGateways: - name: istio-ingressgateway enabled: true k8s: service: ports: - port: 15021 targetPort: 15021 name: status-port - port: 15012 targetPort: 15012 name: tls-xds - port: 15017 targetPort: 15017 name: tls-webhook EOF
Потім встановіть шлюз у просторі імен
istio-system
на зовнішньому кластері:$ istioctl install -f controlplane-gateway.yaml --context="${CTX_EXTERNAL_CLUSTER}"
Виконайте наступну команду, щоб підтвердити, що шлюз доступу працює:
$ kubectl get po -n istio-system --context="${CTX_EXTERNAL_CLUSTER}" NAME READY STATUS RESTARTS AGE istio-ingressgateway-9d4c7f5c7-7qpzz 1/1 Running 0 29s istiod-68488cd797-mq8dn 1/1 Running 0 38s
Ви помітите, що також створено розгортання
istiod
у просторі іменistio-system
. Це використовується для конфігурації шлюзу доступу і НЕ є панеллю управління, яку використовують віддалені кластери.Налаштуйте своє середовище для експонування сервісу ingress gateway Istio за допомогою публічного імені хосту з TLS.
Встановіть змінну середовища
EXTERNAL_ISTIOD_ADDR
на імʼя хосту таSSL_SECRET_NAME
на секрет, що містить TLS сертифікати:$ export EXTERNAL_ISTIOD_ADDR=<your external istiod host> $ export SSL_SECRET_NAME=<your external istiod secret>
Ці інструкції припускають, що ви відкриваєте шлюз зовнішнього кластеру, використовуючи імʼя хоста з правильно підписаними сертифікатами DNS, оскільки це рекомендований підхід в операцінойму середовищі. Ознайомтеся з завданням secure ingress для отримання додаткової інформації про відкриття secure gateway.
Ваші змінні середовища можуть виглядати так:
$ echo "$EXTERNAL_ISTIOD_ADDR" "$SSL_SECRET_NAME" myhost.example.com myhost-example-credential
Налаштування віддаленого кластера конфігурації
Використовуйте профіль
remote
, щоб налаштувати установку Istio на віддаленому кластері. Це встановлює вебхук інʼєкції, який використовує інжектор зовнішньої панелі управління замість локального. Оскільки цей кластер також буде служити кластером конфігурації, CRD Istio та інші ресурси, які знадобляться на віддаленому кластері, також встановлюються за допомогою встановленняglobal.configCluster
таpilot.configMap
наtrue
:$ cat <<EOF > remote-config-cluster.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: external-istiod spec: profile: remote values: global: istioNamespace: external-istiod configCluster: true pilot: configMap: true istiodRemote: injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/inject/cluster/${REMOTE_CLUSTER_NAME}/net/network1 base: validationURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/validate EOF
Якщо ви використовуєте IP-адресу для
EXTERNAL_ISTIOD_ADDR
замість правильного DNS імені хоста, змініть конфігурацію, щоб вказати адресу виявлення та шляхи замість URL-адрес:$ sed -i'.bk' \ -e "s|injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017|injectionPath: |" \ -e "/istioNamespace:/a\\ remotePilotAddress: ${EXTERNAL_ISTIOD_ADDR}" \ -e '/base:/,+1d' \ remote-config-cluster.yaml; rm remote-config-cluster.yaml.bk
Встановіть конфігурацію у віддаленому кластері:
$ kubectl create namespace external-istiod --context="${CTX_REMOTE_CLUSTER}" $ istioctl install -f remote-config-cluster.yaml --set values.defaultRevision=default --context="${CTX_REMOTE_CLUSTER}"
Підтвердіть, що конфігурація вебхука інʼєкції для віддаленого кластера була встановлена:
$ kubectl get mutatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}" NAME WEBHOOKS AGE istio-revision-tag-default-external-istiod 4 2m2s istio-sidecar-injector-external-istiod 4 2m5s
Підтвердіть, що конфігурації вебхуків для валідації на віддаленому кластері були встановлені:
$ kubectl get validatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}" NAME WEBHOOKS AGE istio-validator-external-istiod 1 6m53s istiod-default-validator 1 6m53s
Налаштування панелі управління у зовнішньому кластері
Створіть простір імен
external-istiod
, який буде використовуватися для розміщення зовнішньої панелі управління:$ kubectl create namespace external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
Панелі управління в зовнішньому кластері потрібен доступ до віддаленого кластера для виявлення сервісів, точок доступу та атрибутів podʼів. Створіть секрет із обліковими даними для доступу до
kube-apiserver
віддаленого кластера та встановіть його у зовнішньому кластері:$ kubectl create sa istiod-service-account -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}" $ istioctl create-remote-secret \ --context="${CTX_REMOTE_CLUSTER}" \ --type=config \ --namespace=external-istiod \ --service-account=istiod \ --create-service-account=false | \ kubectl apply -f - --context="${CTX_EXTERNAL_CLUSTER}"
Створіть конфігурацію Istio для встановлення панелі управління у просторі імен
external-istiod
у зовнішньому кластері. Зверніть увагу, щоistiod
налаштований на використання локально змонтованого configmapistio
, а змінна середовищаSHARED_MESH_CONFIG
має значенняistio
. Це вказуєistiod
обʼєднати значення, встановлені адміністратором сервісної мережі в configmap кластера конфігурації, із значеннями у локальному configmap, встановленому оператором сервісної мережі, які матимуть пріоритет у разі конфліктів:$ cat <<EOF > external-istiod.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: external-istiod spec: profile: empty meshConfig: rootNamespace: external-istiod defaultConfig: discoveryAddress: $EXTERNAL_ISTIOD_ADDR:15012 proxyMetadata: XDS_ROOT_CA: /etc/ssl/certs/ca-certificates.crt CA_ROOT_CA: /etc/ssl/certs/ca-certificates.crt components: pilot: enabled: true k8s: overlays: - kind: Deployment name: istiod patches: - path: spec.template.spec.volumes[100] value: |- name: config-volume configMap: name: istio - path: spec.template.spec.volumes[100] value: |- name: inject-volume configMap: name: istio-sidecar-injector - path: spec.template.spec.containers[0].volumeMounts[100] value: |- name: config-volume mountPath: /etc/istio/config - path: spec.template.spec.containers[0].volumeMounts[100] value: |- name: inject-volume mountPath: /var/lib/istio/inject env: - name: INJECTION_WEBHOOK_CONFIG_NAME value: "" - name: VALIDATION_WEBHOOK_CONFIG_NAME value: "" - name: EXTERNAL_ISTIOD value: "true" - name: LOCAL_CLUSTER_SECRET_WATCHER value: "true" - name: CLUSTER_ID value: ${REMOTE_CLUSTER_NAME} - name: SHARED_MESH_CONFIG value: istio values: global: externalIstiod: true caAddress: $EXTERNAL_ISTIOD_ADDR:15012 istioNamespace: external-istiod operatorManageWebhooks: true configValidation: false meshID: mesh1 multiCluster: clusterName: ${REMOTE_CLUSTER_NAME} network: network1 EOF
Якщо ви використовуєте IP-адресу для
EXTERNAL_ISTIOD_ADDR
замість правильного DNS імені хоста, видаліть метадані проксі та оновіть змінні середовища конфігурації вебхука в конфігурації:$ sed -i'.bk' \ -e '/proxyMetadata:/,+2d' \ -e '/INJECTION_WEBHOOK_CONFIG_NAME/{n;s/value: ""/value: istio-sidecar-injector-external-istiod/;}' \ -e '/VALIDATION_WEBHOOK_CONFIG_NAME/{n;s/value: ""/value: istio-validator-external-istiod/;}' \ external-istiod.yaml ; rm external-istiod.yaml.bk
Застосуйте конфігурацію Istio у зовнішньому кластері:
$ istioctl install -f external-istiod.yaml --context="${CTX_EXTERNAL_CLUSTER}"
Підтвердіть, що зовнішній
istiod
був успішно розгорнутий:$ kubectl get po -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}" NAME READY STATUS RESTARTS AGE istiod-779bd6fdcf-bd6rg 1/1 Running 0 70s
Створіть конфігурації Istio
Gateway
,VirtualService
таDestinationRule
для маршрутизації трафіку від шлюзу ingress до зовнішньої панелі управління:$ cat <<EOF > external-istiod-gw.yaml apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: external-istiod-gw namespace: external-istiod spec: selector: istio: ingressgateway servers: - port: number: 15012 protocol: https name: https-XDS tls: mode: SIMPLE credentialName: $SSL_SECRET_NAME hosts: - $EXTERNAL_ISTIOD_ADDR - port: number: 15017 protocol: https name: https-WEBHOOK tls: mode: SIMPLE credentialName: $SSL_SECRET_NAME hosts: - $EXTERNAL_ISTIOD_ADDR --- apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: external-istiod-vs namespace: external-istiod spec: hosts: - $EXTERNAL_ISTIOD_ADDR gateways: - external-istiod-gw http: - match: - port: 15012 route: - destination: host: istiod.external-istiod.svc.cluster.local port: number: 15012 - match: - port: 15017 route: - destination: host: istiod.external-istiod.svc.cluster.local port: number: 443 --- apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: external-istiod-dr namespace: external-istiod spec: host: istiod.external-istiod.svc.cluster.local trafficPolicy: portLevelSettings: - port: number: 15012 tls: mode: SIMPLE connectionPool: http: h2UpgradePolicy: UPGRADE - port: number: 443 tls: mode: SIMPLE EOF
Якщо ви використовуєте IP-адресу для
EXTERNAL_ISTIOD_ADDR
замість правильного DNS імені хоста, змініть конфігурацію. ВидалітьDestinationRule
, не завершуйте TLS уGateway
та використовуйте маршрутизацію TLS уVirtualService
:$ sed -i'.bk' \ -e '55,$d' \ -e 's/mode: SIMPLE/mode: PASSTHROUGH/' -e '/credentialName:/d' -e "s/${EXTERNAL_ISTIOD_ADDR}/\"*\"/" \ -e 's/http:/tls:/' -e 's/https/tls/' -e '/route:/i\ sniHosts:\ - "*"' \ external-istiod-gw.yaml; rm external-istiod-gw.yaml.bk
Застосуйте конфігурацію у зовнішньому кластері:
$ kubectl apply -f external-istiod-gw.yaml --context="${CTX_EXTERNAL_CLUSTER}"
Кроки для адміністратора сервісної мережі
Тепер, коли Istio успішно розгорнуто, адміністратору сервісної мережі залишається лише розгорнути та налаштувати сервіси в мережі, включаючи шлюзи за потреби.
Розгортання демонстраційного застосунку
Створіть та позначте для інʼєкції простір імен
sample
на віддаленому кластері:$ kubectl create --context="${CTX_REMOTE_CLUSTER}" namespace sample $ kubectl label --context="${CTX_REMOTE_CLUSTER}" namespace sample istio-injection=enabled
Розгорніть зразки
helloworld
(версіяv1
) таcurl
:$ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l service=helloworld -n sample --context="${CTX_REMOTE_CLUSTER}" $ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l version=v1 -n sample --context="${CTX_REMOTE_CLUSTER}" $ kubectl apply -f @samples/curl/curl.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
Зачекайте кілька секунд, поки podʼи
helloworld
таcurl
запустяться з інтегрованими sidecar контейнерами:$ kubectl get pod -n sample --context="${CTX_REMOTE_CLUSTER}" NAME READY STATUS RESTARTS AGE curl-64d7d56698-wqjnm 2/2 Running 0 9s helloworld-v1-776f57d5f6-s7zfc 2/2 Running 0 10s
Надішліть запит з podʼа
curl
до сервісаhelloworld
:$ kubectl exec --context="${CTX_REMOTE_CLUSTER}" -n sample -c curl \ "$(kubectl get pod --context="${CTX_REMOTE_CLUSTER}" -n sample -l app=curl -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
Увімкнення шлюзів
Увімкніть шлюз ingress у віддаленому кластері:
$ cat <<EOF > istio-ingressgateway.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: ingress-install
spec:
profile: empty
components:
ingressGateways:
- namespace: external-istiod
name: istio-ingressgateway
enabled: true
values:
gateways:
istio-ingressgateway:
injectionTemplate: gateway
EOF
$ istioctl install -f istio-ingressgateway.yaml --set values.global.istioNamespace=external-istiod --context="${CTX_REMOTE_CLUSTER}"
$ helm install istio-ingressgateway istio/gateway -n external-istiod --kube-context="${CTX_REMOTE_CLUSTER}"
Дивіться Встановлення шлюзів для детальної документації щодо встановлення шлюзів.
Ви також можете опціонально увімкнути інші шлюзи. Наприклад, шлюз egress:
$ cat <<EOF > istio-egressgateway.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: egress-install
spec:
profile: empty
components:
egressGateways:
- namespace: external-istiod
name: istio-egressgateway
enabled: true
values:
gateways:
istio-egressgateway:
injectionTemplate: gateway
EOF
$ istioctl install -f istio-egressgateway.yaml --set values.global.istioNamespace=external-istiod --context="${CTX_REMOTE_CLUSTER}"
$ helm install istio-egressgateway istio/gateway -n external-istiod --kube-context="${CTX_REMOTE_CLUSTER}" --set service.type=ClusterIP
Дивіться Встановлення шлюзів для детальної документації щодо встановлення шлюзів.
Налаштування та тестування ingress gateway
- Переконайтеся, що кластер готовий до налаштування шлюзу:
Підтвердіть, що шлюз Istio ingress працює:
$ kubectl get pod -l app=istio-ingressgateway -n external-istiod --context="${CTX_REMOTE_CLUSTER}"
NAME READY STATUS RESTARTS AGE
istio-ingressgateway-7bcd5c6bbd-kmtl4 1/1 Running 0 8m4s
CRD Gateway API Kubernetes зазвичай стандартно не встановлюються у більшості кластерів Kubernetes, тому переконайтеся, що вони встановлені перед використанням Gateway API:
$ kubectl get crd gateways.gateway.networking.k8s.io --context="${CTX_REMOTE_CLUSTER}" &> /dev/null || \
{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.2.0" | kubectl apply -f - --context="${CTX_REMOTE_CLUSTER}"; }
- Експонуйте застосунок
helloworld
через шлюз ingress:
$ kubectl apply -f @samples/helloworld/helloworld-gateway.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
$ kubectl apply -f @samples/helloworld/gateway-api/helloworld-gateway.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
- Встановіть змінну середовища
GATEWAY_URL
(дивіться визначення IP та портів ingress для деталей):
$ export INGRESS_HOST=$(kubectl -n external-istiod --context="${CTX_REMOTE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_PORT=$(kubectl -n external-istiod --context="${CTX_REMOTE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
$ kubectl -n sample --context="${CTX_REMOTE_CLUSTER}" wait --for=condition=programmed gtw helloworld-gateway
$ export INGRESS_HOST=$(kubectl -n sample --context="${CTX_REMOTE_CLUSTER}" get gtw helloworld-gateway -o jsonpath='{.status.addresses[0].value}')
$ export GATEWAY_URL=$INGRESS_HOST:80
Підтвердіть, що ви можете отримати доступ до застосунку
helloworld
через шлюз ingress:$ curl -s "http://${GATEWAY_URL}/hello" Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
Додавання кластерів до mesh (необовʼязково)
У цьому розділі показано, як розширити існуючу сервісну мережу із зовнішньою панеллю управління до мультикластера, додавши ще один віддалений кластер. Це дозволяє легко розподіляти сервіси та використовувати маршрутизацію з урахуванням місцезнаходження та аварійне перемикання для підтримки високої доступності вашого застосунку.
На відміну від першого віддаленого кластера, другий та наступні кластери, додані до тієї ж зовнішньої панелі управління, не надають конфігурацію mesh, а натомість є лише джерелами конфігурації точок доступу, як і віддалені кластери в конфігурації мультикластера Istio типу primary-remote.
Щоб продовжити, вам знадобиться ще один кластер Kubernetes для другого віддаленого кластера mesh. Встановіть наступні змінні середовища для імені контексту та імені кластера:
$ export CTX_SECOND_CLUSTER=<your second remote cluster context>
$ export SECOND_CLUSTER_NAME=<your second remote cluster name>
Реєстрація нового кластера
Створіть конфігурацію для встановлення Istio на віддаленому кластері, яка встановлює веб-хук інʼєкції, що використовує інжектор зовнішньої панелі управілння, замість локальної:
$ cat <<EOF > second-remote-cluster.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: external-istiod spec: profile: remote values: global: istioNamespace: external-istiod istiodRemote: injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/inject/cluster/${SECOND_CLUSTER_NAME}/net/network2 EOF
Якщо ви використовуєте IP-адресу для
EXTERNAL_ISTIOD_ADDR
замість правильного DNS-імені, змініть конфігурацію, щоб вказати адресу виявлення та шлях замість URL для інʼєкції:$ sed -i'.bk' \ -e "s|injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017|injectionPath: |" \ -e "/istioNamespace:/a\\ remotePilotAddress: ${EXTERNAL_ISTIOD_ADDR}" \ second-remote-cluster.yaml; rm second-remote-cluster.yaml.bk
Створіть і додайте анотацію до системного простору імен у віддаленому кластері:
$ kubectl create namespace external-istiod --context="${CTX_SECOND_CLUSTER}" $ kubectl annotate namespace external-istiod "topology.istio.io/controlPlaneClusters=${REMOTE_CLUSTER_NAME}" --context="${CTX_SECOND_CLUSTER}"
Анотація
topology.istio.io/controlPlaneClusters
вказує ID кластера зовнішньої панелі управілння, яка повинна керувати цим віддаленим кластером. Зверніть увагу, що це імʼя першого віддаленого (конфігураційного) кластера, яке було використано для встановлення ID кластера зовнішньої панелі управління під час його встановлення у зовнішньому кластері раніше.Встановіть конфігурацію у віддаленому кластері:
$ istioctl install -f second-remote-cluster.yaml --context="${CTX_SECOND_CLUSTER}"
Переконайтеся, що конфігурація веб-хука інʼєкції у віддаленому кластері була встановлена:
$ kubectl get mutatingwebhookconfiguration --context="${CTX_SECOND_CLUSTER}" NAME WEBHOOKS AGE istio-sidecar-injector-external-istiod 4 4m13s
Створіть секрет із обліковими даними, щоб дозволити панелі управління отримувати доступ до точок доступу у другому віддаленому кластері, і встановіть його:
$ istioctl create-remote-secret \ --context="${CTX_SECOND_CLUSTER}" \ --name="${SECOND_CLUSTER_NAME}" \ --type=remote \ --namespace=external-istiod \ --create-service-account=false | \ kubectl apply -f - --context="${CTX_EXTERNAL_CLUSTER}"
Зауважте, що на відміну від першого віддаленого кластера mesh, який також служить конфігураційним кластером, цього разу аргумент
--type
встановлено якremote
, замістьconfig
.
Налаштування шлюзів між кластерами (east-west gateways)
Розгорніть шлюзи між кластерами на обох віддалених кластерах:
$ @samples/multicluster/gen-eastwest-gateway.sh@ \ --network network1 > eastwest-gateway-1.yaml $ istioctl manifest generate -f eastwest-gateway-1.yaml \ --set values.global.istioNamespace=external-istiod | \ kubectl apply --context="${CTX_REMOTE_CLUSTER}" -f -
$ @samples/multicluster/gen-eastwest-gateway.sh@ \ --network network2 > eastwest-gateway-2.yaml $ istioctl manifest generate -f eastwest-gateway-2.yaml \ --set values.global.istioNamespace=external-istiod | \ kubectl apply --context="${CTX_SECOND_CLUSTER}" -f -
Зачекайте, поки шлюзи між кластерами отримають зовнішні IP-адреси:
$ kubectl --context="${CTX_REMOTE_CLUSTER}" get svc istio-eastwestgateway -n external-istiod NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-eastwestgateway LoadBalancer 10.0.12.121 34.122.91.98 ... 51s
$ kubectl --context="${CTX_SECOND_CLUSTER}" get svc istio-eastwestgateway -n external-istiod NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-eastwestgateway LoadBalancer 10.0.12.121 34.122.91.99 ... 51s
Експонуйте сервіси через шлюзи між кластерами:
$ kubectl --context="${CTX_REMOTE_CLUSTER}" apply -n external-istiod -f \ @samples/multicluster/expose-services.yaml@
Перевірка установки
Створіть та позначте для інʼєкції простір імен
sample
на віддаленому кластері:$ kubectl create --context="${CTX_SECOND_CLUSTER}" namespace sample $ kubectl label --context="${CTX_SECOND_CLUSTER}" namespace sample istio-injection=enabled
Розгорніть зразки
helloworld
(v2
) таcurl
:$ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l service=helloworld -n sample --context="${CTX_SECOND_CLUSTER}" $ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l version=v2 -n sample --context="${CTX_SECOND_CLUSTER}" $ kubectl apply -f @samples/curl/curl.yaml@ -n sample --context="${CTX_SECOND_CLUSTER}"
Зачекайте кілька секунд, поки контейнери
helloworld
таcurl
запустяться з впровадженими sidecar контейнерами:$ kubectl get pod -n sample --context="${CTX_SECOND_CLUSTER}" NAME READY STATUS RESTARTS AGE curl-557747455f-wtdbr 2/2 Running 0 9s helloworld-v2-54df5f84b-9hxgw 2/2 Running 0 10s
Надішліть запит з контейнера
curl
до сервісуhelloworld
:$ kubectl exec --context="${CTX_SECOND_CLUSTER}" -n sample -c curl \ "$(kubectl get pod --context="${CTX_SECOND_CLUSTER}" -n sample -l app=curl -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw
Підтвердіть, що при доступі до застосунку
helloworld
кілька разів через шлюз входу обидві версіїv1
таv2
тепер викликаються:$ for i in {1..10}; do curl -s "http://${GATEWAY_URL}/hello"; done Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw ...
Очистка
Очистіть кластер зовнішньої панелі управління:
$ kubectl delete -f external-istiod-gw.yaml --context="${CTX_EXTERNAL_CLUSTER}"
$ istioctl uninstall -y --purge -f external-istiod.yaml --context="${CTX_EXTERNAL_CLUSTER}"
$ kubectl delete ns istio-system external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
$ rm controlplane-gateway.yaml external-istiod.yaml external-istiod-gw.yaml
Очистіть кластер конфігурації віддаленого управління:
$ kubectl delete ns sample --context="${CTX_REMOTE_CLUSTER}"
$ istioctl uninstall -y --purge -f remote-config-cluster.yaml --set values.defaultRevision=default --context="${CTX_REMOTE_CLUSTER}"
$ kubectl delete ns external-istiod --context="${CTX_REMOTE_CLUSTER}"
$ rm remote-config-cluster.yaml istio-ingressgateway.yaml
$ rm istio-egressgateway.yaml eastwest-gateway-1.yaml || true
Очистіть необовʼязковий другий віддалений кластер, якщо ви його встановлювали:
$ kubectl delete ns sample --context="${CTX_SECOND_CLUSTER}"
$ istioctl uninstall -y --purge -f second-remote-cluster.yaml --context="${CTX_SECOND_CLUSTER}"
$ kubectl delete ns external-istiod --context="${CTX_SECOND_CLUSTER}"
$ rm second-remote-cluster.yaml eastwest-gateway-2.yaml