관리자 클러스터 백업 및 복원

이 문서에서는 관리자 클러스터의 etcd 저장소를 백업 및 복원하는 방법을 설명합니다. 또한 클러스터의 etcd 저장소를 자동으로 백업하는 데 사용할 수 있는 스크립트도 제공합니다.

클러스터의 etcd 데이터를 손상시킬 수 있는 재해 발생 시 복구할 수 있는 백업 파일을 만들 수 있습니다. 클러스터 외부에 있고 클러스터 작업에 종속되지 않는 위치에 백업 파일을 저장합니다.

제한사항

  • 이 절차에서는 애플리케이션별 데이터를 백업하지 않습니다.

  • 또한 PersistentVolume을 백업하지 않습니다.

  • 백업을 만든 후에 예약된 워크로드는 백업으로 복원되지 않습니다.

  • 업그레이드 실패 후 클러스터를 복원할 수 없습니다.

  • 이 절차는 삭제된 클러스터를 복원하기 위한 것이 아닙니다.

관리자 클러스터 백업

관리자 클러스터 백업에는 다음이 포함됩니다.

  • 관리자 클러스터 etcd의 스냅샷
  • 관리자 클러스터와 사용자 클러스터에 인증하는 데 필요한 관리자 제어 영역의 보안 비밀

관리자 클러스터 백업을 만들기 전에 다음 단계를 완료합니다.

  1. 관리자 클러스터 제어 영역에 SSH를 통해 연결하는 데 사용되는 관리자 클러스터의 외부 IP 주소를 찾습니다.

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get nodes -n kube-system -o wide | grep master

    여기서 [ADMIN_CLUSTER_KUBECONFIG]는 관리자 클러스터의 kubeconfig 파일입니다.

  2. 관리자 클러스터의 비공개 키에서 vsphere_tmp라는 SSH 키를 만듭니다.

    관리자 클러스터 보안 비밀에서 비공개 키를 찾을 수 있습니다.

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get secrets sshkeys -n kube-system -o yaml

    명령어 결과의 vsphere_tmp 필드에서 비공개 키를 찾을 수 있습니다.

    비공개 키를 vsphere_tmp에 복사합니다.

    echo "[PRIVATE_KEY]" | base64 -d > vsphere_tmp; chmod 600 vsphere_tmp
  3. 비공개 키를 사용하여 관리자 제어 영역에 셸을 사용할 수 있는지 확인합니다.

    ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    
  4. 컨테이너를 종료합니다.

    exit

관리자 클러스터 etcd 저장소 백업

관리자 클러스터의 etcd 저장소를 백업하려면 다음 안내를 따르세요.

  1. etcd pod 이름을 가져옵니다.

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods \
        -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
  2. 포드의 kube-etcd 컨테이너에 셸을 사용합니다.

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]  exec -it \
        -n kube-system [ADMIN_ETCD_POD] -- bin/sh

    여기서 [ADMIN_ETCD_POD]는 etcd 포드 이름입니다.

  3. 셸에서 etcdctl을 사용하여 로컬 디렉터리에 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 /tmp/snapshot.db
    
  4. 컨테이너를 종료합니다.

    exit
  5. kubectl cp를 사용하여 kube-etcd 컨테이너에서 백업을 복사합니다.

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \
    kube-system/[ADMIN_ETCD_POD]:tmp/snapshot.db [RELATIVE_DIRECTORY]
    

    여기서 [RELATIVE_DIRECTORY]는 백업을 저장할 경로입니다.

관리자 클러스터 보안 비밀 백업

관리자 제어 영역의 보안 비밀을 백업하려면 다음 안내를 따르세요.

  1. SSH를 사용하여 관리자 제어 영역 노드에 연결합니다.

    ssh -i vsphere_tmp ubuntu@EXTERNAL_IP
    

    EXTERNAL_IP를 이전에 확인한 관리자 제어 영역의 외부 IP 주소로 바꿉니다.

  2. 선택사항이지만 중요한 권장사항: 로컬 백업 디렉터리를 만드세요.

    노드에서 복사하려면 백업 보안 비밀의 권한을 변경해야 합니다.

    mkdir backup
  3. 보안 비밀을 로컬 백업 디렉터리에 로컬로 복사합니다.

    sudo cp -r /etc/kubernetes/pki/* backup/
  4. 백업 보안 비밀의 권한을 변경합니다.

    sudo chmod -R a+rX backup/
  5. 관리자 제어 영역 노드를 종료합니다.

    exit
  6. scp를 실행하여 관리자 제어 영역 노드에서 백업 폴더를 복사합니다.

    sudo scp -r -i vsphere_tmp  ubuntu@EXTERNAL_IP:backup/ RELATIVE_DIRECTORY
    

    RELATIVE_DIRECTORY를 백업을 저장할 경로로 바꿉니다.

관리자 클러스터 복원

다음 절차에서는 백업된 관리자 클러스터와 etcd 스냅샷이 생성되었을 때 관리했던 모든 사용자 제어 영역을 다시 만듭니다.

  1. scp를 실행하여 snapshot.db를 관리자 제어 영역에 복사합니다.

    sudo scp -i vsphere_tmp snapshot.db ubuntu@[EXTERNAL_IP]:

    여기서 [EXTERNAL_IP]는 이전에 수집한 관리자 제어 영역의 외부 IP 주소입니다.

  2. 관리자 제어 영역에 셸을 사용합니다.

    sudo ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    
  3. snapshot.db//mnt에 복사합니다.

    sudo cp snapshot.db /mnt/
  4. backup과 같은 임시 디렉터리를 만듭니다.

    mkdir backup
  5. 관리자 제어 영역을 종료합니다.

    exit
  6. 인증서를 backup/에 복사합니다.

    sudo scp -r -i vsphere_tmp [BACKUP_CERT_FILE] ubuntu@[EXTERNAL_IP]:backup/
  7. 관리자 제어 영역 노드에 셸을 사용합니다.

    ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    

    여기서 [EXTERNAL_IP]는 이전에 수집한 관리자 제어 영역의 외부 IP 주소입니다.

  8. kube-etcdkube-apiserver를 중지합니다.

    sudo mv /etc/kubernetes/manifests/etcd.yaml /tmp/etcd.yaml
    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/kube-apiserver.yaml
  9. 백업 보안 비밀을 /etc/kubernetes/pki/에 복사합니다.

    sudo cp -r backup/* /etc/kubernetes/pki/
  10. Docker로 etcdctl restore를 실행합니다.

    sudo docker run --rm \
    -v '/mnt:/backup' \
    -v '/var/lib/etcd:/var/lib/etcd' --env ETCDCTL_API=3 'gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION' /bin/sh -c "etcdctl snapshot restore '/backup/snapshot.db'; rm -r /var/lib/etcd/*; mv /default.etcd/member/ /var/lib/etcd/"
  11. kube-etcdkube-apiserver를 다시 시작합니다.

    sudo mv /tmp/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
    sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
  12. kube-etcdkube-apiserver가 시작되었는지 확인합니다.

    sudo crictl ps -a
  13. 관리자 워크스테이션에서 액세스할 수 있도록 /etc/kubernetes/admin.conf.kube 폴더에 복사합니다.

    mkdir -p [HOME]/.kube
    sudo cp -i /etc/kubernetes/admin.conf [HOME]/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  14. 관리자 제어 영역을 종료합니다.

    exit
  15. 관리 노드에서 새로 생성된 kubeconfig 파일을 복사합니다.

    sudo scp -i vsphere_tmp ubuntu@[EXTERNAL_IP]:[HOME]/.kube/config kubeconfig
    sudo chown $(id -u):$(id -g) kubeconfig

    각 항목의 의미는 다음과 같습니다.

    • [EXTERNAL_IP]는 관리자 제어 영역의 외부 IP 주소입니다.
    • [HOME]은 관리 노드의 홈 디렉터리입니다.

    이제 이 새로운 kubeconfig 파일을 사용하여 복원된 클러스터에 액세스할 수 있습니다.

관리자 클러스터 복원 문제 해결

관리자 클러스터를 복구할 때 문제가 발생하면 Google 지원에 연락하여 관리자 클러스터 문제를 해결해야 합니다.

그동안 다음 사항을 확인하여 추가로 문제를 해결할 수 있습니다.

  1. etcd 컨테이너 ID 찾기

    sudo crictl ps -a | grep [ADMIN_ETCD_POD]

    여기서 [ADMIN_ETCD_POD]는 etcd 포드 이름입니다.

  2. etc 컨테이너에서 로그 검토

    sudo crictl logs [ETCD_CONTAINER_ID]

    여기서 [ETCD_CONTAINER_ID]는 etcd 컨테이너의 ID입니다.

  3. 다음과 같은 권한 거부 로그 메시지를 찾습니다.

    etcdserver: create snapshot directory error:mkdir /var/lib/etcd/member/snap: permission denied

  4. 권한 거부 메시지가 발견되면 /opt/data/var/lib/etcd/의 소유권을 업데이트합니다.

    sudo chown -R 2001:2001 /opt/data/var/lib/etcd/

  5. kube-etcdkube-apiserver가 시작되었는지 확인합니다.

    sudo crictl ps

자동 클러스터 백업

여기에서 제공된 스크립트를 클러스터를 자동으로 백업하는 방법에 대한 예시로 사용할 수 있습니다. 다음 스크립트는 지원되지 않으며 더 강력하고 완전한 스크립트를 작성하기 위한 참조로만 사용되어야 합니다. 스크립트를 실행하기 전에 스크립트 시작 부분에 있는 변수 5개의 값을 입력합니다.

  • BACKUP_DIR를 관리자 클러스터와 사용자 클러스터 백업을 저장할 경로로 설정합니다. 이 경로는 존재하지 않아야 합니다.
  • ADMIN_CLUSTER_KUBECONFIG를 관리자 클러스터의 kubeconfig 파일 경로로 설정합니다.
  • USER_CLUSTER_NAMESPACE를 사용자 클러스터 이름으로 설정합니다. 사용자 클러스터 이름은 관리자 클러스터의 네임스페이스입니다.
  • EXTERNAL_IP를 관리자 제어 영역 서비스에 사용하도록 예약한 VIP로 설정합니다.
  • SSH_PRIVATE_KEYSSH 키 경로로 설정합니다.
  • 비공개 네트워크를 사용하는 경우 JUMP_IP를 네트워크의 점프 서버 IP 주소로 설정합니다.
#!/usr/bin/env bash

# Automates manual steps for taking backups of user and admin clusters.
# Fill in the variables below before running the script.

BACKUP_DIR=""                       # path to store user and admin cluster backups
ADMIN_CLUSTER_KUBECONFIG=""         # path to admin cluster kubeconfig
USER_CLUSTER_NAMESPACE=""           # user cluster namespace
EXTERNAL_IP=""                      # admin control plane node external ip - follow steps in documentation
SSH_PRIVATE_KEY=""                  # path to vsphere_tmp ssh private key - follow steps in documentation
JUMP_IP=""                          # network jump server IP - leave empty string if not using private network.

mkdir -p $BACKUP_DIR
mkdir $BACKUP_DIR/pki

# USER CLUSTER BACKUP

# Snapshot user cluster etcd
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n ${USER_CLUSTER_NAMESPACE} kube-etcd-0 -c kube-etcd -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key snapshot save /tmp/${USER_CLUSTER_NAMESPACE}_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:tmp/${USER_CLUSTER_NAMESPACE}_snapshot.db $BACKUP_DIR/user-cluster_${USER_CLUSTER_NAMESPACE}_snapshot.db

# ADMIN CLUSTER BACKUP

# Set up ssh options
SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY})
if [ "${JUMP_IP}" != "" ]; then
    SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}")
fi

# Copy admin certs
ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R a+rX /etc/kubernetes/pki/*'
scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/

# Snapshot admin cluster etcd
admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}')
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export 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 /tmp/admin_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:tmp/admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db

다음 단계