시작하기 전에
시작하기 전에 (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을 생성해요. 지역을 버전 문자열로 사용하면 돼요:
$ 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에 배포해요:
$ 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
축하해요! 시스템을 성공적으로 구성했어요. 이제 지역 기반 로드 밸런싱 태스크를 시작할 준비가 됐어요!
다음 단계
이제 다음 로드 밸런싱 옵션 중 하나를 설정할 수 있어요:
참고로 로드 밸런싱 옵션은 둘 다 설정하면 안 되고 하나만 설정해야 해요. 두 옵션은 서로 배타적이라서, 둘 다 설정하려고 하면 예상치 못한 동작이 발생할 수 있어요.