스테이트풀(Stateful) HA 연산자로 스테이트풀(Stateful) 앱 가용성 향상


스테이트풀(Stateful) 고가용성(HA) 연산자를 사용하면 리전 영구 디스크와의 GKE 기본 제공 통합을 사용해서 StatefulSet 포드 장애 조치를 자동화하고 속도를 제어할 수 있습니다. 장애 조치를 수행하는 동안 이 연산자는 노드 장애 감지, 실패한 노드에서 볼륨 분리, 장애 조치 노드에 대한 안전한 볼륨 연결 확인을 자동으로 처리합니다.

스테이트풀(Stateful) HA 연산자를 사용하는 이유

고가용성을 얻기 위한 일반적인 스테이트풀(Stateful) 아키텍처에는 리전 영구 디스크가 스토리지 레이어로 사용됩니다. 이러한 디스크는 한 리전의 두 영역 간에 동기식 데이터 복제를 제공합니다. 노드 또는 영역 네트워크 오류가 발생하면 이 아키텍처를 통해 워크로드 failover(강제 연결) 복제본이 다른 영역의 다른 노드에 저장됩니다.

스테이트풀(Stateful) HA 연산자를 사용하면 다음과 같은 최적화를 수행할 수 있습니다.

  • 단일 복제본 애플리케이션의 복구 시간 향상: 복제본을 하나만 사용하는 경우 애플리케이션이 프로비저닝되었을 때 노드 실패 시 데이터 내구성 및 가용성을 늘리기 위해 리전 스토리지에 대해 스테이트풀(Stateful) HA 연산자를 사용하고 영역 스토리지를 교체할 수 있습니다.
  • 영역 간 네트워킹 비용 감소: 처리량이 높은 애플리케이션에는 여러 영역 간 데이터 복제 비용이 증가할 수 있습니다. 스테이트풀(Stateful) HA 연산자를 사용하면 애플리케이션의 SLA에 적합한 대체 영역으로 장애 조치 경로를 유지하면서 단일 영역에서 애플리케이션을 실행할 수 있습니다.

제한사항

단일 복제본 스테이트풀(Stateful) HA 연산자 아키텍처를 사용하는 경우 GKE는 리전 영구 디스크를 통해 2개 영역에 데이터를 보존하지만 애플리케이션 복제본이 정상 상태일 때만 데이터에 액세스할 수 있습니다. 장애 조치 중에는 복제본을 새로운 정상 노드로 다시 예약하는 동안 일시적으로 애플리케이션을 사용할 수 없습니다. 애플리케이션의 복구 시간 목표(RTO)가 매우 낮으면 다중 복제본 접근 방식을 사용하는 것이 좋습니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

요구사항

  • 클러스터 제어 영역 및 노드가 GKE 버전 1.28 이상을 실행해야 합니다.
  • 스테이트풀(Stateful) HA 연산자를 사용하면 리전 영구 디스크를 사용하도록 연결된 StatefulSet를 자동으로 구성합니다. 하지만 사용자는 포드가 이러한 디스크를 사용하도록 구성되었고 기본 스토리지와 연결된 모든 영역에서 실행될 수 있는지 확인해야 합니다.
  • 리전 영구 디스크에서 지원되는 E2, N1, N2, N2D의 머신 유형에서 애플리케이션이 실행되는지 확인합니다.
  • Compute Engine 영구 디스크 CSI 드라이버가 사용 설정되어 있는지 확인합니다. 영구 디스크 CSI 드라이버는 기본적으로 새로운 Autopilot 및 Standard 클러스터에서 사용 설정되며 Autopilot 사용 시 사용 중지하거나 수정할 수 없습니다. 클러스터에서 영구 디스크 CSI 드라이버를 수동으로 추가해야 하는 경우 기존 클러스터에서 영구 디스크 CSI 드라이버 사용 설정을 참조하세요.
  • 커스텀 StorageClass를 사용하는 경우 pd.csi.storage.gke.io 프로비저닝 도구 및 다음 매개변수를 사용하여 영구 디스크 CSI 드라이버를 구성합니다.
    • availability-class: regional-hard-failover
    • replication-type: regional-pd

스테이트풀(Stateful) HA 연산자 설정 및 사용

다음 단계에 따라 스테이트풀(Stateful) 워크로드에 대해 스테이트풀(Stateful) HA 연산자를 설정합니다.

  1. StatefulHA 부가 기능을 사용 설정합니다.
  2. HighAvailabilityApplication 리소스를 설치합니다.
  3. StatefulSet를 설치합니다.
  4. HighAvailabilityApplication 리소스를 검사합니다.

StatefulHA 부가기능 사용 설정

스테이트풀(Stateful) HA 연산자를 사용하려면 클러스터에서 StatefulHA 부가기능을 사용 설정해야 합니다.

  • Autopilot 클러스터: GKE는 클러스터 생성 시 StatefulHA 부가기능을 자동으로 사용 설정합니다. 기존 워크로드에 대해 스테이트풀(Stateful) HA 연산자를 사용하려면 새 Autopilot 클러스터에 워크로드를 다시 배포합니다.

  • Standard 클러스터:

부가 기능이 사용 설정되면 standard-rwo-regional이라는 GKE에서 StorageClass가 자동으로 설치됩니다.

HighAvailabilityApplication 리소스 설치

HighAvailabilityApplication은 StatefulSet 설정을 단순화하고 GKE에서 포드 가용성을 늘려주는 Kubernetes 리소스입니다. 스테이트풀(Stateful) HA 연산자는 GKE에서 HighAvailabilityApplication 리소스를 조정합니다.

HighAvailabilityApplication 사양에서 HighAvailabilityApplication.spec.resourceSelection.resourceKindStatefulSet로 설정해야 합니다.

고가용성 리소스를 구성하는 방법을 알아보려면 HighAvailabilityApplication 참조 문서를 확인하세요.

PostgreSQL의 경우 다음 예시를 참조하세요.

  1. stateful-ha-example-resource.yaml이라는 파일에 매니페스트를 저장합니다.

    kind: HighAvailabilityApplication
    apiVersion: ha.gke.io/v1
    metadata:
      name: APP_NAME
      namespace: APP_NAMESPACE
    spec:
      resourceSelection:
        resourceKind: StatefulSet
      policy:
        storageSettings:
          requireRegionalStorage: true
        failoverSettings:
          forceDeleteStrategy: AfterNodeUnreachable
          afterNodeUnreachable:
            afterNodeUnreachableSeconds: 20
    

    다음을 바꿉니다.

    • APP_NAME: 보호하려는 클러스터의 애플리케이션 이름입니다. 이 이름은 HighAvailabilityApplication 및 StatefulSet 모두에서 공유되어야 합니다.
    • APP_NAMESPACE: 애플리케이션 네임스페이스입니다. 이 네임스페이스는 HighAvailabilityApplication 및 보호되는 StatefulSet 모두에서 공유되어야 합니다.

    이 예시에서는 다음과 같이 정의됩니다.

    • HighAvailabilityApplication.spec.policy.storageSettings.requireRegionalSettingstrue로 설정되어 있습니다. 이렇게 하면 Regional Storage가 적용됩니다.
    • HighAvailabilityApplication.spec.policy.failoverSettingsAfterNodeUnreachable로 설정되어 있습니다. 이에 따라 노드 장애 시 강제 삭제가 트리거되는 방식이 결정됩니다.
    • HighAvailabilityApplication.spec.policy.failoverSettings.afterNodeUnreachable이 20으로 설정되어 있습니다. 이는 실행 중인 노드가 연결할 수 없음으로 표시된 후 포드 강제 삭제에 대한 제한 시간입니다.
  2. 리소스를 만듭니다. HighAvailabilityApplication 리소스는 네임스페이스 및 이름이 일치하는 StatefulSet를 식별합니다.

    kubectl apply -f stateful-ha-example-resource.yaml
    

StatefulSet 설치

StatefulSet를 설치합니다. 예를 들어 Helm을 사용하여 PostgreSQL StatefulSet를 설치할 수 있습니다. Helm은 Cloud Shell에 사전 설치되어 제공됩니다.

helm install postgresql oci://registry-1.docker.io/bitnamicharts/postgresql \
  --namespace=APP_NAMESPACE \
  --set fullnameOverride=APP_NAME

HighAvailabilityApplication 리소스는 StatefulSet의 StorageClass를 리전 영구 디스크를 사용하는 standard-rwo-regional로 자동으로 수정합니다.

HighAvailabilityApplication 리소스 검사

다음 명령어를 실행하여 예시 애플리케이션에 자동 장애 조치가 사용 설정되었는지 확인합니다.

kubectl describe highavailabilityapplication APP_NAME

출력은 다음과 비슷하게 표시됩니다.

Status:
Conditions:
  Last Transition Time:  2023-08-09T23:59:52Z
  Message:               Application is protected
  Observed Generation:   1
  Reason:                ApplicationProtected
  Status:                True
  Type:                  Protected