이 문서에서는 Google Distributed Cloud의 고가용성(HA) 사용자 클러스터에서 실패한 etcd 복제본을 교체하는 방법을 설명합니다.
여기에 제공된 안내는 kubeception을 사용하는 HA 사용자 클러스터에 적용됩니다. 즉 Controlplane V2가 사용 설정되지 않은 사용자 클러스터입니다. Controlplane V2가 사용 설정된 사용자 클러스터에서 etcd 복제본을 교체해야 하는 경우 Cloud Customer Care에 문의하세요.
시작하기 전에
- 관리자 클러스터가 올바르게 작동하는지 확인합니다. 
- 사용자 클러스터의 다른 두 etcd 구성원이 올바르게 작동하는지 확인합니다. etcd 구성원이 두 개 이상 실패한 경우 etcd 데이터 손상 또는 손실 복구를 참조하세요. 
실패한 etcd 복제본 교체
- 나중에 복원할 수 있도록 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).
 
- etcd PodDisruptionBudget(PDB)을 삭제합니다. - kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb 
- 다음 명령어를 실행하여 텍스트 편집기에서 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 ...
- 실패한 etcd 복제본 노드를 드레이닝합니다. - kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data - 여기서 - NODE_NAME은 실패한 etcd 복제본 노드 이름입니다.
- 작동하는 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입니다.- 이 새로운 셸에서 다음 명령어를 실행합니다. - 실패한 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입니다.
- 실패한 복제본 노드와 동일한 이름 및 피어 URL로 새 구성원을 추가합니다. - etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380 - 여기서 - MEMBER_NAME은 실패한 kube-etcd 복제본 노드의 식별자입니다.- kube-etcd-1또는- kube-etcd2).
 
- 유틸리티 포드 배포의 1~3단계를 수행하여 관리자 클러스터에 유틸리티 포드를 만듭니다. 이 포드는 사용자 클러스터에서 실패한 etcd 구성원의 PersistentVolume(PV)에 액세스하는 데 사용됩니다. 
- 유틸리티 포드 내에서 etcd 데이터 디렉터리를 삭제합니다. - kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*' 
- 유틸리티 포드를 삭제합니다. - kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER 
- 실패한 노드를 차단 해제합니다. - kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME 
- 텍스트 편집기에서 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 ...
- 1단계에서 삭제한 etcd PDB를 복원합니다. - kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml