실패한 etcd 복제본 교체

이 페이지에서는 VMware용 Anthos 클러스터(GKE On-Prem)의 고가용성(HA) 사용자 클러스터에서 실패한 etcd 복제본을 교체하는 방법을 설명합니다.

시작하기 전에

  • 관리자 클러스터가 올바르게 작동하는지 확인합니다.

  • 사용자 클러스터의 다른 두 etcd 구성원이 올바르게 작동하는지 확인합니다. etcd 구성원이 두 개 이상 실패한 경우 etcd 데이터 손상 또는 손실 복구를 참조하세요.

실패한 etcd 복제본 교체

  1. 나중에 복원할 수 있도록 etcd PodDisruptionBudget(PDB)의 사본을 백업합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > /path/to/etcdpdb.yaml

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

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

    • USER_CLUSTER_NAME은 실패한 etcd 복제본이 포함된 사용자 클러스터의 이름입니다.

  2. etcd PodDisruptionBudget(PDB)을 삭제합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. 다음 명령어를 실행하여 텍스트 편집기에서 kube-etcd StatefulSet을 엽니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    --initial-cluster-state 플래그 값을 existing으로 변경합니다.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. 실패한 etcd 복제본 노드를 드레이닝합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data

    여기서 NODE_NAME은 실패한 etcd 복제본 노드 이름입니다.

  5. 작동하는 kube-etcd 포드 중 하나의 컨테이너에서 새 셸을 만듭니다.

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

    여기서 KUBE_ETCD_POD는 작동하는 kube-etcd 포드의 이름입니다. 예를 들면 kube-etcd-0입니다.

    이 새로운 셸에서 다음 명령어를 실행합니다.

    1. 실패한 etcd 복제본 노드를 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 --endpoints=https://127.0.0.1:2379 member remove MEMBER_ID

      여기서 MEMBER_ID는 실패한 etcd 복제본 노드의 ID입니다. ID를 가져오려면 다음 명령어를 실행합니다.

      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 member list -w fields

      앞의 명령어는 etcd 클러스터의 모든 구성원을 표시합니다. 출력은 다음과 비슷합니다.

      sh-5.0# ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcd.key member list -w fields
      
      "ClusterID" : 6963206042588294154
      "MemberID" : 4645269864592341793
      "Revision" : 0
      "RaftTerm" : 15
      "ID" : 2279696924967222455
      "Name" : "kube-etcd-2"
      "PeerURL" : "https://kube-etcd-2.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-2.kube-etcd:2379"
      "IsLearner" : false
      
      "ID" : 3728561467092418843
      "Name" : "kube-etcd-1"
      "PeerURL" : "https://kube-etcd-1.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-1.kube-etcd:2379"
      "IsLearner" : false
      
      "ID" : 4645269864592341793
      "Name" : "kube-etcd-0"
      "PeerURL" : "https://kube-etcd-0.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-0.kube-etcd:2379"
      "IsLearner" : false
      
      sh-5.0#
      

      위 출력에서 MemberID는 작동 중인 kube-etcd 포드의 구성원 ID입니다. 다음으로 실패한 etcd 복제본 노드의 ID를 가져옵니다. 앞의 예시에서kube-etcd-0에는 4645269864592341793ID가, kube-etcd-1에는 3728561467092418843ID가, kube-etcd-2에는 2279696924967222455ID가 있습니다.

      구성원 ID가 있으면 10진수에서 16진수로 변환합니다. member remove 명령어는 16진수 구성원 ID를 허용하지만 member list는 10진수를 반환하기 때문입니다. printf를 사용해 변환하면 됩니다. kube-etcd-2의 예시에서는 다음과 같습니다.

      printf '%x\n' 2279696924967222455
      

      위 명령어 출력은 member remove 명령어에 사용해야 하는 MEMBER_ID입니다.

    2. 실패한 복제본 노드와 동일한 이름 및 피어 URL로 새 구성원을 추가합니다.

      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 member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380

      여기서 MEMBER_NAME은 실패한 kube-etcd 복제본 노드의 식별자입니다. kube-etcd-1 또는 kube-etcd2).

  6. 유틸리티 포드 배포의 1~3단계를 수행하여 관리자 클러스터에 유틸리티 포드를 만듭니다. 이 포드는 사용자 클러스터에서 실패한 etcd 구성원의 PersistentVolume(PV)에 액세스하는 데 사용됩니다.

  7. 유틸리티 포드 내에서 etcd 데이터 디렉터리를 삭제합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- bash -c 'rm -rf /var/lib/etcd/*'
  8. 유틸리티 포드를 삭제합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  9. 실패한 노드를 차단 해제합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  10. 텍스트 편집기에서 kube-etcd StatefulSet을 엽니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    --initial-cluster-state 플래그 값을 new로 변경합니다.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  11. 1단계에서 삭제한 etcd PDB를 복원합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml