본문 바로가기
공부/Openshift

[Openshift 4.x] master서버 etcd 백업 및 복구

by CITTA 2023. 4. 13.
728x90
반응형
  1. etcd backup

백업을 수행하기 위해서는 사전에 bastion 서버에서 각 master서버에 한번씩 ssh로 접근을 해서 known hosts 등록을 해주어야 합니다. 암호 입력이 필요 없이 ‘core’유저로 접근이 가능하나 리눅스는 처음 원격 접속 시 아래와 같이 인증 관련 확인을 하기 때문입니다.

etcd의 백업 수행시기는 최초 설치 시, 주요 변경사항 적용 시 입니다.

The authenticity of host 'master1.test.com (192.168.130.133)' can't be established.
ECDSA key fingerprint is SHA256:zBYmEsjtaj0z80RMPjQ8kF8brrE1OAFQEnw7WbA/p2k.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

(1) master etcd backup

  • snapshot_<datatimestamp>.db: etcd snapshot 파일
  • static_kuberesources_<datatimestamp>.tar.gz: static Pod의 resources를 포함하는 파일
#backup script 내용

$ vim backup-etcd.sh
#!/bin/bash

# 백업수행 날짜
DATES=$(date +%Y%m%d-%H%M)

# master1 etcd backup
ssh core@master1.test.com "sudo mkdir /tmp/${DATES}/"
ssh core@master1.test.com "sudo /usr/local/bin/cluster-backup.sh /tmp/${DATES}/."
ssh core@master1.test.com "sudo chmod 755 /tmp/${DATES}/*"
scp core@master1.test.com:/tmp/${DATES}/snap* /data/backup-etcd1/
scp core@master1.test.com:/tmp/${DATES}/static* /data/backup-etcd1/

sleep 10m

# master2 etcd backup
ssh core@master2.test.com "sudo mkdir /tmp/${DATES}/"
ssh core@master2.test.com "sudo /usr/local/bin/cluster-backup.sh /tmp/${DATES}/."
ssh core@master2.test.com "sudo chmod 755 /tmp/${DATES}/*"
scp core@master2.test.com:/tmp/${DATES}/snap* /data/backup-etcd2/
scp core@master2.test.com:/tmp/${DATES}/static* /data/backup-etcd2/

sleep 10m

# master3 etcd backup
ssh core@master3.test.com "sudo mkdir /tmp/${DATES}/"
ssh core@master3.test.com "sudo /usr/local/bin/cluster-backup.sh /tmp/${DATES}/."
ssh core@master3.test.com "sudo chmod 755 /tmp/${DATES}/*"
scp core@master3.test.com:/tmp/${DATES}/snap* /data/backup-etcd3/
scp core@master3.test.com:/tmp/${DATES}/static* /data/backup-etcd3/

tmp 아래 경로는 정기적으로 10일마다 삭제가 됩니다. (os 재부팅해도 삭제됩니다.)

# os tmp관련 설정 확인, /tmp는 10일, /var/tmp 는 30일 기준입니다.
$ cat /usr/lib/tmpfiles.d/tmp.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# See tmpfiles.d(5) for details

# Clear tmp directories separately, to make them easier to override
q /tmp 1777 root root 10d
q /var/tmp 1777 root root 30d
...

(2) master etcd 복구

이전에 생성한 snapshot 파일을 이용하여 백업 시점의 상태로 돌아갈 수 있습니다. 복구 전에 모든 master의 static pod를 종료해야 합니다. 참고로 수동으로 pod를 중지할 필요는 없으며 복구 스크립트가 동작 시 pod를 중지합니다.

  • 복구시 백업파일은 master서버 중 한대(예시는 master1)
  • etcd 백업본 내부에는 master 3대의 정보를 모두 가지고 있음
# 복구 시 master서버 한대를 recovery host로 선택 진행, master1

# 백업파일 복사
$ scp /data/backup-etcd1/* core@master1.test.com:/var/home/core/

# static pod 정지
$ ssh core@master1.test.com "sudo mv /etc/kubernetes/manifests/etcd-pod.yaml /tmp"
$ ssh core@master1.test.com "sudo mv /etc/kubernetes/manifests/kube-apiserver-pod.yaml /tmp"
$ ssh core@master1.test.com "sudo mv /var/lib/etcd/ /tmp"

# 복구 스크립트 실행
$ ssh core@master1.test.com "sudo /usr/local/bin/cluster-restore.sh /var/home/core/"

# master노드에서 kubelet 재시작
$ ssh core@master1.test.com "sudo systemctl restart kubelet.service"
$ ssh core@master2.test.com "sudo systemctl restart kubelet.service"
$ ssh core@master3.test.com "sudo systemctl restart kubelet.service"

# bastion 서버에서 etcd pod 확인(recovery host only)
$ ssh core@master1.test.com "sudo crictl ps | grep etcd"
$ oc get pod -o wide -n openshift-etcd |grep etcd

# etcd 재배포 (bastion서버에서 수행)
$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
etcd.operator.openshift.io/cluster patched

# 확인
$ oc get etcd -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\\n"}{.message}{"\\n"}'
AllNodesAtLatestRevision
3 nodes are at revision 7

# control plane 재배포 (bastion서버에서 수행)
# kubeapiserver
$ oc patch kubeapiserver cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
kubeapiserver.operator.openshift.io/cluster patched

$ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\\n"}{.message}{"\\n"}' 
AllNodesAtLatestRevision
3 nodes are at revision 9

# kubescheduler
$ oc patch kubescheduler cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
kubescheduler.operator.openshift.io/cluster patched
$ oc get kubescheduler -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\\n"}{.message}{"\\n"}'
AllNodesAtLatestRevision
3 nodes are at revision 7

# ETCD 상태확인
$ oc get pods -n openshift-etcd |grep etcd

# 재부팅
# 모든 openshift 클러스터 노드를 재부팅 한다.
$ for node in $(oc get node -o name | cut -d '/' -f '2'); do
ssh core@node "sudo systemctl reboot";
done

참고: https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.10/pdf/backup_and_restore/openshift_container_platform-4.7-backup_and_restore-ko-kr.pdf

728x90
반응형

댓글