시작하기 전에

시작하기 전에 (Before you begin)

지역 기반 로드 밸런싱 태스크를 시작하기 전에 먼저 여러 클러스터에 Istio 설치를 완료해야 해요. 클러스터는 세 개의 region에 걸쳐 있어야 하고, 네 개의 가용성 zone을 포함해야 해요. 필요한 클러스터 수는 클라우드 제공자가 지원하는 기능에 따라 달라질 수 있어요.

출처: Istio 문서

본문

지역 기반 로드 밸런싱 태스크를 시작하기 전에 먼저 여러 클러스터에 Istio 설치를 완료해야 해요. 클러스터는 세 개의 region에 걸쳐 있어야 하고, 네 개의 가용성 zone을 포함해야 해요. 필요한 클러스터 수는 클라우드 제공자가 지원하는 기능에 따라 달라질 수 있어요.

간단하게 하기 위해, 메시 안에는 primary 클러스터가 단 하나만 있다고 가정할게요. 이렇게 하면 제어 플레인(configuration) 설정 과정이 단순해져요. 컨트롤 플레인 변경 사항을 한 클러스터에만 적용하면 되거든요.

HelloWorld 애플리케이션의 여러 인스턴스를 다음과 같이 배포할 거예요:

지역 기반 로드 밸런싱 태스크를 위한 설정

단일 다중-zone 클러스터 환경에서도 지역 기반 로드 밸런싱을 구성해서 같은 클러스터 안의 다른 zone으로 장애 조치를 시킬 수 있어요. 이를 테스트하려면 여러 개의 워커 zone을 가진 클러스터를 만들고, 각 zone에 istiod 인스턴스와 앱을 배포해야 해요.

1: 다중-zone Kubernetes 클러스터가 없다면, kind를 사용해서 로컬에 다음과 같은 명령으로 배포할 수 있어요:

$ kind create cluster --config=- <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
EOF

2: topology.kubernetes.io/zone을 사용해서 각 워커에 zone 이름을 라벨링해요:

$ kubectl label node kind-worker topology.kubernetes.io/zone=us-south10
$ kubectl label node kind-worker2 topology.kubernetes.io/zone=us-south12
$ kubectl label node kind-worker3 topology.kubernetes.io/zone=us-south13

3: istiod를 control-plane 노드에 배포하고, helloworld 앱을 각 워커 노드에 배포해요.

환경 변수 (Environment Variables)

이 가이드는 모든 클러스터를 기본 Kubernetes 설정 파일의 context를 통해 접근한다고 가정해요. 다양한 context를 위해 다음과 같은 환경 변수를 사용할 거예요:

Variable Description
CTX_PRIMARY primary 클러스터에 설정을 적용할 때 사용하는 context예요.
CTX_R1_Z1 region1.zone1의 pod와 상호작용할 때 사용하는 context예요.
CTX_R1_Z2 region1.zone2의 pod와 상호작용할 때 사용하는 context예요.
CTX_R2_Z3 region2.zone3의 pod와 상호작용할 때 사용하는 context예요.
CTX_R3_Z4 region3.zone4의 pod와 상호작용할 때 사용하는 context예요.

sample 네임스페이스 만들기

시작하려면, 사이드카 자동 주입(sidecar injection)을 활성화한 sample 네임스페이스의 yaml을 생성해요:

$ cat <<EOF > sample.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: sample
  labels:
    istio-injection: enabled
EOF

sample 네임스페이스를 각 클러스터에 추가해요:

$ for CTX in "$CTX_PRIMARY" "$CTX_R1_Z1" "$CTX_R1_Z2" "$CTX_R2_Z3" "$CTX_R3_Z4"; \
  do \
    kubectl --context="$CTX" apply -f sample.yaml; \
  done

HelloWorld 배포

각 지역에 대한 HelloWorld YAML을 생성해요. 지역을 버전 문자열로 사용하면 돼요:

Zip

$ for LOC in "region1.zone1" "region1.zone2" "region2.zone3" "region3.zone4"; \
  do \
    ./@samples/helloworld/gen-helloworld.sh@ \
      --version "$LOC" > "helloworld-${LOC}.yaml"; \
  done

각 지역에 해당하는 클러스터에 HelloWorld YAML을 적용해요:

$ kubectl apply --context="${CTX_R1_Z1}" -n sample \
  -f helloworld-region1.zone1.yaml
$ kubectl apply --context="${CTX_R1_Z2}" -n sample \
  -f helloworld-region1.zone2.yaml
$ kubectl apply --context="${CTX_R2_Z3}" -n sample \
  -f helloworld-region2.zone3.yaml
$ kubectl apply --context="${CTX_R3_Z4}" -n sample \
  -f helloworld-region3.zone4.yaml

curl 배포

curl 애플리케이션을 region1의 zone1에 배포해요:

Zip

$ kubectl apply --context="${CTX_R1_Z1}" \
  -f @samples/curl/curl.yaml@ -n sample

HelloWorld pod 기다리기

각 zone의 HelloWorld pod가 Running 상태가 될 때까지 기다려요:

$ kubectl get pod --context="${CTX_R1_Z1}" -n sample -l app="helloworld" \
  -l version="region1.zone1"
NAME                                       READY   STATUS    RESTARTS   AGE
helloworld-region1.zone1-86f77cd7b-cpxhv   2/2     Running   0          30s
$ kubectl get pod --context="${CTX_R1_Z2}" -n sample -l app="helloworld" \
  -l version="region1.zone2"
NAME                                       READY   STATUS    RESTARTS   AGE
helloworld-region1.zone2-86f77cd7b-cpxhv   2/2     Running   0          30s
$ kubectl get pod --context="${CTX_R2_Z3}" -n sample -l app="helloworld" \
  -l version="region2.zone3"
NAME                                       READY   STATUS    RESTARTS   AGE
helloworld-region2.zone3-86f77cd7b-cpxhv   2/2     Running   0          30s
$ kubectl get pod --context="${CTX_R3_Z4}" -n sample -l app="helloworld" \
  -l version="region3.zone4"
NAME                                       READY   STATUS    RESTARTS   AGE
helloworld-region3.zone4-86f77cd7b-cpxhv   2/2     Running   0          30s

축하해요! 시스템을 성공적으로 구성했어요. 이제 지역 기반 로드 밸런싱 태스크를 시작할 준비가 됐어요!

다음 단계

이제 다음 로드 밸런싱 옵션 중 하나를 설정할 수 있어요:

참고로 로드 밸런싱 옵션은 둘 다 설정하면 안 되고 하나만 설정해야 해요. 두 옵션은 서로 배타적이라서, 둘 다 설정하려고 하면 예상치 못한 동작이 발생할 수 있어요.

더 알아보기 (Learn more)