본문 바로가기
쿠버네티스

[Kubernetes] ETCD 복구

by 알 수 없는 사용자 2023. 7. 6.
반응형

ETCD 복구를 하기위해


etcd는 Kubernetes 클러스터 구성의 모든 정보를 저장하고 있다.
etcd를 안전하게 복구하기 위해선 복구 할 클러스터의 정보와 똑같이 클러스터를 구성 후 etcd를 복구해야 한다.

일치해야하는 정보로는 노드명, 노드IP, 클러스터 구성 등이 있다.

클러스터의 구성을 맞추는 이유


etcd를 복구할 때 etcd는 기존 클러스라고 생각하고 복구된다. 하지만 노드명과 IP명이 다를경우 etcd에 저자되어있는 메타데이터가 일치하지않으므로 정상적인 복구가 되지않을 수 있다.

복구방법


  • 모든 마스터노드에 백업파일이 존재해야한다.

아래 명령어는 모든 마스터노드에서 실행해주어야하며 '현재노드의ip' 는 아래 명령어를 수행하는 노드의 ip를 의미한다.
(10.10.10.1~3의 노드를 가상으로 테스트한 것이다.)

ETCDCTL_API=3 etcdctl snapshot restore backup.db --name m1또는m2,m3 \\
--cacert=/etc/kubernetes/pki/etcd/ca.crt \\
--cert=/etc/kubernetes/pki/etcd/server.crt \\
--key=/etc/kubernetes/pki/etcd/server.key \\
--initial-cluster m1=https://10.10.10.1:2380,m2=https://10.10.10.2:2380,m3=https://10.10.10.3:2380 \\
--initial-cluster-token etcd-cluster-1 \\
--initial-advertise-peer-urls https:현재노드의ip//:2380

위 명령어를 실행하면 각 노드에는 m1.etcd, m2.etcd, m3.etcd 파일이 생성될 것 이다. 이후 아래의 명령어를 실행한다. 마찬가지로 모든 마스터노드에 진행해야한다.

mkdir /root/etcd-restore
mv /etc/kubernetes/manifests/*.yaml /root/etcd-restore
mv /var/lib/etcd/member /var/lib/etcd/member.bak
cp -r m1.etcd/member /var/lib/etcd/
mv /root/etcd-restore/*.yaml /etc/kubernetes/manifests/

위 명령어는 기존 클러스터에 있는 쿠버네티스 설정과 복구한 설정을 맞교체 해주는 작업이다.
이후 복구가 진행된다.

복구 이후


복구 이후 etcd 또는 apiserver의 로그를 보면 certificate x509 에 관한 오류를 확인할 수 있다.

해당내용은 클러스터가 제대로 동작하는것처럼 보이지만 새로운 worker 노드를 join 하거나 클러스터를 수정할 수 없다.

이를 위해 인증서를 업데이트하는 작업을 진행한다.

for namespace in $(kubectl get namespace -o jsonpath='{.items[*].metadata.name}'); do
    for name in $(kubectl get deployments -n $namespace -o jsonpath='{.items[*].metadata.name}'); do
        kubectl patch deployment -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}';
    done
    for name in $(kubectl get daemonset -n $namespace -o jsonpath='{.items[*].metadata.name}'); do
        kubectl patch daemonset -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}';
    done
done

base64_encoded_ca="$(base64 -w0 /etc/kubernetes/pki/ca.crt)"

kubectl get cm/cluster-info --namespace kube-public -o yaml | \
    /bin/sed "s/\(certificate-authority-data:\).*/\1 ${base64_encoded_ca}/" | \
    kubectl apply -f -

해당내용을 쉘스크립트로 실행시켜주어 인증서를 업데이트 할 수 있다.

반응형