반응형
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 -
해당내용을 쉘스크립트로 실행시켜주어 인증서를 업데이트 할 수 있다.
반응형
'쿠버네티스' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 HA-Cluster (설명편) (0) | 2023.07.25 |
---|---|
[Kubernetes] 컨테이너 외부 노출 (0) | 2023.07.10 |
[Kubernetes] ETCD 백업 (0) | 2023.06.23 |
[Kubernetes] Kubernetes 초기화 (0) | 2023.06.23 |
[Kubernetes] 쿠버네티스 모니터링 시스템 구축 - 2 (0) | 2023.06.22 |