멀티클러스터 앰비언트 설치에서 페일오버 동작 구성하기
멀티클러스터 앰비언트 설치에서 페일오버 동작 구성하기 (Configure failover behavior in multicluster ambient installation)
이 가이드를 따라 웨이포인트 프록시를 사용해 Istio 앰비언트 멀티클러스터 설치에서 페일오버 동작을 커스터마이즈해 보세요.
출처: Istio 문서
본문
진행하기 전에, 멀티클러스터 설치 가이드 중 하나를 따라 앰비언트 멀티클러스터 Istio 설치를 완료하고, 설치가 제대로 동작하는지 검증했는지 확인하세요.
이 가이드에서는 멀티클러스터 설치를 검증하는 데 사용했던 HelloWorld 애플리케이션을 기반으로 진행할 거예요. DestinationRule을 사용해 HelloWorld 서비스에 대한 locality 페일오버를 구성해서 클라이언트와 같은 클러스터에 있는 엔드포인트를 선호하도록 하고, 그 구성을 적용하도록 웨이포인트 프록시를 배포할 거예요.
웨이포인트 프록시 배포하기 (Deploy waypoint proxy)
서비스에 대한 아웃라이어 탐지(outlier detection)를 구성하고 페일오버 동작을 커스터마이즈하려면 웨이포인트 프록시가 필요해요. 먼저 메시 안의 각 클러스터에 웨이포인트 프록시를 배포하세요:
$ 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
cluster1의 웨이포인트 프록시 배포 상태를 확인하세요:
$ kubectl --context "${CTX_CLUSTER1}" get deployment waypoint --namespace sample
NAME READY UP-TO-DATE AVAILABLE AGE
waypoint 1/1 1 1 137m
cluster2의 웨이포인트 프록시 배포 상태를 확인하세요:
$ kubectl --context "${CTX_CLUSTER2}" get deployment waypoint --namespace sample
NAME READY UP-TO-DATE AVAILABLE AGE
waypoint 1/1 1 1 138m
모든 웨이포인트 프록시가 준비될 때까지 기다리세요.
각 클러스터의 HelloWorld 서비스가 웨이포인트 프록시를 사용하도록 구성하세요:
$ 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
마지막으로, 이 단계는 웨이포인트 프록시의 멀티클러스터 배포에 특정한 것인데, 이전에 HelloWorld 서비스에서 했던 것처럼 각 클러스터의 웨이포인트 프록시 서비스를 global로 표시하세요:
$ 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 서비스는 이제 웨이포인트 프록시를 사용하도록 구성되었지만, 웨이포인트 프록시는 아직 유용한 일을 하지 않아요.
locality 페일오버 구성하기 (Configure locality failover)
locality 페일오버를 구성하려면 cluster1에 DestinationRule을 만들어 적용하세요:
$ 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
cluster2에도 같은 DestinationRule을 적용하세요:
$ 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서비스에 대한 아웃라이어 탐지. 이것은 서비스의 엔드포인트가 언제 비정상인지 웨이포인트 프록시가 식별하는 방법을 지시해요. 페일오버가 제대로 동작하려면 필수예요.- 요청을 라우팅할 때 웨이포인트 프록시가 엔드포인트를 어떻게 우선순위를 두는지 지시하는 페일오버 우선순위. 이 예제에서 웨이포인트 프록시는 다른 클러스터의 엔드포인트보다 같은 클러스터의 엔드포인트를 선호해요.
이 정책들이 갖춰지면, 웨이포인트 프록시는 아웃라이어 탐지 구성에 기반해 사용 가능하고 건강하다고 간주되는 같은 클러스터의 엔드포인트를 우선시해요.
트래픽이 로컬 클러스터에 머무는지 검증하기 (Verify traffic stays in local cluster)
cluster1의 curl 파드에서 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
이제 이 요청을 여러 번 반복해서, 트래픽이 cluster1에 머무르기 때문에 HelloWorld 버전이 항상 v1이어야 하는지 확인하세요:
Hello version: v1, instance: helloworld-v1-954745fd-z6qcn
Hello version: v1, instance: helloworld-v1-954745fd-z6qcn
...
마찬가지로 cluster2의 curl 파드에서 여러 번 요청을 보내세요:
$ 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
...
다른 클러스터로의 페일오버 검증하기 (Verify failover to another cluster)
원격 클러스터로의 페일오버가 동작하는지 검증하려면, 배포를 스케일 다운해서 cluster1에서 HelloWorld 서비스 장애를 시뮬레이션하세요:
$ kubectl --context "${CTX_CLUSTER1}" scale --replicas=0 deployment/helloworld-v1 -n sample
cluster1의 curl 파드에서 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
이번에는 cluster1에 사용 가능한 엔드포인트가 없으므로, 요청이 cluster2의 HelloWorld 서비스에 의해 처리되는 것을 볼 수 있어요:
Hello version: v2, instance: helloworld-v2-7b768b9bbd-7zftm
Hello version: v2, instance: helloworld-v2-7b768b9bbd-7zftm
...
축하해요! Istio 앰비언트 멀티클러스터 배포에서 locality 페일오버를 성공적으로 구성했어요!