이 문서에서는 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
플래그 값을existing
으로 변경합니다.containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...
1단계에서 삭제한 etcd PDB를 복원합니다.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml