앰비언트 설치 검증하기
앰비언트 설치 검증하기 (Verify the ambient installation)
이 가이드를 따라 앰비언트 멀티클러스터 Istio 설치가 제대로 동작하는지 검증해 보세요.
출처: Istio 문서
본문
진행하기 전에 시작하기 전에 단계를 완료하고 멀티클러스터 설치 가이드 중 하나를 선택해 따라야 해요.
이 가이드에서는 멀티클러스터가 기능하는지 검증하기 위해, HelloWorld 애플리케이션 v1을 cluster1에, v2를 cluster2에 배포할 거예요. HelloWorld는 요청을 받으면 /hello 경로를 호출할 때 응답에 자기 버전을 포함해요.
또한 두 클러스터에 curl 컨테이너를 배포할 거예요. 이 파드들을 HelloWorld 서비스로의 요청 소스로 사용해서, 메시 내 트래픽(in-mesh traffic)을 시뮬레이션할 거예요. 마지막으로 트래픽을 생성한 후, 어떤 클러스터가 요청을 받았는지 관찰할 거예요.
멀티클러스터 검증하기 (Verify Multicluster)
Istiod가 이제 원격 클러스터의 쿠버네티스 컨트롤 플레인과 통신할 수 있는지 확인하려면:
$ istioctl remote-clusters --context="${CTX_CLUSTER1}"
NAME SECRET STATUS ISTIOD REVISION
cluster1 synced istiod-7b74b769db-kb4kj default
cluster2 istio-system/istio-remote-secret-cluster2 synced istiod-7b74b769db-kb4kj default
모든 클러스터가 상태를 synced로 표시해야 해요. 어떤 클러스터의 STATUS가 timeout으로 나열된다면, 프라이머리 클러스터의 Istiod가 원격 클러스터와 통신할 수 없다는 뜻이에요. 자세한 오류 메시지는 Istiod 로그를 확인하세요.
참고: timeout 문제가 보이고, 프라이머리 클러스터의 Istiod와 원격 클러스터의 쿠버네티스 컨트롤 플레인 사이에 중간 호스트(예: Rancher auth proxy)가 있다면, istioctl create-remote-secret이 생성하는 kubeconfig의 certificate-authority-data 필드를 중간 호스트가 사용하는 인증서와 일치하도록 업데이트해야 할 수 있어요.
HelloWorld 서비스 배포하기 (Deploy the HelloWorld Service)
HelloWorld 서비스를 어떤 클러스터에서도 호출할 수 있게 하려면, 각 클러스터에서 DNS 조회가 성공해야 해요 (자세한 내용은 배포 모델 참조). 메시 안의 각 클러스터에 HelloWorld 서비스를 배포해서 이 문제를 해결할 거예요.
먼저 각 클러스터에 sample 네임스페이스를 생성하세요:
$ kubectl create --context="${CTX_CLUSTER1}" namespace sample
$ kubectl create --context="${CTX_CLUSTER2}" namespace sample
sample 네임스페이스를 메시에 등록하세요:
$ kubectl label --context="${CTX_CLUSTER1}" namespace sample \
istio.io/dataplane-mode=ambient
$ kubectl label --context="${CTX_CLUSTER2}" namespace sample \
istio.io/dataplane-mode=ambient
두 클러스터에 HelloWorld 서비스를 생성하세요:
$ kubectl apply --context="${CTX_CLUSTER1}" \
-f @samples/helloworld/helloworld.yaml@ \
-l service=helloworld -n sample
$ kubectl apply --context="${CTX_CLUSTER2}" \
-f @samples/helloworld/helloworld.yaml@ \
-l service=helloworld -n sample
HelloWorld V1 배포하기 (Deploy HelloWorld V1)
helloworld-v1 애플리케이션을 cluster1에 배포하세요:
$ kubectl apply --context="${CTX_CLUSTER1}" \
-f @samples/helloworld/helloworld.yaml@ \
-l version=v1 -n sample
helloworld-v1 파드 상태를 확인하세요:
$ kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=helloworld
NAME READY STATUS RESTARTS AGE
helloworld-v1-86f77cd7bd-cpxhv 1/1 Running 0 40s
helloworld-v1의 상태가 Running이 될 때까지 기다리세요.
이제 cluster1의 helloworld 서비스를 global로 표시해서 메시 안의 다른 클러스터에서 접근할 수 있게 하세요:
$ kubectl label --context="${CTX_CLUSTER1}" svc helloworld -n sample \
istio.io/global="true"
HelloWorld V2 배포하기 (Deploy HelloWorld V2)
helloworld-v2 애플리케이션을 cluster2에 배포하세요:
$ kubectl apply --context="${CTX_CLUSTER2}" \
-f @samples/helloworld/helloworld.yaml@ \
-l version=v2 -n sample
helloworld-v2 파드 상태를 확인하세요:
$ kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=helloworld
NAME READY STATUS RESTARTS AGE
helloworld-v2-758dd55874-6x4t8 1/1 Running 0 40s
helloworld-v2의 상태가 Running이 될 때까지 기다리세요.
이제 cluster2의 helloworld 서비스를 global로 표시해서 메시 안의 다른 클러스터에서 접근할 수 있게 하세요:
$ kubectl label --context="${CTX_CLUSTER2}" svc helloworld -n sample \
istio.io/global="true"
curl 배포하기 (Deploy curl)
두 클러스터에 curl 애플리케이션을 배포하세요:
$ kubectl apply --context="${CTX_CLUSTER1}" \
-f @samples/curl/curl.yaml@ -n sample
$ kubectl apply --context="${CTX_CLUSTER2}" \
-f @samples/curl/curl.yaml@ -n sample
cluster1의 curl 파드 상태를 확인하세요:
$ kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=curl
NAME READY STATUS RESTARTS AGE
curl-754684654f-n6bzf 1/1 Running 0 5s
curl 파드의 상태가 Running이 될 때까지 기다리세요.
cluster2의 curl 파드 상태를 확인하세요:
$ kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=curl
NAME READY STATUS RESTARTS AGE
curl-754684654f-dzl9j 1/1 Running 0 5s
curl 파드의 상태가 Running이 될 때까지 기다리세요.
클러스터 간 트래픽 검증하기 (Verifying Cross-Cluster Traffic)
클러스터 간 로드 밸런싱이 예상대로 동작하는지 검증하려면 curl 파드를 사용해 HelloWorld 서비스를 여러 번 호출하세요. 로드 밸런싱이 제대로 동작하는지 확인하려면 배포의 모든 클러스터에서 HelloWorld 서비스를 호출하세요.
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
이 요청을 여러 번 반복해서, 두 클러스터의 엔드포인트가 모두 사용되고 있음을 나타내는 HelloWorld 버전이 v1과 v2 사이에서 바뀌는지 확인하세요:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
...
이제 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
이 요청을 여러 번 반복해서 HelloWorld 버전이 v1과 v2 사이에서 토글되는지 확인하세요:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
...
축하해요! 여러 클러스터에 Istio를 성공적으로 설치하고 검증했어요!
다음 단계 (Next steps)
멀티클러스터 배포에 locality 페일오버를 구성하세요.
멀티클러스터 배포에 Kiali를 배포하세요.