설치 검증

설치 검증

멀티클러스터 Istio 설치가 제대로 동작하는지 검증하는 방법을 알아봐요.

출처: Istio 문서

본문

이 가이드를 따라 멀티클러스터 Istio 설치가 제대로 동작하는지 검증해요.

진행하기 전에 시작하기 전에의 단계를 완료하고, 멀티클러스터 설치 가이드 중 하나를 골라 따라 했는지 확인하세요.

이 가이드에서는 멀티클러스터가 작동하는지 검증하기 위해 HelloWorld 애플리케이션의 V1을 cluster1에, V2를 cluster2에 배포해요. 요청을 받으면 HelloWorld는 응답에 자기 버전을 포함해요.

또한 두 클러스터 모두에 curl 컨테이너를 배포해요. 이 pod들을 HelloWorld 서비스로 보내는 요청의 출처로 사용해서 메시 내부 트래픽을 시뮬레이션할 거예요. 마지막으로 트래픽을 발생시킨 뒤 어느 클러스터가 요청을 받았는지 관찰해요.

멀티클러스터 검증

Istiod가 이제 원격 클러스터의 Kubernetes 컨트롤 플레인과 통신할 수 있는지 확인해요.

$ 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으로 표시된다면, primary 클러스터의 Istiod가 원격 클러스터와 통신하지 못한다는 뜻이에요. 자세한 오류 메시지는 Istiod 로그를 확인하세요.

참고: timeout 문제가 보이고 primary 클러스터의 Istiod와 원격 클러스터의 Kubernetes 컨트롤 플레인 사이에 중간 호스트(예: Rancher auth proxy)가 있다면, istioctl create-remote-secret이 생성하는 kubeconfig의 certificate-authority-data 필드를 중간 호스트가 사용하는 인증서에 맞게 업데이트해야 할 수도 있어요.

HelloWorld 서비스 배포

HelloWorld 서비스를 어떤 클러스터에서든 호출 가능하게 만들려면 각 클러스터에서 DNS 조회가 성공해야 해요(자세한 내용은 배포 모델 참고). 이를 위해 HelloWorld 서비스를 메시 안의 각 클러스터에 배포할 거예요.

먼저 각 클러스터에 sample 네임스페이스를 만들어요:

$ kubectl create --context="${CTX_CLUSTER1}" namespace sample
$ kubectl create --context="${CTX_CLUSTER2}" namespace sample

sample 네임스페이스에서 자동 sidecar 주입을 활성화해요:

$ kubectl label --context="${CTX_CLUSTER1}" namespace sample \
    istio-injection=enabled
$ kubectl label --context="${CTX_CLUSTER2}" namespace sample \
    istio-injection=enabled

두 클러스터 모두에 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 배포

helloworld-v1 애플리케이션을 cluster1에 배포해요:

$ kubectl apply --context="${CTX_CLUSTER1}" \
    -f @samples/helloworld/helloworld.yaml@ \
    -l version=v1 -n sample

helloworld-v1 pod 상태를 확인해요:

$ kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=helloworld
NAME                            READY     STATUS    RESTARTS   AGE
helloworld-v1-86f77cd7bd-cpxhv  2/2       Running   0          40s

helloworld-v1의 상태가 Running이 될 때까지 기다려요.

HelloWorld V2 배포

helloworld-v2 애플리케이션을 cluster2에 배포해요:

$ kubectl apply --context="${CTX_CLUSTER2}" \
    -f @samples/helloworld/helloworld.yaml@ \
    -l version=v2 -n sample

helloworld-v2 pod 상태를 확인해요:

$ kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=helloworld
NAME                            READY     STATUS    RESTARTS   AGE
helloworld-v2-758dd55874-6x4t8  2/2       Running   0          40s

helloworld-v2의 상태가 Running이 될 때까지 기다려요.

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 pod 상태를 확인해요:

$ kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=curl
NAME                             READY   STATUS    RESTARTS   AGE
curl-754684654f-n6bzf            2/2     Running   0          5s

curl pod 상태가 Running이 될 때까지 기다려요.

cluster2에서 curl pod 상태를 확인해요:

$ kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=curl
NAME                             READY   STATUS    RESTARTS   AGE
curl-754684654f-dzl9j            2/2     Running   0          5s

curl pod 상태가 Running이 될 때까지 기다려요.

클러스터 간 트래픽 검증

클러스터 간 로드 밸런싱이 예상대로 동작하는지 검증하려면 curl pod로 HelloWorld 서비스를 여러 번 호출해요. 로드 밸런싱이 제대로 동작하는지 확인하려면 배포에 있는 모든 클러스터에서 HelloWorld 서비스를 호출해요.

cluster1의 curl pod에서 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 pod에서 이 과정을 반복해요:

$ 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를 성공적으로 설치하고 검증했어요!

다음 단계

멀티클러스터 메시에서 트래픽을 제어하는 방법을 배우려면 지역 로드 밸런싱 작업을 확인해 보세요.

더 알아보기 (Learn more)