이 문서에서는 GKE Dataplane V2에서 서비스의 Maglev 부하 분산을 구성하고 확인하는 방법을 보여줍니다.
Maglev는 높은 처리량과 짧은 지연 시간의 부하 분산을 제공하는 일관된 해싱 알고리즘입니다. Maglev는 동일한 흐름이 동일한 백엔드에 일관되게 매핑되도록 지원하여 백엔드 포드가 확장, 업데이트 또는 재예약될 때 패킷 손실과 연결 중단을 최소화합니다.
자세한 내용은 Maglev 일관된 해싱 알고리즘 연구 논문을 참조하세요.
이 기능은 장기 연결이 있는 워크로드 또는 백엔드 변경사항이 기존 흐름을 방해하지 않아야 하는 스테이트풀(Stateful) 애플리케이션에 권장됩니다.
리소스 오버헤드 및 확장성 고려사항에 대한 자세한 내용은 GKE Dataplane V2 개념을 참고하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
기본 요건 및 한도
- GKE 버전: 1.36.0-gke.2882000 이상
- GKE Dataplane V2: 사용 설정됨
- 클러스터 모드: Autopilot 및 Standard
GKE Dataplane V2로 GKE 클러스터 만들기
Maglev를 사용하려면 GKE Dataplane V2가 사용 설정된 GKE 클러스터가 있어야 합니다.
Autopilot
Autopilot 클러스터에는 기본적으로 GKE Dataplane V2가 사용 설정되어 있습니다. Autopilot 클러스터를 만들고 구성을 가져오려면 다음 명령어를 실행합니다.
gcloud container clusters create-auto CLUSTER_NAME \
--region=COMPUTE_REGION \
--release-channel=rapid
gcloud container clusters get-credentials CLUSTER_NAME \
--region=COMPUTE_REGION
표준
Standard 클러스터에서 GKE Dataplane V2를 사용 설정하려면 --enable-dataplane-v2 플래그를 사용하세요. Standard 클러스터를 만들고 구성을 가져오려면 다음 명령어를 실행합니다.
gcloud container clusters create CLUSTER_NAME \
--zone=COMPUTE_ZONE \
--enable-dataplane-v2 \
--cluster-version=1.36.0-gke.2882000
gcloud container clusters get-credentials CLUSTER_NAME \
--zone=COMPUTE_ZONE
백엔드 애플리케이션 배포
부하 분산 서비스를 구성하기 전에 트래픽을 처리할 백엔드 애플리케이션을 배포합니다. 이 배포는 hello-app 샘플 애플리케이션의 복제본 5개를 실행합니다.
다음 매니페스트를
echo-backend.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: echo-backend spec: replicas: 5 selector: matchLabels: app: echo-backend template: metadata: labels: app: echo-backend spec: containers: - name: hello image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0" ports: - containerPort: 8080매니페스트를 적용합니다.
kubectl apply -f echo-backend.yaml
부하 분산 서비스 구성
Maglev 부하 분산 알고리즘 또는 기본 무작위 부하 분산 알고리즘을 사용하도록 서비스를 구성할 수 있습니다. 두 서비스 모두 이전 단계에서 만든 echo-backend 배포를 타겟팅합니다.
Maglev 서비스 구성
Maglev 부하 분산을 사용 설정하려면 생성 중에 서비스 메타데이터에 gke.networking.io/lb-algorithm: "maglev" 주석을 추가합니다.
다음 매니페스트를
maglev-service.yaml로 저장합니다.apiVersion: v1 kind: Service metadata: name: maglev-service annotations: gke.networking.io/lb-algorithm: "maglev" spec: selector: app: echo-backend ports: - protocol: TCP port: 80 targetPort: 8080매니페스트를 적용합니다.
kubectl apply -f maglev-service.yaml
무작위 서비스 구성
기본적으로 서비스는 무작위 부하 분산 알고리즘을 사용합니다. 기본 알고리즘을 사용하기 위해 주석을 지정할 필요는 없지만 다음 예시에서는 비교를 위해 명시적으로 구성합니다.
다음 매니페스트를
random-service.yaml로 저장합니다.apiVersion: v1 kind: Service metadata: name: random-service annotations: gke.networking.io/lb-algorithm: "random" spec: selector: app: echo-backend ports: - protocol: TCP port: 80 targetPort: 8080매니페스트를 적용합니다.
kubectl apply -f random-service.yaml
트래픽 일관성 확인
고정 소스 포트에서 트래픽을 전송하는 테스트 클라이언트 포드를 배포하여 Maglev와 무작위 부하 분산 간의 라우팅 일관성 차이를 확인할 수 있습니다.
Maglev 트래픽 일관성 확인
Maglev는 동일한 소스 포트의 요청을 동일한 백엔드 포드로 일관되게 라우팅합니다.
다음 매니페스트를
client-maglev.yaml로 저장합니다.apiVersion: v1 kind: Pod metadata: name: client-maglev spec: restartPolicy: Never containers: - name: curl image: curlimages/curl:8.2.0 command: ["/bin/sh", "-c"] args: - | while true; do curl -s -H "Connection: close" http://maglev-service:80 --local-port 54321 | grep Hostname sleep 0.5 done--local-port플래그는 소스 포트를 강제 적용하고Connection: close헤더는 클라이언트가 후속 요청에 소스 포트를 즉시 재사용할 수 있도록 합니다.매니페스트를 적용합니다.
kubectl apply -f client-maglev.yaml포드가 실행되는 동안 로그를 확인합니다.
kubectl logs client-maglev예상 출력:
출력에 동일한 호스트 이름이 반복적으로 표시됩니다. 이는 클라이언트의 모든 트래픽이 동일한 백엔드 포드로 일관되게 라우팅됨을 나타냅니다.
Hostname: echo-backend-5c78f66dbf-abcde Hostname: echo-backend-5c78f66dbf-abcde
기본 (무작위) 트래픽 분산 확인
기본 서비스는 동일한 소스 포트의 트래픽을 여러 백엔드 포드에 분산합니다.
다음 매니페스트를
client-random.yaml로 저장합니다.apiVersion: v1 kind: Pod metadata: name: client-random spec: restartPolicy: Never containers: - name: curl image: curlimages/curl:8.2.0 command: ["/bin/sh", "-c"] args: - | while true; do curl -s -H "Connection: close" http://random-service:80 --local-port 54321 | grep Hostname sleep 0.5 done매니페스트를 적용합니다.
kubectl apply -f client-random.yaml포드가 실행되는 동안 로그를 확인합니다.
kubectl logs client-random예상 출력:
출력에 여러 개의 서로 다른 호스트 이름이 표시되어 트래픽이 여러 포드에 분산되어 있음을 나타냅니다.
Hostname: echo-backend-5c78f66dbf-abcde Hostname: echo-backend-5c78f66dbf-fghij Hostname: echo-backend-5c78f66dbf-klmno ...
삭제
이 튜토리얼에서 사용한 리소스를 정리하려면 다음 명령어를 실행하세요.
클라이언트 포드, 서비스, 배포를 삭제합니다.
kubectl delete service maglev-service random-service kubectl delete deployment echo-backend kubectl delete pod client-maglev client-randomGKE 클러스터를 삭제합니다.
Autopilot
gcloud container clusters delete CLUSTER_NAME --region=COMPUTE_REGION
표준
gcloud container clusters delete CLUSTER_NAME --zone=COMPUTE_ZONE