클러스터 백업 및 복원

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

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

제한사항

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

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

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

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

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

사용자 클러스터 백업

사용자 클러스터 백업은 사용자 클러스터 etcd 저장소의 스냅샷입니다. etcd 저장소에는 클러스터 상태를 관리하는 데 필요한 모든 Kubernetes 객체와 커스텀 객체가 포함되어 있습니다. 스냅샷에는 클러스터의 구성요소와 워크로드를 다시 만드는 데 필요한 데이터가 포함되어 있습니다.

etcd 저장소의 스냅샷을 만들려면 다음 단계를 수행합니다.

  1. 셸을 kube-etcd 컨테이너로 가져옵니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \
       kube-etcd-0 --container kube-etcd --namespace USER_CLUSTER_NAME \
       -- bin/sh
    

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

    • ADMIN_CLUSTER_KUBECONFIG는 관리자 클러스터의 kubeconfig 파일입니다.
    • USER_CLUSTER_NAME은 사용자 클러스터 이름입니다.
  2. 셸의 루트 디렉터리에 snapshot.db라는 백업을 만듭니다.

    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 snapshot.db
    
  3. 셸에 exit를 입력하여 셸을 종료합니다.

  4. snapshot.dbkube-etcd 컨테이너에서 현재 디렉터리로 복사합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp \
       USER_CLUSTER_NAME/kube-etcd-0:snapshot.db \
       --container kube-etcd snapshot.db
    

백업에서 사용자 클러스터 복원(비HA)

백업 파일을 사용하여 사용자 클러스터 etcd 저장소를 복원하기 전에 클러스터를 진단하고 기존 문제를 해결합니다. 백업을 사용하여 문제가 있는 클러스터를 복원하면 문제가 다시 생기거나 악화될 수 있습니다. 클러스터 복원에 대한 추가 도움은 GKE On-Prem 지원팀에 문의하세요.

다음 안내에서는 클러스터의 etcd 데이터가 손상되고 사용자 클러스터의 etcd pod가 비정상 종료되는 경우에 백업 파일을 사용하여 사용자 클러스터를 복원하는 방법을 설명합니다.

손상된 데이터를 백업으로 덮어쓰는 유틸리티 pod를 배포하면 etcd 데이터를 복원할 수 있습니다. 관리자 클러스터의 API 서버가 실행 중이어야 하며 관리자 클러스터의 스케줄러가 새 pod를 예약할 수 있어야 합니다.

  1. 다음 pod 매니페스트를 etcd-utility.yaml이라는 파일에 복사합니다. 이러한 자리표시자를 다음 값으로 바꿉니다.

    • NODE_NAME: kube-etcd-0 pod가 실행 중인 노드입니다.

    • ADMIN_CLUSTER_KUBECONFIG: 관리자 클러스터의 kubeconfig 파일입니다.

    • USER_CLUSTER_NAME: 사용자 클러스터의 이름입니다.

    • GKE_ON_PREM_VERSION: etcd 복원을 수행하려는 클러스터의 버전입니다(예: 1.5.0-gke.0).

    apiVersion: v1
    kind: Pod
    metadata:
      name: etcd-utility-0
      namespace: USER_CLUSTER_NAME
    spec:
      containers:
      - command: ["/bin/sh"]
        args: ["-ec", "while :; do echo '.'; sleep 5 ; done"]
        image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION
        name: etcd-utility
        volumeMounts:
        - mountPath: /var/lib/etcd
          name: data
        - mountPath: /etcd.local.config/certificates
          name: etcd-certs
      nodeSelector:
        kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME
        kubernetes.io/hostname: NODE_NAME
      tolerations:
      - effect: NoExecute
        key: node.kubernetes.io/not-ready
        operator: Exists
        tolerationSeconds: 300
      - effect: NoExecute
        key: node.kubernetes.io/unreachable
        operator: Exists
        tolerationSeconds: 300
      - effect: NoSchedule
        key: node.kubernetes.io/unschedulable
        operator: Exists
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data-kube-etcd-0
      - name: etcd-certs
        secret:
          defaultMode: 420
          secretName: kube-etcd-certs
    
  2. 유틸리티 pod를 배포합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
       create -f etcd-utility.yaml --namespace USER_CLUSTER_NAME
    
  3. snapshot.db를 현재 디렉터리에서 유틸리티 pod의 루트 디렉터리로 복사합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp snapshot.db \
       USER_CLUSTER_NAME/etcd-utility-0:snapshot.db --container etcd-utility
    
  4. 셸을 etcd-utility 컨테이너로 가져옵니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec it \
       etcd-utility-0 --container etcd-utility --namespace USER_CLUSTER_NAME \
       -- bin/sh
    
  5. 셸의 루트 디렉터리에서 다음 명령어를 실행하여 백업이 포함된 새 폴더를 만듭니다.

    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 restore snapshot.db
    
  6. 셸에서 이전 etcd 데이터를 삭제합니다.

    rm -r var/lib/etcd/*
    
  7. 셸에서 복원된 etcd 데이터를 영구 위치로 복사합니다.

    cp -r default.etcd/* var/lib/etcd/
    
  8. 셸에 exit를 입력하여 셸을 종료합니다.

  9. 비정상 종료되는 etcd pod를 삭제합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
       delete pod kube-etcd-0 --namespace USER_CLUSTER_NAME
    
  10. etcd pod가 더 이상 비정상 종료되지 않는지 확인합니다.

  11. 유틸리티 pod를 삭제합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
       delete pod etcd-utility-0 --namespace USER_CLUSTER_NAME
  12. 현재 디렉터리에서 etcd-utility.yaml을 삭제합니다.

    rm etcd-utility.yaml
    

백업에서 사용자 클러스터 복원(HA)

이 섹션에서는 고가용성(HA) 사용자 클러스터의 etcd 데이터를 복원하는 방법을 설명합니다.

HA 사용자 클러스터의 경우 사용자 클러스터의 제어 영역 역할을 하는 노드 세 개가 관리자 클러스터에 있습니다. 이러한 각 노드는 etcd pod를 실행하고 etcd pod는 스토리지 볼륨에 etcd 데이터를 유지합니다.

etcd pod 두 개가 정상이고 연결된 스토리지 볼륨의 데이터가 손상되지 않았으면 백업 파일을 사용할 필요가 없습니다. 여전히 etcd 쿼럼이 있기 때문입니다.

드물지만 etcd 스토리지 볼륨 두 개의 데이터가 손상되었으면 백업 파일을 사용하여 etcd 데이터를 복원해야 합니다.

이 섹션의 단계를 수행하려면 사용자 클러스터 백업의 설명대로 이미 snapshot.db 파일을 만든 상태여야 합니다.

etcd Pod 및 노드 나열

  1. 사용자 클러스터의 etcd 저장소를 관리하는 etcd pod를 나열합니다. 이러한 pod는 관리자 클러스터에서 실행됩니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \
        --output wide | grep kube-etcd
    

    출력에는 etcd pod와 pod가 실행되는 노드가 표시됩니다. 출력에 표시되는 노드는 사용자 클러스터의 제어 영역 역할을 하는 관리자 클러스터의 노드입니다.

    NAME              ...   NODE
    kube-etcd-0       ...   node-xxx
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  2. 나중에 사용할 수 있도록 pod 이름과 제어 영역 노드 이름을 기록해 둡니다.

    각 etcd pod 이름은 kube-etcd에 숫자가 추가된 이름입니다. 이 숫자를 pod의 구성원 번호라고 합니다. 이 숫자를 통해 pod는 사용자 클러스터의 객체 데이터를 보관하는 etcd 클러스터의 특정 구성원으로 식별됩니다. 이 가이드에서는 자리표시자 MEMBER_NUMBER를 사용하여 etcd pod 구성원 번호를 참조합니다.

    또한 etcd 클러스터의 각 pod는 자체 노드에서 실행됩니다.

유틸리티 Pod 배포 준비

  1. 사용자 클러스터의 Kubernetes API 서버에 대한 PodDisruptionBudget(PDB)의 매니페스트를 저장합니다. 그런 다음 PDB를 삭제합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG get pdb --namespace USER_CLUSTER_NAME \
       kube-apiserver-pdb --output yaml > kube-apiserver-pdb.yaml
    
    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pdb --namespace USER_CLUSTER_NAME \
       kube-apiserver-pdb
    
  2. Kubernetes API 서버와 etcd 유지보수 배포를 중지합니다. 이렇게 하면 복원 중에 구성요소가 etcd를 사용하지 않게 됩니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG --namespace USER_CLUSTER_NAME \
       scale --replicas 0 statefulset kube-apiserver
    
    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG --namespace USER_CLUSTER_NAME \
       scale --replicas 0 deployment gke-master-etcd-maintenance
    
  3. etcd pod의 컨테이너 이미지 이름을 재호출합니다.

유틸리티 Pod 배포

각 etcd pod에서 이 섹션의 단계를 수행합니다.

  1. etcd pod 이름과 pod가 실행되는 노드의 이름을 재호출합니다.

  2. 다음 pod 매니페스트를 현재 디렉터리에 etcd-utility-MEMBER_NUMBER.yaml 파일로 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: etcd-utility-MEMBER_NUMBER
      namespace: USER_CLUSTER_NAME
    spec:
      containers:
      - command: ["/bin/sh"]
        args: ["-ec", "while :; do echo '.'; sleep 5 ; done"]
        image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION
        name: etcd-utility
        volumeMounts:
        - mountPath: /var/lib/etcd
          name: data
        - mountPath: /etcd.local.config/certificates
          name: etcd-certs
      nodeSelector:
        kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME
        kubernetes.io/hostname: NODE_NAME
      tolerations:
      - effect: NoExecute
        key: node.kubernetes.io/not-ready
        operator: Exists
        tolerationSeconds: 300
      - effect: NoExecute
        key: node.kubernetes.io/unreachable
        operator: Exists
        tolerationSeconds: 300
      - effect: NoSchedule
        key: node.kubernetes.io/unschedulable
        operator: Exists
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data-kube-etcd-MEMBER_NUMBER
      - name: etcd-certs
        secret:
          defaultMode: 420
          secretName: kube-etcd-certs
    

    앞의 매니페스트는 임시로 실행하여 etcd 데이터를 복원하는 유틸리티 pod를 설명합니다.

  3. 관리자 클러스터에서 유틸리티 pod를 만듭니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  4. 백업 파일 snapshot.db를 유틸리티 pod의 루트 디렉터리에 복사합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG cp snapshot.db \
       USER_CLUSTER_NAME/etcd-utility-MEMBER_NUMBER:snapshot.db
    
  5. 유틸리티 pod의 etcd-utility 컨테이너로 셸을 가져옵니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG exec -it --namespace USER_CLUSTER_NAME \
       etcd-utility-MEMBER_NUMBER --container etcd-utility -- bin/sh
    
  6. 셸의 루트 디렉터리에서 snapshot.db를 사용하여 etcd 데이터를 복원합니다.

    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 \
        --name=kube-etcd-MEMBER_NUMBER \
        --initial-cluster=kube-etcd-0=https://kube-etcd-0.kube-etcd:2380,kube-etcd-1=https://kube-etcd-1.kube-etcd:2380,kube-etcd-2=https://kube-etcd-2.kube-etcd:2380 \
        --initial-cluster-token=etcd-cluster-1 \
        --initial-advertise-peer-urls=https://kube-etcd-MEMBER_NUMBER.kube-etcd:2380 \
        snapshot restore snapshot.db
    

    앞의 명령어는 /kube-etcd-MEMBER_NUMBER.etcd 디렉터리에 etcd 데이터를 저장했습니다.

  7. 셸에서 이전 etcd 데이터를 삭제합니다.

    rm -r var/lib/etcd/*
    
  8. 셸에서 복원된 etcd 데이터를 영구 위치로 복사합니다.

    cp -r kube-etcd-MEMBER_NUMBER.etcd/* var/lib/etcd/
    
  9. 셸에서 임시 etcd 디렉터리와 백업 파일을 삭제합니다.

    rm -R kube-etcd-MEMBER_NUMBER.etcd/
    rm snapshot.db
    
  10. 셸에 exit를 입력하여 셸을 종료합니다.

  11. 유틸리티 pod를 삭제합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pod \
        --namespace USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
    

구성요소 다시 시작

이제 유틸리티 pod를 배포 및 삭제했으므로 일부 클러스터 구성요소를 다시 시작해야 합니다.

  1. kube-etcd StatefulSet에서 pod를 다시 시작합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG restart rollout statefulset \
        --namespace USER_CLUSTER_NAME kube-etcd
    
  2. 사용자 클러스터의 Kubernetes API 서버를 시작합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale statefulset --replicas 3 \
       --namespace USER_CLUSTER_NAME kube-apiserver
    
  3. 사용자 클러스터의 etcd 유지보수 배포를 시작합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale deployment --replicas 1 \
        --namespace=USER_CLUSTER_NAME  gke-master-etcd-maintenance
    
  4. Kubernetes API 서버의 PDB를 복원합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG apply -f kube-apiserver-pdb.yaml
    

관리자 클러스터 백업

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

  • 관리자 클러스터 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. pod의 kube-etcd 컨테이너에 셸을 사용합니다.

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

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

  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 snapshot.db
    
  4. 컨테이너를 종료합니다.

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

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \
    kube-system/[ADMIN_ETCD_POD]: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 +rw 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. 관리자 제어 영역을 종료합니다.

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

    sudo scp -i vsphere_tmp ubuntu@[EXTERNAL_IP]:[HOME]/.kube/config kubeconfig

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

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

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

자동 클러스터 백업

여기에서 제공된 스크립트를 클러스터를 자동으로 백업하는 방법에 대한 예시로 사용할 수 있습니다. 다음 스크립트는 지원되지 않으며 더 강력하고 완전한 스크립트를 작성하기 위한 참조로만 사용되어야 합니다. 스크립트를 실행하기 전에 스크립트 시작 부분에 있는 변수 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 ${USER_CLUSTER_NAMESPACE}_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:${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 +rw /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 admin_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db

문제 해결

자세한 내용은 문제 해결을 참조하세요.

gkectl을 사용하여 클러스터 문제 진단

gkectl diagnose 명령어를 사용하여 클러스터 문제를 식별하고 클러스터 정보를 Google과 공유하세요. 클러스터 문제 진단을 참조하세요.

기본 로깅 동작

gkectlgkeadm의 경우 기본 로깅 설정만 사용해도 됩니다.

  • 기본적으로 로그 항목은 다음과 같이 저장됩니다.

    • gkectl의 기본 로그 파일은 /home/ubuntu/.config/gke-on-prem/logs/gkectl-$(date).log이며 파일은 gkectl을 실행하는 로컬 디렉터리의 logs/gkectl-$(date).log 파일과 심볼릭 링크됩니다.
    • gkeadm의 경우 기본 로그 파일은 gkeadm을 실행하는 로컬 디렉터리의 logs/gkeadm-$(date).log입니다.
  • 모든 로그 항목은 터미널에서 출력되지 않더라도 로그 파일에 저장됩니다(--alsologtostderrfalse인 경우).
  • -v5 세부정보 수준(기본값)에는 지원팀에 필요한 모든 로그 항목이 포함됩니다.
  • 로그 파일에는 실행된 명령어와 실패 메시지도 포함되어 있습니다.

도움이 필요한 경우 로그 파일을 지원팀에 보내는 것이 좋습니다.

로그 파일에 기본값이 아닌 위치 지정

gkectl 로그 파일에 기본값이 아닌 위치를 지정하려면 --log_file 플래그를 사용합니다. 지정한 로그 파일은 로컬 디렉터리와 심볼릭 링크되지 않습니다.

gkeadm 로그 파일에 기본값이 아닌 위치를 지정하려면 --log_file 플래그를 사용합니다.

관리자 클러스터에서 Cluster API 로그 찾기

관리자 제어 영역이 시작된 후에 VM을 시작하지 못하는 경우 다음 안내에 따라 관리자 클러스터에서 Cluster API 컨트롤러의 로그를 검사하여 디버깅할 수 있습니다.

  1. kube-system 네임스페이스에서 Cluster API 컨트롤러 pod의 이름을 찾습니다. 여기서 [ADMIN_CLUSTER_KUBECONFIG]는 관리자 클러스터의 kubeconfig 파일 경로입니다.

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system get pods | grep clusterapi-controllers
  2. pod의 로그를 엽니다. 여기서 [POD_NAME]은 pod 이름입니다. 원하는 경우 grep 또는 비슷한 도구를 사용하여 오류를 검색합니다.

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system logs [POD_NAME] vsphere-controller-manager

다음 단계