포드 스냅샷에서 워크로드 복원

저장된 포드 스냅샷에서 워크로드를 복원하고, 기존 스냅샷을 관리하고, Google Kubernetes Engine (GKE) 포드 스냅샷을 사용 중지하는 방법을 알아봅니다.

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

스냅샷 관리

포드 스냅샷을 만들면 당시의 포드 상태를 저장하는 PodSnapshot 커스텀 리소스가 생성됩니다. 이 리소스의 status 필드는 스냅샷 작업이 성공했는지, 스냅샷을 복원할 수 있는지 나타냅니다.

네임스페이스의 모든 PodSnapshot 리소스를 보려면 다음 명령어를 실행합니다.

kubectl get podsnapshots.podsnapshot.gke.io --namespace NAMESPACE

다음과 유사한 결과가 출력됩니다.

NAME                                   STATUS                  POLICY           AGE
de334898-1e7a-4cdb-9f2e-7cc2181c29e4   AllSnapshotsAvailable   example-policy   47h

스냅샷에서 워크로드 복원

최신 스냅샷에서 워크로드를 복원하려면 스냅샷을 생성한 후 기존 포드를 삭제한 다음 포드를 다시 배포하면 됩니다. 또는 동일한 사양으로 새 포드를 배포할 수 있습니다. GKE는 일치하는 스냅샷에서 포드를 자동으로 복원합니다.

다음 단계에서는 포드를 삭제하고 다시 배포하여 일치하는 스냅샷에서 포드를 복원하는 방법을 보여줍니다.

  1. 포드를 삭제합니다.

    kubectl delete -f POD_NAME.yaml
    

    POD_NAME을 포드 이름(예: my-app)으로 바꿉니다.

  2. 포드를 다시 적용합니다.

    kubectl apply -f POD_NAME.yaml
    
  3. 로그를 확인하여 스냅샷 복원을 확인합니다.

    kubectl logs my-app --namespace NAMESPACE
    

    출력은 애플리케이션을 구성한 방식에 따라 다릅니다. Python 애플리케이션 예시에서 복원 작업이 발생하면 로그에 GKE Pod Snapshot: restore가 표시됩니다.

특정 스냅샷에서 복원

기본적으로 GKE는 포드와 일치하는 가장 최근의 PodSnapshot 리소스에서 워크로드를 복원합니다. 스냅샷이 생성되면 GKE는 PodSnapshot 리소스의 고유한 이름 (UUID)을 자동 생성하며, kubectl get podsnapshots.podsnapshot.gke.io --namespace NAMESPACE를 실행하여 이를 확인할 수 있습니다.

이전 또는 특정 PodSnapshot 리소스에서 워크로드를 복원하려면 워크로드 포드 사양에 podsnapshot.gke.io/ps-name 주석을 추가하여 워크로드 복원에 사용할 PodSnapshot 리소스의 이름을 지정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  namespace: NAMESPACE
  labels:
    app: my-app
  annotations:
    podsnapshot.gke.io/ps-name: "POD_SNAPSHOT_NAME"
spec:
  serviceAccountName: KSA_NAME
  runtimeClassName: gvisor
  containers:
  ...

다음을 바꿉니다.

  • POD_SNAPSHOT_NAME: 복원할 스냅샷의 이름입니다. kubectl get podsnapshots.podsnapshot.gke.io --namespace NAMESPACE 명령어를 실행하여 스냅샷 이름을 가져올 수 있습니다.
  • NAMESPACE: 포드의 네임스페이스입니다.
  • KSA_NAME: KSA의 이름입니다.

GKE가 복원에 지정된 스냅샷을 사용하려면 PodSnapshot 리소스 상태 조건이 Ready이어야 하고 포드와 동일한 네임스페이스에 있어야 합니다. PodSnapshot이 Ready이 아니거나 포드와 동일한 네임스페이스에 없는 경우 워크로드는 스냅샷에서 복원하는 대신 콜드 스타트를 실행합니다.

스냅샷 일치 및 호환성

GKE가 스냅샷에서 포드를 복원할 때는 호환되는 스냅샷을 결정해야 합니다. 호환성은 선택 순서, 일치 기준 (whole-pod 대 rootfs-only 범위 기반), 그룹화 규칙 일치와 같은 규칙에 따라 결정됩니다.

일치 요구사항, 호환성 기준, 호환성에 영향을 미치는 사양 필드에 관한 자세한 내용은 포드 스냅샷 일치 및 호환성을 참고하세요.

스냅샷 사용 중지

PodSnapshotPolicy CRD를 삭제하면 포드가 스냅샷되고 복원되지 않습니다. 실행 중인 포드는 리소스 삭제의 영향을 받지 않습니다. 하지만 포드가 저장되거나 복원되는 동안 정책을 삭제하면 포드가 실패 상태가 될 수 있습니다.

정책에 의거하여 관리되는 새 포드의 스냅샷 생성 및 복원을 사용 중지하려면 다음 명령어를 실행하여 PodSnapshotPolicy를 삭제합니다.

kubectl delete podsnapshotpolicies.podsnapshot.gke.io SNAPSHOT_POLICY --namespace=NAMESPACE

SNAPSHOT_POLICY을 삭제하려는 PodSnapshotPolicy의 이름으로 바꿉니다(예: example-pod-snapshot-policy).

포드가 더 이상 특정 스냅샷에서 복원되지 않도록 특정 PodSnapshot 리소스를 삭제할 수도 있습니다. PodSnapshot 리소스를 삭제하면 Cloud Storage에 저장된 파일도 삭제됩니다.

특정 스냅샷이 향후 복원에 사용되지 않도록 하려면 다음 명령어를 실행하여 PodSnapshot 객체를 삭제합니다.

kubectl delete podsnapshots.podsnapshot.gke.io POD_SNAPSHOT_NAME --namespace=NAMESPACE

POD_SNAPSHOT_NAME을 삭제할 스냅샷의 이름으로 바꿉니다(예: example-podsnapshot).

다음 단계

포드 스냅샷 문제 해결 방법을 알아보세요.