클러스터 백업 및 복원

이 페이지는 인프라 운영자를 위해 작성되었습니다.

이 페이지에서는 Anthos 비공개 모드로 생성된 클러스터를 백업하고 복원하는 방법을 설명합니다. 이 안내는 Anthos 비공개 모드로 지원되는 모든 클러스터 유형에 적용됩니다.

클러스터 백업

백업 프로세스는 두 부분으로 구성됩니다. 먼저 etcd 저장소에서 스냅샷을 만듭니다. 그런 후 관련 PKI 인증서가 tar 파일에 저장됩니다. etcd 저장소는 모든 클러스터 데이터에 대해 Kubernetes에서 지원되는 저장소이며 클러스터 상태 관리를 위해 필요한 모든 Kubernetes 객체 및 커스텀 객체를 포함합니다. PKI 인증서는 TLS 인증에 사용됩니다. 이 데이터는 클러스터의 제어 영역 또는 고가용성(HA)을 위한 제어 영역 중 하나에서 백업됩니다.

스냅샷 데이터를 비교적 최신 상태로 유지하기 위해 클러스터를 정기적으로 백업하는 것이 좋습니다. 백업 속도는 클러스터에서 중요한 변경사항이 수행되는 빈도에 따라 달라집니다.

etcd 저장소의 스냅샷 만들기

Anthos 비공개 모드에서는 kube-system 네임스페이스에 있는 etcd-CONTROL_PLANE_NAME이라는 이름의 Pod가 이 제어 영역에 대한 etcd를 실행합니다. 클러스터의 etcd 저장소를 백업하려면 관리 워크스테이션에서 다음 단계를 수행합니다.

  1. kubectl get po를 사용하여 etcd Pod를 식별합니다.

    kubectl --kubeconfig CLUSTER_KUBECONFIG get po -n kube-system \
        -l 'component=etcd,tier=control-plane'
    

    응답에는 etcd Pod 이름 및 해당 상태가 포함됩니다.

  2. kubectl describe pod를 사용하여 etcd 컨테이너를 포함한 etcd pod에서 실행 중인 컨테이너를 확인합니다.

    kubectl --kubeconfig CLUSTER_KUBECONFIG describe pod ETCD_POD_NAME -n kube-system
    
  3. etcd 컨테이너에서 Bash 셸을 실행합니다.

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it \
        ETCD_POD_NAME --container etcd --namespace kube-system \
        -- bin/sh
    
  4. etcd 컨테이너의 셸에서 etcdctl(API 버전 3)을 사용하여 etcd 저장소의 스냅샷, snapshot.db를 저장합니다.

    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
        --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
        snapshot save snapshotDATESTAMP.db
    

    후속 스냅샷을 덮어쓰지 않도록 DATESTAMP를 현재 날짜로 바꿉니다.

  5. 컨테이너의 셸을 종료하고 다음 명령어를 실행하여 스냅샷 파일을 관리 워크스테이션에 복사합니다.

    kubectl --kubeconfig CLUSTER_KUBECONFIG cp \
        kube-system/ETCD_POD_NAME:snapshot.db \
        --container etcd snapshot.db
    
  6. 클러스터 외부에 있고 클러스터 작업에 종속되지 않는 위치에 스냅샷 파일을 저장합니다.

PKI 인증서 보관처리

백업할 인증서는 제어 영역의 /etc/kubernetes/pki 디렉터리에 있습니다. 제어 영역이 완전히 작동 중지될 경우 클러스터를 복구하기 위해서는 etcd 저장소 snapshot.db 파일과 함께 PIK 인증서가 필요합니다. 다음 단계에서는 PKI 인증서가 포함된 tar 파일을 만듭니다.

  1. ssh를 사용하여 클러스터의 제어 영역에 루트로 연결합니다.

    ssh root@CONTROL_PLANE_NAME
    
  2. 제어 영역에서 /etc/kubernetes/pki 디렉터리의 콘텐츠로 tar 파일 certs_backup.tar.gz를 만듭니다.

    tar -czvf certs_backup.tar.gz -C /etc/kubernetes/pki .
    

    제어 영역 내에서 tar 파일을 만들면 모든 인증서 파일 권한이 보존됩니다.

  3. 제어 영역을 종료하고 워크스테이션에서 인증서가 포함된 파일을 워크스테이션의 원하는 위치에 복사합니다.

    sudo scp root@CONTROL_PLANE_NAME:certs_backup.tar.gz BACKUP_PATH
    

클러스터 복원

백업에서 클러스터를 복원하는 것은 최후의 수단으로서, 클러스터에 치명적인 장애가 발생하여 그 밖의 다른 방법으로는 정상적인 서비스로 돌아갈 수 없을 때 사용해야 합니다. etcd 데이터가 손상되었거나 etcd pod가 비정상 종료 루프에 있을 때가 그 예에 해당합니다.

클러스터 복원 프로세스는 두 부분으로 구성됩니다. 먼저 PKI 인증서가 제어 영역에 복원됩니다. 그런 후 etcd 저장소 데이터가 복원됩니다.

PKI 인증서 복원

PKI 인증서 보관처리의 설명대로 PKI 인증서를 백업했다는 가정하에 다음 단계에서는 tar 파일의 인증서를 제어 영역으로 복원하는 방법을 설명합니다.

  1. PKI 인증서 tar 파일 certs_backup.tar.gz를 워크스테이션에서 클러스터 제어 영역에 복사합니다.

    sudo scp -r BACKUP_PATH/certs_backup.tar.gz root@CONTROL_PLANE_NAME:~/
    
  2. ssh를 사용하여 클러스터의 제어 영역에 루트로 연결합니다.

    ssh root@CONTROL_PLANE_NAME
    
  3. 제어 영역에서 tar 파일의 콘텐츠를 /etc/kubernetes/pki 디렉터리에 추출합니다.

    tar -xzvf certs_backup.tar.gz -C /etc/kubernetes/pki/
    
  4. 제어 영역을 종료합니다.

etcd 저장소 복원

etcd 저장소를 복원할 때의 프로세스는 클러스터가 고가용성(HA) 모드에서 실행 중인지 여부와 HA 모드에서 실행 중인 경우 쿼럼 보존 여부에 따라 다릅니다. 다음 안내에 따라 특정 클러스터 오류 상황의 etcd 저장소를 복원합니다.

  • 실패한 클러스터가 HA 모드에서 실행되지 않으면 다음 단계에 따라 제어 영역에서 etcd 저장소를 복원합니다.

  • 클러스터가 HA 모드에서 실행 중이고 쿼럼이 보존되어 있으면 아무 작업도 하지 않습니다. 쿼럼이 보존되어 있다면 실패한 클러스터를 복원할 필요가 없습니다.

  • 클러스터를 HA 모드로 실행 중이고 쿼럼이 손실되었으면 다음 단계를 반복하여 실패한 각 구성원에 대해 etcd 저장소를 복원합니다.

워크스테이션에서 다음 단계에 따라 실패한 클러스터의 제어 영역에서 etcd 저장소를 삭제하고 복원합니다.

  1. 제어 영역의 루트 디렉터리에 /backup 디렉터리를 만듭니다.

    ssh root@CONTROL_PLANE_NAME "mkdir /backup"
    

    이 단계가 반드시 필요하진 않지만, 수행하는 것이 좋습니다. 다음 단계에서는 /backup 디렉터리를 만들었다고 가정합니다.

  2. etcd 스냅샷 파일 snapshot.db를 워크스테이션에서 클러스터 제어 영역의 backup 디렉터리에 복사합니다.

    sudo scp snapshot.db root@CONTROL_PLANE_NAME:/backup
    
  3. 해당 매니페스트 파일을 /etc/kubernetes/manifests 디렉터리에서 /backup 디렉터리로 이동하여 etcd 및 kube-apiserver 정적 Pod를 중지합니다.

    sudo mv /etc/kubernetes/manifests/etcd.yaml /backup/etcd.yaml
    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /backup/kube-apiserver.yaml
    
  4. etcd 데이터 디렉터리를 삭제합니다.

    rm -rf /var/lib/etcd/
    
  5. docker를 사용하여 etcdctl 스냅샷 복원을 실행합니다.

    sudo docker run --rm -t \
        -v /var/lib:/var/lib \
        -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \
        -v /backup:/backup \
        --env ETCDCTL_API=3 \
        k8s.gcr.io/etcd:3.2.24 etcdctl \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --cert=/etc/kubernetes/pki/etcd/server.crt \
        --key=/etc/kubernetes/pki/etcd/server.key \
        --data-dir=/var/lib/etcd \
        --name=CONTROL_PLANE_NAME \
        --initial-advertise-peer-urls=https://CONTROL_PLANE_IP:2380 \
        --initial-cluster=CONTROL_PLANE_NAME=https://CONTROL_PLANE_IP:2380 \
        snapshot restore /backup/snapshot.db
    

    --name, --initial-advertise-peer-urls, --initial-cluster의 항목은 /backup 디렉터리로 이동된 etcd.yaml 매니페스트 파일에서 찾을 수 있습니다.

  6. /var/lib/etcd가 다시 생성되고 /var/lib/etcd/member에 새 구성원이 생성되었는지 확인합니다.

  7. 정적 Pod를 다시 시작할 수 있도록 etcd 및 kube-apiserver 매니페스트를 다시 /manifests 디렉터리로 이동합니다.

    sudo mv /backup/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
    sudo mv /backup/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
    
  8. etcdctl을 사용하여 추가된 구성원이 올바르게 작동하는지 확인합니다.

    ETCDCTL_API=3 etcdctl --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt  \
        --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --endpoints=CONTROL_PLANE_IP:2379 \
        endpoint health
    

    실패한 여러 구성원을 복원한 후 실패한 모든 구성원이 복원되면 '--endpoints' 필드에 있는 복원된 모든 구성원의 제어 영역 IP 주소를 사용하여 명령어를 실행합니다.

    예를 들면 다음과 같습니다.

    ETCDCTL_API=3 etcdctl --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt  \
        --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --endpoints=10.200.0.3:2379,10.200.0.4:2379,10.200.0.5:2379 \
        endpoint health
    

    모든 엔드포인트가 성공하면 클러스터가 정상적으로 작동합니다.