Встановлення Multi-Primary в різних мережах
Дотримуйтесь цього керівництва, щоб встановити панель управління Istio в обох cluster1
та cluster2
, зробивши кожен primary кластером. Кластер cluster1
знаходиться в мережі network1
, а cluster2
— в мережі network2
. Це означає, що між podʼами в різних кластерах немає прямого зʼєднання.
Перед тим, як продовжити, обовʼязково виконайте кроки, зазначені у розділі перш ніж почати.
У цій конфігурації обидва cluster1
та cluster2
спостерігають за API серверами в кожному кластері для отримання точок доступу.
Робочі навантаження сервісів між кластерами спілкуються опосередковано, через спеціальні шлюзи для 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
EOF
Застосуйте конфігурацію до cluster1
:
$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml
Встановіть 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.multiCluster.clusterName=cluster1 --set global.network=network1
Встановлення 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
Оскільки кластери знаходяться в окремих мережах, нам потрібно експонувати всі сервіси (*.local) через east-west шлюз в обох кластерах. Хоча цей шлюз і є загальнодоступним в Інтернеті, сервіси за ним можуть бути доступні лише сервісам з довіреним mTLS-сертифікатом та ідентифікатором робочого навантаження, так само як якби вони знаходилися в тій самій мережі.
$ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
@samples/multicluster/expose-services.yaml@
Встановлення стандартної мережі для 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
як primary кластера
Створіть конфігурацію istioctl
для cluster2
:
Встановіть Istio як primary у cluster2
за допомогою istioctl та API IstioOperator
.
$ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster2
network: network2
EOF
Застосуйте конфігурацію до cluster2
:
$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml
Встановіть Istio як primary у 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
Встановлення 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
Дочекайтеся призначення зовнішньої IP-адреси для east-west шлюзу:
$ 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
Як і у випадку з cluster1
, експонуйте сервіси через east-west шлюз.
$ kubectl --context="${CTX_CLUSTER2}" apply -n istio-system -f \
@samples/multicluster/expose-services.yaml@
Увімкнення виявлення точок доступу
Встановіть віддалений секрет у 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 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}"