Встановлення ambient multi-primary в різних мережах
Слідуйте цьому посібнику, щоб встановити панель управління Istio на cluster1
і cluster2
, зробивши кожен з них основним кластером (це наразі єдина підтримувана конфігурація в режимі ambient). Кластер cluster1
знаходиться в мережі network1
, тоді як cluster2
— в мережі network2
. Це означає, що між podʼами кластерів немає прямого зʼєднання.
Перед продовженням обовʼязково виконайте кроки в розділі Як розпочати.
У цій конфігурації як cluster1
, так і cluster2
спостерігають за API-серверами в кожному кластері для отримання точок доступу.
Робочі навантаження сервісів між кластерами спілкуються опосередковано, через спеціальні шлюзи для схід-захід трафіку. Шлюз у кожному кластері повинен бути доступним з іншого кластера.
Встановлення стандартної мережі для cluster1
Якщо простір імен istio-system вже створено, нам потрібно встановити мережу кластера там:
$ kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1
Налаштування cluster1
як основного
Створіть конфігурацію istioctl
для cluster1
:
Встановіть Istio як основний у cluster1
за допомогою istioctl та API IstioOperator
.
$ cat <<EOF > cluster1.yaml
apiVersion: insall.istio.io/v1alpha1
kind: IstioOperator
spec:
profile: ambient
components:
pilot:
k8s:
env:
- name: AMBIENT_ENABLE_MULTI_NETWORK
value: "true"
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster1
network: network1
EOF
Застосувати конфігурацію до cluster1
:
$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml
Встановіть Istio як основний у 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.multiCluster.clusterName=cluster1 --set global.network=network1 --set profile=ambient --set env.AMBIENT_ENABLE_MULTI_NETWORK="true"
Далі встановіть агента вузла CNI в режимі ambient:
$ helm install istio-cni istio/cni -n istio-system --kube-context "${CTX_CLUSTER1}" --set profile=ambient
Нарешті, встановіть пенель даних ztunnel:
$ helm install ztunnel istio/ztunnel -n istio-system --kube-context "${CTX_CLUSTER1}" --set multiCluster.clusterName=cluster1 --set global.network=network1
Встановлення ambient шлюзу схід-захід в cluster1
Встановіть шлюз у cluster1
, який призначений для ambient east-west трафіку. Зверніть увагу, що в залежності від вашого середовища Kubernetes, цей шлюз може бути розгорнутий та бути стандартно доступним в Інтернет. Системи у виробничому середовищі можуть вимагати додаткових обмежень доступу (наприклад, через правила брандмауера), щоб запобігти зовнішнім атакам. Звіртесь з документацією вашого постачальника хмари, щоб дізнатися, які варіанти доступні.
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network network1 \
--ambient | \
kubectl --context="${CTX_CLUSTER1}" apply -f -
Встановіть шлюз схід-захід у cluster1
, використовуючи таке визначення шлюзу:
$ cat <<EOF > cluster1-ewgateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: istio-eastwestgateway
namespace: istio-system
labels:
topology.istio.io/network: "network1"
spec:
gatewayClassName: istio-east-west
listeners:
- name: mesh
port: 15008
protocol: HBONE
tls:
mode: Terminate # represents double-HBONE
options:
gateway.istio.io/tls-terminate-mode: ISTIO_MUTUAL
EOF
Застосуйте конфігурацію до cluster1
:
$ kubectl apply --context="${CTX_CLUSTER1}" -f cluster1-ewgateway.yaml
Дочекайтеся, поки шлюзу схід-захід буде призначено зовнішню IP-адресу:
$ 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
Встановлення стандартної мережі для cluster2
Якщо простір імен istio-system вже створено, нам потрібно встановити мережу кластера там:
$ kubectl --context="${CTX_CLUSTER2}" get namespace istio-system && \
kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2
Налаштування cluster2
як основного
Створіть конфігурацію istioctl
для cluster2
:
Встановіть Istio як основний у cluster2
, використовуючи istioctl та API IstioOperator
.
$ cat <<EOF > cluster2.yaml
apiVersion: insall.istio.io/v1alpha1
kind: IstioOperator
spec:
profile: ambient
components:
pilot:
k8s:
env:
- name: AMBIENT_ENABLE_MULTI_NETWORK
value: "true"
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster2
network: network2
EOF
Застосуйте конфігурацію до cluster2
:
$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml
Встановіть Istio як основний у cluster2
, використовуючи такі команди Helm:
Встановіть чарт base
у cluster2
:
$ helm install istio-base istio/base -n istio-system --kube-context "${CTX_CLUSTER2}"
Потім встановіть чарт istiod
у cluster2
із такими налаштуваннями для мультикластеру:
$ helm install istiod istio/istiod -n istio-system --kube-context "${CTX_CLUSTER2}" --set global.meshID=mesh1 --set global.multiCluster.clusterName=cluster2 --set global.network=network2 --set profile=ambient --set env.AMBIENT_ENABLE_MULTI_NETWORK="true"
Далі встановіть агент вузла CNI в режимі ambient:
$ helm install istio-cni istio/cni -n istio-system --kube-context "${CTX_CLUSTER2}" --set profile=ambient
Нарешті, встановіть панель даних ztunnel:
$ helm install ztunnel istio/ztunnel -n istio-system --kube-context "${CTX_CLUSTER2}" --set multiCluster.clusterName=cluster2 --set global.network=network2
Встановлення ambient шлюзу схід-захід в cluster2
Як і в cluster1
, встановіть шлюз у cluster2
, який буде призначений для трафіку схід-захід.
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network network2 \
--ambient | \
kubectl apply --context="${CTX_CLUSTER2}" -f -
Встановіть шлюз схід-захід у cluster2
, використовуючи таке визначення Gateway:
$ cat <<EOF > cluster2-ewgateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: istio-eastwestgateway
namespace: istio-system
labels:
topology.istio.io/network: "network2"
spec:
gatewayClassName: istio-east-west
listeners:
- name: mesh
port: 15008
protocol: HBONE
tls:
mode: Terminate # represents double-HBONE
options:
gateway.istio.io/tls-terminate-mode: ISTIO_MUTUAL
EOF
Застосуйте конфігурацію до cluster2
:
$ kubectl apply --context="${CTX_CLUSTER2}" -f cluster2-ewgateway.yaml
Дочекайтеся, поки шлюзу схід-захід буде призначено зовнішню 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
Увімкнення виявлення точок доступу
Встановіть віддалений секрет у cluster2
, який надає доступ до API-сервера cluster1
.
$ istioctl create-remote-secret \
--context="${CTX_CLUSTER1}" \
--name=cluster1 | \
kubectl apply -f - --context="${CTX_CLUSTER2}"
Встановіть віддалений секрет у cluster1
, який надає доступ до сервера API cluster2
.
$ 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 ztunnel -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istio-cni -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istiod -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 ztunnel -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istio-cni -n istio-system --kube-context "${CTX_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, які ви створили у своїх кластерах. Щоб видалити CRD Istio, встановлені у ваших кластерах:
$ 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}"
І нарешті, очистіть CRD API Gateway:
$ kubectl get crd -oname --context "${CTX_CLUSTER1}" | grep --color=never 'gateway.networking.k8s.io' | xargs kubectl delete --context "${CTX_CLUSTER1}"
$ kubectl get crd -oname --context "${CTX_CLUSTER2}" | grep --color=never 'gateway.networking.k8s.io' | xargs kubectl delete --context "${CTX_CLUSTER2}"