전공공부
[K8S - CKA] Backup And Restore 본문
Backup 후보들
1. Resource Configuration 방식
1) 저장소를 두고 저장하는 방식
Declarative 방식으로 구성을 한다면 싱글 폴더에 존재하고 다른 사람과 공유가 가능합니다.
이런 방식은 이러한 yaml 파일을 github 같은 곳에 두고 백업 솔루션으로 쓸 수 있습니다.
만일, 클러스터를 이런식으로 구성하면 뭔갈 잘 못 만들었을때 다시 돌아갈 수 있겠죠.
이를 사실 일일이 복사 할 필요는 없구요 아래 예시 처럼 KubeAPIServer를 이용해서 쿼리를 하는 것이라고 합니다. API에 직접 액세스하고 이를 카피로 두기 때문에 누락된 객체에 대한 걱정을 할 필요가 없겠죠
kubectl get all --all-namespaces -o yaml > all-deploy-services.yaml
이런 식으로 저장해서 바로 쓸 수 있습니다.
2. ETCD 방식
우선 ETCD는 우리 클러스터의 상태를 공유하고 저장합니다.
위와 같은 저장소를 두고 리소스를 직접 저장하는 대신에 ETCD 자체로 백업하는 걸 할 수 있습니다.
ETCD는 알다 싶이 Master Node에 hosted 되어 있습니다.
그리고, 우리는 ETCD를 구성 할 적에 어디에 데이터가 저장될 지 지정 할 수 있습니다.
etcd.service
... (생략) ...
--data-dir=/var/lib/etcd
... (생략) ...
위 디렉토리가 백업 될 수 있게하는 디렉토리 입니다.
ETCD는 또한, snapshot solution을 가져오는데요 빌트인 되어 있습니다.
ETCD Control Utility를 사용해서 정상적인 상태의 클러스터를 스냅샷을 찍을 수 있는데요.
명령어는 아래와 같습니다.
#우선 ssh로 master node 접속 후
export ETCDCTL_API=3
#이는 자동이 아니고 static pod로 마스터 노드에 배포된 etcd pod에 접속한 것입니다.
etcdctl version
#etcd 접속 확인 용
ETCDCTL_API=3 etcdctl snapshot save snapshot.db
이렇게 만들면 현재 위치에 snapshot.db라는 파일로 만들어집니다.
자 그래서 이걸로 어떻게 다시 복구 할까요?
service kube-apiserver stop #1. first step 클러스터를 리스타트 하기 위함
ETCD_API=3 etcdctl snapshot restore snapshot.db --data-dir /var/lib/etcd-from-backup
#정상적은 스냅샷으로 이전의 클러스터 상태로 불러옵니다.
#이렇게 하는 이유는 새로 만들어지는 맴버가 이전의 etcd cluster에 부착되는 것을 막기 위함
#새로운 etcd 디렉토리가 만들어집니다.
systemctl daemon-reload
#클러스터 리스타트
service etcd restart
#etcd restart
service kube-apiserver start
# kube-apiserver를 다시 깨웁니다.
이렇게 복구가 가능하며 실제로 etcd를 저장 할 때는
아래와 같이 인증서를 먼저 저장해두는 것이 좋습니다.
3. ETCD 활용
결국은 활용을 할 줄 알아야한다.
개념적인 것은 모두 지났고 아래 내용으로 ETCD를 활용해보자
k get pods -n kube-system #1. etcd pod를 찾아서 확인해봅시다.
# describe 명령어로 etcd의 version을 확인 할 수 있습니다.
# 2. ETCD가 Control plane에 접속할 때는
--listen-client-urls= #의 코멘드 주소를 따릅니다.
Master Node가 유지 보수를 위해서 reboot 될 것입니다. 이때, snapshot을 써서 백업 플랜을 둬 봅시다.
백업 플랜 만들기
우선 etcd는 static pod로 만들어지는 것을 우리는 알고 있으니 cd /etc/kubernetes/manifests/ 로 진입해서 etcd.yaml을 확인 해봅시다.
아래 etcd.yaml 파일
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.16.231.3:2379
creationTimestamp: null
labels:
component: etcd
tier: control-plane
name: etcd
namespace: kube-system
spec:
containers:
- command:
- etcd
- --advertise-client-urls=https://192.16.231.3:2379
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --client-cert-auth=true
- --data-dir=/var/lib/etcd
- --experimental-initial-corrupt-check=true
- --experimental-watch-progress-notify-interval=5s
- --initial-advertise-peer-urls=https://192.16.231.3:2380
- --initial-cluster=controlplane=https://192.16.231.3:2380
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --listen-client-urls=https://127.0.0.1:2379,https://192.16.231.3:2379
- --listen-metrics-urls=http://127.0.0.1:2381
- --listen-peer-urls=https://192.16.231.3:2380
- --name=controlplane
- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
- --peer-client-cert-auth=true
- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --snapshot-count=10000
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
image: registry.k8s.io/etcd:3.5.7-0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 127.0.0.1
path: /health?exclude=NOSPACE&serializable=true
port: 2381
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: etcd
resources:
requests:
cpu: 100m
memory: 100Mi
startupProbe:
failureThreshold: 24
httpGet:
host: 127.0.0.1
path: /health?serializable=false
port: 2381
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: etcd
resources:
requests:
cpu: 100m
memory: 100Mi
startupProbe:
failureThreshold: 24
httpGet:
host: 127.0.0.1
path: /health?serializable=false
port: 2381
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
volumeMounts: #ETCD의 위치
- mountPath: /var/lib/etcd
name: etcd-data
- mountPath: /etc/kubernetes/pki/etcd
name: etcd-certs
hostNetwork: true
priority: 2000001000
priorityClassName: system-node-critical
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:#Control plane의 위치
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcd
type: DirectoryOrCreate
name: etcd-data
status: {}
위 파일을 보면 /var/lib/etcd 에 etcd-data 파일을 두고 있을을 확신 할 수 있다. 그러면 그 위치로 가서 스냅샷을 뜨면 된다.
ETCDCTL_API=3 etcdctl snapshot #이렇게 지정을 해야 환경변수를 쓰지 않고 쓸 수 있고 이가 귀찮다면
export ETCDCTL_API=3 #환경변수 두기하고 etcdctl 명령어를 쓰면된다.
etcdctl snapshot save --endpoints=127.0.0.1:2379 \ #listen-client-urls 임
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
/opt/snapshot-pre-boot.db
#이렇게 지정을 해야한다. 보면 스냅샷을 위해서는 위 4개의 옵션들은 필수로 지정해야한다. endpoint와
#인증 포인트를 꼭 지정해야한다.
복구하기
etcdctl snapshot restore --data-dir <백업을 할 위치> <백업된 snapshot.db 파일 위치>
그리고, 처음에 static pod로 만들어진 위치로 가서 etcd.yaml 파일을 열고 /var/lib/etcd로 기존에 되어있던 hostPath 위치를 지금 <백업을 할 위치의 값>으로 변경시킵니다.
그러면 결국 복원 된 것을 확인 할 수 있습니다.
4. 오답노트
1. kubectl config get-cluster : 현재 클러스터의 갯수를 볼 수 있다.
2. Stacked ETCD인지 판단하는 여부는 API-SERVER Pod에 ETCD-Server로 연결되는 로컬 주소가 있으면 Stacked ETCD이다.
3. 만일 API-SERVER POD를 확인 했는데 192.33.162.21 처럼 새로운 바깥 IP를 쓴다면 External ETCD이다.
4. ETCD의 POD의 --data-dir는 etcd의 데이터가 저장된 곳이다.
5. scp cluster1:/opt/cluster1.db /opt/ 이 명령어를 실행하면 cluster1의 /opt/cluster1.db가 현재 노드의 /opt/로 들어온다.
'Study > K8S' 카테고리의 다른 글
[K8S - CKA] TLS - Basic (1) | 2023.12.10 |
---|---|
[K8S - CKA] SECURITY PRIMITIVES (Deprecated) (0) | 2023.12.10 |
[K8S - CKA] Cluster Upgrade Process (0) | 2023.11.13 |
[K8S - CKA] OS Upgrade (0) | 2023.11.12 |
[K8S - CKA] initContainers (0) | 2023.11.12 |