Налаштування поведінки відмовостійкості в мультикластерній установці ambient
Дотримуйтеся цього посібника, щоб налаштувати поведінку відмовостійкості у вашій ambient мультикластерній установці Istio за допомогою проксі waypoint.
Перед тим як продовжити, обовʼязково виконайте ambient мультикластерну установку Istio за одним із посібників з мультикластерної установки та переконайтеся, що установка працює належним чином.
У цьому посібнику ми вдосконалимо застосунок HelloWorld, який використовувався для перевірки мультикластерної установки. Ми налаштуємо локальну відмовостійкість для сервісу HelloWorld, щоб надавати перевагу точкам доступу в кластері, локальному для клієнта, за допомогою DestinationRule, і розгорнемо проксі waypoint для застосування цієї конфігурації.
Розгортання проксі waypoint
Щоб налаштувати виявлення викидів і налаштувати поведінку відмовостійкості для сервісу, нам потрібен проксі waypoint. Для початку розгорніть проксі waypoint у кожному кластері мережі:
$ istioctl --context "${CTX_CLUSTER1}" waypoint apply --name waypoint --for service -n sample --wait
$ istioctl --context "${CTX_CLUSTER2}" waypoint apply --name waypoint --for service -n sample --waitПідтвердьте статус розгортання проксі waypoint на cluster1:
$ kubectl --context "${CTX_CLUSTER1}" get deployment waypoint --namespace sample
NAME READY UP-TO-DATE AVAILABLE AGE
waypoint 1/1 1 1 137mПідтвердьте статус розгортання проксі waypoint на cluster2:
$ kubectl --context "${CTX_CLUSTER2}" get deployment waypoint --namespace sample
NAME READY UP-TO-DATE AVAILABLE AGE
waypoint 1/1 1 1 138mЗачекайте, поки всі проксі waypoint будуть готові.
Налаштуйте сервіс HelloWorld у кожному кластері на використання проксі waypoint:
$ kubectl --context "${CTX_CLUSTER1}" label svc helloworld -n sample istio.io/use-waypoint=waypoint
$ kubectl --context "${CTX_CLUSTER2}" label svc helloworld -n sample istio.io/use-waypoint=waypointНарешті, і цей крок є специфічним для мультикластерного розгортання проксі waypoint, позначте сервіс проксі waypoint у кожному кластері як глобальний, так само, як ви раніше зробили з сервісом HelloWorld:
$ kubectl --context "${CTX_CLUSTER1}" label svc waypoint -n sample istio.io/global=true
$ kubectl --context "${CTX_CLUSTER2}" label svc waypoint -n sample istio.io/global=trueСервіс HelloWorld в обох кластерах тепер налаштований на використання проксі waypoint, але проксі waypoint поки що не роблять нічого корисного.
Налаштування локальної відмовостійкості
Щоб налаштувати локальну відмовостійкість, створіть і застосуйте DestinationRule у cluster1:
$ kubectl --context "${CTX_CLUSTER1}" apply -n sample -f - <<EOF
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: helloworld
spec:
host: helloworld.sample.svc.cluster.local
trafficPolicy:
outlierDetection:
consecutive5xxErrors: 1
interval: 1s
baseEjectionTime: 1m
loadBalancer:
simple: ROUND_ROBIN
localityLbSetting:
enabled: true
failoverPriority:
- topology.istio.io/cluster
EOFЗастосуйте той самий DestinationRule також у cluster2:
$ kubectl --context "${CTX_CLUSTER2}" apply -n sample -f - <<EOF
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: helloworld
spec:
host: helloworld.sample.svc.cluster.local
trafficPolicy:
outlierDetection:
consecutive5xxErrors: 1
interval: 1s
baseEjectionTime: 1m
loadBalancer:
simple: ROUND_ROBIN
localityLbSetting:
enabled: true
failoverPriority:
- topology.istio.io/cluster
EOFЦей DestinationRule налаштовує наступне:
Виявлення викидів для сервісу
HelloWorld. Воно вказує проксі waypoint, як визначати, коли точки доступу сервісу є несправними. Це необхідно для належного функціонування відмовостійкості.Пріоритет відмовостійкості, який вказує проксі waypoint, як пріоритезувати точки доступу під час маршрутизації запитів. У цьому прикладі проксі waypoint надаватиме перевагу точкам доступу у тому самому кластері над точками доступу в інших кластерах.
З цими політиками проксі waypoint надаватимуть перевагу точкам доступу в тому самому кластері, що й проксі waypoint, коли вони доступні та вважаються справними згідно з конфігурацією виявлення викидів.
Перевірка, що трафік залишається в локальному кластері
Надішліть запит з подів curl на cluster1 до сервісу HelloWorld:
$ kubectl exec --context "${CTX_CLUSTER1}" -n sample -c curl \
"$(kubectl get pod --context "${CTX_CLUSTER1}" -n sample -l \
app=curl -o jsonpath='{.items[0].metadata.name}')" \
-- curl -sS helloworld.sample:5000/helloТепер, якщо ви повторите цей запит кілька разів, ви побачите, що версія HelloWorld завжди має бути v1, оскільки трафік залишається в cluster1:
Hello version: v1, instance: helloworld-v1-954745fd-z6qcn
Hello version: v1, instance: helloworld-v1-954745fd-z6qcn
...Аналогічно, надішліть запит з подів curl на cluster2 кілька разів:
$ kubectl exec --context "${CTX_CLUSTER2}" -n sample -c curl \
"$(kubectl get pod --context "${CTX_CLUSTER2}" -n sample -l \
app=curl -o jsonpath='{.items[0].metadata.name}')" \
-- curl -sS helloworld.sample:5000/helloВи маєте побачити, що всі запити обробляються в cluster2, дивлячись на версію у відповіді:
Hello version: v2, instance: helloworld-v2-7b768b9bbd-7zftm
Hello version: v2, instance: helloworld-v2-7b768b9bbd-7zftm
...Перевірка відмовостійкості до іншого кластера
Щоб перевірити, що відмовостійкість до віддаленого кластера працює, змоделюйте відмову сервісу HelloWorld у cluster1, зменшивши масштаб розгортання:
$ kubectl --context "${CTX_CLUSTER1}" scale --replicas=0 deployment/helloworld-v1 -n sampleНадішліть запит з подів curl на cluster1 до сервісу HelloWorld знову:
$ kubectl exec --context "${CTX_CLUSTER1}" -n sample -c curl \
"$(kubectl get pod --context "${CTX_CLUSTER1}" -n sample -l \
app=curl -o jsonpath='{.items[0].metadata.name}')" \
-- curl -sS helloworld.sample:5000/helloЦього разу ви маєте побачити, що запит обробляється сервісом HelloWorld у cluster2, оскільки в cluster1 немає доступних точок доступу:
Hello version: v2, instance: helloworld-v2-7b768b9bbd-7zftm
Hello version: v2, instance: helloworld-v2-7b768b9bbd-7zftm
...Вітаємо! Ви успішно налаштували локальну відмовостійкість в ambient мультикластерному розгортанні Istio!