이 문서에서는 관리자 클러스터의 etcd 저장소를 백업 및 복원하는 방법을 설명합니다. 또한 클러스터의 etcd 저장소를 자동으로 백업하는 데 사용할 수 있는 스크립트도 제공합니다.
클러스터의 etcd 데이터를 손상시킬 수 있는 재해 발생 시 복구할 수 있는 백업 파일을 만들 수 있습니다. 클러스터 외부에 있고 클러스터 작업에 종속되지 않는 위치에 백업 파일을 저장합니다.
제한사항
이 절차에서는 애플리케이션별 데이터를 백업하지 않습니다.
또한 PersistentVolume을 백업하지 않습니다.
백업을 만든 후에 예약된 워크로드는 백업으로 복원되지 않습니다.
업그레이드 실패 후 클러스터를 복원할 수 없습니다.
이 절차는 삭제된 클러스터를 복원하기 위한 것이 아닙니다.
관리자 클러스터 백업
관리자 클러스터 백업에는 다음이 포함됩니다.
- 관리자 클러스터 etcd의 스냅샷
- 관리자 클러스터와 사용자 클러스터에 인증하는 데 필요한 관리자 제어 영역의 보안 비밀
관리자 클러스터 백업을 만들기 전에 다음 단계를 완료합니다.
관리자 클러스터 제어 영역에 SSH를 통해 연결하는 데 사용되는 관리자 클러스터의 외부 IP 주소를 찾습니다.
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get nodes -n kube-system -o wide | grep master
여기서 [ADMIN_CLUSTER_KUBECONFIG]는 관리자 클러스터의 kubeconfig 파일입니다.
관리자 클러스터의 비공개 키에서
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
비공개 키를 사용하여 관리자 제어 영역에 셸을 사용할 수 있는지 확인합니다.
ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
컨테이너를 종료합니다.
exit
관리자 클러스터 etcd 저장소 백업
관리자 클러스터의 etcd 저장소를 백업하려면 다음 안내를 따르세요.
etcd pod 이름을 가져옵니다.
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods \ -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
포드의 kube-etcd 컨테이너에 셸을 사용합니다.
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] exec -it \ -n kube-system [ADMIN_ETCD_POD] -- bin/sh
여기서 [ADMIN_ETCD_POD]는 etcd 포드 이름입니다.
셸에서
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
컨테이너를 종료합니다.
exit
kubectl cp
를 사용하여 kube-etcd 컨테이너에서 백업을 복사합니다.kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \ kube-system/[ADMIN_ETCD_POD]:tmp/snapshot.db [RELATIVE_DIRECTORY]
여기서 [RELATIVE_DIRECTORY]는 백업을 저장할 경로입니다.
관리자 클러스터 보안 비밀 백업
관리자 제어 영역의 보안 비밀을 백업하려면 다음 안내를 따르세요.
SSH를 사용하여 관리자 제어 영역 노드에 연결합니다.
ssh -i vsphere_tmp ubuntu@EXTERNAL_IP
EXTERNAL_IP
를 이전에 확인한 관리자 제어 영역의 외부 IP 주소로 바꿉니다.선택사항이지만 중요한 권장사항: 로컬 백업 디렉터리를 만드세요.
노드에서 복사하려면 백업 보안 비밀의 권한을 변경해야 합니다.
mkdir backup
보안 비밀을 로컬 백업 디렉터리에 로컬로 복사합니다.
sudo cp -r /etc/kubernetes/pki/* backup/
백업 보안 비밀의 권한을 변경합니다.
sudo chmod -R a+rX backup/
관리자 제어 영역 노드를 종료합니다.
exit
scp
를 실행하여 관리자 제어 영역 노드에서 백업 폴더를 복사합니다.sudo scp -r -i vsphere_tmp ubuntu@EXTERNAL_IP:backup/ RELATIVE_DIRECTORY
RELATIVE_DIRECTORY
를 백업을 저장할 경로로 바꿉니다.
관리자 클러스터 복원
다음 절차에서는 백업된 관리자 클러스터와 etcd 스냅샷이 생성되었을 때 관리했던 모든 사용자 제어 영역을 다시 만듭니다.
scp
를 실행하여snapshot.db
를 관리자 제어 영역에 복사합니다.sudo scp -i vsphere_tmp snapshot.db ubuntu@[EXTERNAL_IP]:
여기서 [EXTERNAL_IP]는 이전에 수집한 관리자 제어 영역의 외부 IP 주소입니다.
관리자 제어 영역에 셸을 사용합니다.
sudo ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
snapshot.db/
를/mnt
에 복사합니다.sudo cp snapshot.db /mnt/
backup
과 같은 임시 디렉터리를 만듭니다.mkdir backup
관리자 제어 영역을 종료합니다.
exit
인증서를
backup/
에 복사합니다.sudo scp -r -i vsphere_tmp [BACKUP_CERT_FILE] ubuntu@[EXTERNAL_IP]:backup/
관리자 제어 영역 노드에 셸을 사용합니다.
ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
여기서 [EXTERNAL_IP]는 이전에 수집한 관리자 제어 영역의 외부 IP 주소입니다.
kube-etcd
및kube-apiserver
를 중지합니다.sudo mv /etc/kubernetes/manifests/etcd.yaml /tmp/etcd.yaml
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/kube-apiserver.yaml
백업 보안 비밀을
/etc/kubernetes/pki/
에 복사합니다.sudo cp -r backup/* /etc/kubernetes/pki/
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/"
kube-etcd
및kube-apiserver
를 다시 시작합니다.sudo mv /tmp/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
kube-etcd
및kube-apiserver
가 시작되었는지 확인합니다.sudo crictl ps -a
관리자 워크스테이션에서 액세스할 수 있도록
/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
관리자 제어 영역을 종료합니다.
exit
관리 노드에서 새로 생성된 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 지원에 연락하여 관리자 클러스터 문제를 해결해야 합니다.
그동안 다음 사항을 확인하여 추가로 문제를 해결할 수 있습니다.
etcd 컨테이너 ID 찾기
sudo crictl ps -a | grep [ADMIN_ETCD_POD]
여기서 [ADMIN_ETCD_POD]는 etcd 포드 이름입니다.
etc 컨테이너에서 로그 검토
sudo crictl logs [ETCD_CONTAINER_ID]
여기서 [ETCD_CONTAINER_ID]는 etcd 컨테이너의 ID입니다.
다음과 같은 권한 거부 로그 메시지를 찾습니다.
etcdserver: create snapshot directory error:mkdir /var/lib/etcd/member/snap: permission denied
권한 거부 메시지가 발견되면 /opt/data/var/lib/etcd/의 소유권을 업데이트합니다.
sudo chown -R 2001:2001 /opt/data/var/lib/etcd/
kube-etcd
및kube-apiserver
가 시작되었는지 확인합니다.sudo crictl ps
자동 클러스터 백업
여기에서 제공된 스크립트를 클러스터를 자동으로 백업하는 방법에 대한 예시로 사용할 수 있습니다. 다음 스크립트는 지원되지 않으며 더 강력하고 완전한 스크립트를 작성하기 위한 참조로만 사용되어야 합니다. 스크립트를 실행하기 전에 스크립트 시작 부분에 있는 변수 5개의 값을 입력합니다.
BACKUP_DIR
를 관리자 클러스터와 사용자 클러스터 백업을 저장할 경로로 설정합니다. 이 경로는 존재하지 않아야 합니다.ADMIN_CLUSTER_KUBECONFIG
를 관리자 클러스터의 kubeconfig 파일 경로로 설정합니다.USER_CLUSTER_NAMESPACE
를 사용자 클러스터 이름으로 설정합니다. 사용자 클러스터 이름은 관리자 클러스터의 네임스페이스입니다.EXTERNAL_IP
를 관리자 제어 영역 서비스에 사용하도록 예약한 VIP로 설정합니다.SSH_PRIVATE_KEY
를 SSH 키 경로로 설정합니다.- 비공개 네트워크를 사용하는 경우
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
다음 단계
- 사용자 클러스터 백업 및 복원
- 클러스터 문제 진단 방법 알아보기
- etcd 백업에서 개별 객체를 복원하는 데 사용되는 오픈소스 도구인 augur 알아보기