728x90
반응형
- 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
728x90
반응형
댓글