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 차트의 버전입니다(예: 1.0.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 차트의 버전입니다(예: 1.0.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 upgrade 명령어를 실행하고 삭제된 영역을 제외하는 업데이트된 위치 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 차트의 버전입니다(예: 1.0.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
    

다음 단계