실패한 etcd 복제본 교체

이 문서에서는 Google Distributed Cloud의 고가용성(HA) 사용자 클러스터에서 실패한 etcd 복제본을 교체하는 방법을 설명합니다.

여기에 제공된 안내는 kubeception을 사용하는 HA 사용자 클러스터에 적용됩니다. 즉 Controlplane V2가 사용 설정되지 않은 사용자 클러스터입니다. Controlplane V2가 사용 설정된 사용자 클러스터에서 etcd 복제본을 교체해야 하는 경우 Cloud Customer Care에 문의하세요.

시작하기 전에

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

  • 사용자 클러스터의 다른 두 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_PDB_FILE

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

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

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

    • PATH_TO_PDB_FILE은 etcd PDB 파일을 저장할 경로입니다(예: /tmp/etcpdb.yaml).

  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 클러스터에서 삭제합니다.

      먼저 etcd 클러스터의 모든 구성원을 나열합니다.

      etcdctl member list -w table

      출력에 모든 구성원 ID가 표시됩니다. 실패한 복제본의 구성원 ID를 확인합니다.

      다음으로 실패한 복제본을 삭제합니다.

      export ETCDCTL_CACERT=/etcd.local.config/certificates/etcdCA.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_KEY=/etcd.local.config/certificates/etcd.key
      export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
      etcdctl member remove MEMBER_ID

      여기서 MEMBER_ID는 실패한 etcd 복제본 포드의 16진수 구성원 ID입니다.

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

      etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380

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

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

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

    출력에는 etcd 포드와 포드가 실행되는 노드가 표시됩니다. 출력에 표시되는 노드는 사용자 클러스터의 컨트롤 플레인 역할을 하는 관리자 클러스터의 노드입니다.

    NAME              ...   NODE
    kube-etcd-0       ...   node-abc
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  7. 다음 단계에서 만드는 포드 매니페스트에 사용할 포드 이름과 컨트롤 플레인 노드 이름을 기록해 둡니다.

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

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

  8. etcd 데이터를 복원하기 위해 일시적으로 실행하는 유틸리티 포드를 설명하는 포드 매니페스트를 만듭니다. 다음 포드 매니페스트를 현재 디렉터리에 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_SECRET_NAME
    

    다음을 바꿉니다.

    • NODE_NAME: kube-etcd-0 포드가 실행 중인 노드

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

    • GKE_ON_PREM_VERSION: etcd 복원을 수행하려는 클러스터의 버전 (예: 1.31.100-gke.136)

    • KUBE_ETCD_SECRET_NAME: kube-etcd-certs로 시작하는 사용자 클러스터에서 etcd에 의해 사용되는 보안 비밀의 이름

  9. 관리자 클러스터에서 유틸리티 포드를 만듭니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  10. 유틸리티 포드 내에서 etcd 데이터 디렉터리를 삭제합니다.

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

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

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  13. 텍스트 편집기에서 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
          ...
     
  14. 1단계에서 삭제한 etcd PDB를 복원합니다.

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