Kubernetes 배포 확장

Kubernetes 환경을 사용하면 워크로드 요구사항이 변경됨에 따라 데이터베이스 리소스를 동적으로 확장할 수 있습니다. Helm 차트를 사용하여 Spanner Omni를 배포한 경우 이러한 확장 절차를 사용하세요.

시작하기 전에

Kubernetes 배포를 확장하기 전에 다음 작업을 수행해야 합니다.

권장사항으로 수평 확장을 위해 서버를 추가하기 전에 서버당 최소 32GB의 메모리로 수직 확장하는 것이 좋습니다.

제한사항

Kubernetes의 확장에는 다음과 같은 제한사항이 있습니다.

  • 비루트 서버만 해당: 수평 확장은 비루트 인스턴스에서 지원됩니다. 루트 서버 확장은 지원되지 않습니다.

  • StatefulSet 스토리지 제약조건: Kubernetes volumeClaimTemplates는 변경 불가능하므로 단일 helm upgrade 명령어를 사용하여 포드 디스크를 확장할 수 없습니다. 대신 스토리지를 확장하려면 수동 볼륨 확장 단계가 필요합니다.

수직 확장

서버의 CPU 또는 메모리 리소스를 조정하려면 Helm 업그레이드를 사용하여 구성을 업데이트합니다.

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set resources.cpu=CPU_CORES \
  --set resources.memory=MEMORY_LIMIT \
  -n NAMESPACE

다음을 바꿉니다.

  • HELM_CHART_PATH: Helm 차트의 경로(예: oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni)
  • VERSION: Helm 차트의 버전(예: 0.2.0)
  • CPU_CORES: 각 서버 포드에 할당할 vCPU 코어 수(예: 8)
  • MEMORY_LIMIT: 각 서버 포드의 RAM 한도(예: 32Gi)
  • NAMESPACE: 배포의 Kubernetes 네임스페이스(예: spanner-ns)

수평 확장

수평 확장하려면 배포에 서버를 더 추가합니다. 수평 확장은 비루트 서버에서 지원됩니다.

비루트 서버 추가

비루트 서버를 추가하려면 Helm 차트 구성에서 복제본 수를 늘립니다. 모든 영역을 균일하게 확장하거나 특정 영역을 확장할 수 있습니다.

균일하게 확장

배포의 각 영역을 15개의 서버로 확장하려면 다음 명령어를 실행합니다.

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set deployment.replicasPerZone=REPLICAS \
  -n NAMESPACE

다음을 바꿉니다.

  • HELM_CHART_PATH: Helm 차트의 경로(예: oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni)
  • VERSION: Helm 차트의 버전(예: 0.2.0)
  • REPLICAS: 영역당 서버 복제본의 대상 수(예: 15)
  • NAMESPACE: Kubernetes 네임스페이스(예: spanner-ns)

특정 영역 확장

초기 배포에서 개별 영역에 대해 다른 서버 수를 구성한 경우 단일 영역을 타겟팅할 수 있습니다. 예를 들어 첫 번째 위치 내 첫 번째 영역의 복제본을 15개로 늘리려면 다음 명령어를 실행합니다.

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set locations[0].zones[0].replicas=REPLICAS \
  -n NAMESPACE

REPLICAS를 대상 영역 복제본 수(예: 15)로 바꿉니다.

새 서버가 배포에 성공적으로 조인되었는지 확인하려면 Spanner Omni CLI를 쿼리하여 배포 서버를 나열하거나 Grafana 대시보드를 확인합니다.

spanner deployment servers list \
  --zone=ZONE \
  --deployment-endpoint=ENDPOINT

다음을 바꿉니다.

  • ZONE: 나열할 영역(예: us-central1-a)
  • ENDPOINT: 배포의 외부 엔드포인트(예: ${ENDPOINT}:15000)

비루트 서버 삭제

서버를 축소하려면 시스템에서 서비스 종료된 서버에서 데이터 파티션을 안전하게 재배치해야 하므로 추가 단계가 필요합니다. Kubernetes StatefulSet는 포드를 가장 높은 색인에서 가장 낮은 색인으로 삭제하므로 먼저 삭제할 가장 높은 색인의 비루트 서버를 타겟팅해야 합니다.

서버 수를 축소하려면 다음 단계를 수행하세요.

  1. 영역의 서버를 나열하여 삭제 후보를 식별합니다.

    spanner deployment servers list \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    출력 예시:

    NAME                                                          HOST                        PORT_BASE  ROOT  STATE
    zones/us-central1-a/servers/spanner-a-0.pod.spanner-ns:15000  spanner-a-0.pod.spanner-ns  15000      true  -
    zones/us-central1-a/servers/spanner-a-1.pod.spanner-ns:15000  spanner-a-1.pod.spanner-ns  15000      -     -
    

    가장 높은 색인 (예: spanner-a-1.pod.spanner-ns:15000)으로 서비스 종료된 비루트 서버를 삭제합니다.

    spanner deployment servers delete SERVER_NAME \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    SERVER_NAME을 서버 식별자(예: spanner-a-1.pod.spanner-ns:15000)로 바꿉니다.

    대상 서버가 목록에서 삭제될 때까지 서버 목록을 확인합니다. 삭제 후 서버는 시스템에서 비정상 상태로 전환되고 활성 서비스 경로에서 삭제됩니다.

  2. Helm 업그레이드 명령어를 실행하여 대상 복제본 수와 일치하도록 Helm 배포를 축소합니다. 예를 들어 영역당 복제본을 1 포드로 줄이려면 다음 명령어를 실행합니다.

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set deployment.replicasPerZone=REPLICAS \
      -n NAMESPACE
    

    REPLICAS를 업데이트된 복제본 수(예: 1)로 바꿉니다.

  3. 삭제된 포드와 연결된 Kubernetes 영구 볼륨 클레임 (PVC)을 삭제합니다. 실수로 인한 데이터 손실을 방지하기 위해 Helm 및 Kubernetes는 StatefulSet를 축소할 때 PVC를 자동으로 삭제하지 않습니다. PVC를 수동으로 삭제하여 스토리지를 완전히 회수합니다.

    kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE
    

    예를 들어 spanner-ns 네임스페이스에서 spanner-a-1의 로그 및 데이터 볼륨을 삭제하려면 다음 명령어를 실행합니다.

    kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
    

영역 추가

배포에 새 영역을 추가하면 가용성이 높아지고 단일 영역 중단으로부터 데이터베이스를 보호할 수 있습니다.

예를 들어 다음 명령어는 us 리전의 us-east1-b 영역에서 Google Kubernetes Engine (GKE)의 실행 중인 단일 영역 배포를 초기화합니다.

helm upgrade --install spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --set resources.cpu=2 \
  --set resources.memory=8Gi \
  --set global.platform=gke \
  --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
  -n NAMESPACE

다음 단계를 수행하여 이 구성에 영역 us-east1-c를 추가합니다.

  1. helm upgrade 명령어를 실행하고 새 위치 영역이 포함된 업데이트된 JSON 블록을 전달하여 새 영역에서 포드를 실행합니다.

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"},{"name":"us-east1-c","shortName":"east-c"}]}]' \
      -n NAMESPACE
    
  2. Spanner Omni CLI를 사용하여 새 영역을 추가합니다. 새로 만든 영역의 루트 서버 포드가 Running 및 준비 상태가 될 때까지 기다립니다. 그런 후 영역 생성 명령어를 실행합니다.

    spanner deployment zones create NEW_ZONE \
      --location=LOCATION \
      --root-servers=ROOT_SERVERS_LIST \
      --deployment-endpoint=ENDPOINT
    

    다음을 바꿉니다.

    • NEW_ZONE: 추가할 영역의 식별자(예: us-east1-c)
    • LOCATION: 배포 위치(예: us)
    • ROOT_SERVERS_LIST: 새 영역의 루트 서버 엔드포인트의 쉼표로 구분된 목록(예: spanner-east-c-0.pod.spanner-ns:15000,spanner-east-c-1.pod.spanner-ns:15000,spanner-east-c-2.pod.spanner-ns:15000)
    • ENDPOINT: 외부 배포 엔드포인트(예: ${ENDPOINT}:15000)
  3. 영역 생성이 완료될 때까지 기다립니다. 기존 데이터베이스 스키마 및 테이블을 새 영역으로 복제하는 데 시간이 걸립니다. 배포 영역을 나열하여 영역 동기화 진행 상황을 모니터링합니다.

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    

영역 삭제

멀티 영역 배포에서 활성 영역을 사용 중단하여 리소스를 줄이거나 토폴로지 변경사항에 맞출 수 있습니다.

다음 단계를 수행하여 이전 섹션에서 만든 영역 us-east1-c를 삭제합니다.

  1. 영역을 삭제하고 Spanner Omni 내에서 영역 삭제를 시작합니다.

    spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINT
    

    ZONE을 삭제할 영역(예: us-east1-c)으로 바꿉니다.

  2. 영역이 삭제되었는지 확인합니다. 목록 명령어를 실행하고 영역이 더 이상 출력에 표시되지 않을 때까지 기다립니다.

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    
  3. helm 업그레이드 명령어를 실행하고 삭제된 영역을 제외하는 업데이트된 위치 JSON 블록을 전달하여 Kubernetes 클러스터에서 서버를 삭제합니다.

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
      -n NAMESPACE
    

스토리지 확장

Kubernetes volumeClaimTemplates는 변경 불가능하므로 helm upgrade 명령어를 직접 사용하여 포드 스토리지 용량을 수직 확장할 수 없습니다. 대신 수동 볼륨 확장을 수행해야 합니다. 자세한 내용은 GKE StatefulSet 볼륨 확장 가이드를 참조하세요.

디스크 스토리지를 확장하려면 다음 단계를 수행하세요.

  1. 터미널에서 볼륨 확장의 매개변수를 환경 변수로 정의합니다.

    NEW_SIZE="NEW_SIZE"
    NAMESPACE="NAMESPACE"
    RELEASE_NAME="spanner-omni"
    STATEFULSET_NAMES="STATEFULSET_NAME_1 STATEFULSET_NAME_2 STATEFULSET_NAME_3"
    HELM_CHART_PATH="HELM_CHART_PATH"
    VERSION="VERSION"
    

    다음을 바꿉니다.

    • NEW_SIZE: 대상 스토리지 용량 크기(예: 200Gi)
    • NAMESPACE: Kubernetes 네임스페이스(예: spanner-ns)
    • STATEFULSET_NAME_1, STATEFULSET_NAME_2, ...: 배포의 StatefulSets 이름으로 일반적으로 영역의 짧은 이름에 해당합니다 (예: spanner-east-b spanner-east-c).
    • HELM_CHART_PATH: Helm 차트의 경로(예: oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni)
    • VERSION: Helm 차트의 버전(예: 0.2.0)
  2. 명령어를 실행하여 PVC를 패치하고, 백엔드 포드를 그대로 두고 StatefulSet를 삭제하고, Helm 배포를 업그레이드합니다.

    # Patch all associated PVCs directly.
    for pvc in $(kubectl get pvc -n $NAMESPACE \
      -l app.kubernetes.io/instance=$RELEASE_NAME \
      -o name | grep "data-volume"); do
      kubectl patch $pvc -n $NAMESPACE -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\":\"$NEW_SIZE\"}}}}"
    done
    
    # Delete the StatefulSet while leaving backend pods intact (orphan cascade).
    kubectl delete statefulset $STATEFULSET_NAMES -n $NAMESPACE --cascade=orphan
    
    # Run Helm upgrade to align the templates with the expanded size.
    helm upgrade $RELEASE_NAME $HELM_CHART_PATH \
      --version $VERSION \
      --reuse-values \
      --set storage.data.size=$NEW_SIZE \
      -n $NAMESPACE
    

다음 단계