DevOps/CKA Test 준비

02. CKS backup

치킨맛코드 2022. 12. 16. 17:32

Fastcampus k8s와 docker로 끝내는 컨테이너 기반 MSA 강의 내용을 정리한 것 입니다.

 

https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster

 

Operating etcd clusters for Kubernetes

etcd is a consistent and highly-available key value store used as Kubernetes' backing store for all cluster data. If your Kubernetes cluster uses etcd as its backing store, make sure you have a back up plan for those data. You can find in-depth information

kubernetes.io


<문제.04 backup & restore>
https://127.0.0.1:2379에서 실행 주인 etcd의 snapshot을 생성하고 snapshot을 /data/etcd-snapshot.db에 저장하세요. 그런 다음 /data/etcd-snapshot-previous.db에 있는 기존의 이전 스냅샷을 복원합니다. etcdctl을 사용하여 서버에 연결하기 위해 다음 TLS인증서/키가 제공됩니다.

 

<조건>


CA certificate: /etc/k8s/pki/etcd/ca.crt
cilent certificate: /etc/k8s/pki/etcd/server.crt
client key: /etc/k8s/pki/etcd/server.key

 

cluster 위치를 확인한 후 백업할 위치로 이동 및 툴 설치를 진행한다. ==> 스넵샷을 촬영한다. ==> 복원할 스넵샷을 찾은 후 복원한다.

 

1. backup을 할 공간을 설정한다.

먼저 cluster 위치 확인한다. => backup할 cluster로 ssh접근을 한 후 => ectdctl 툴 설치 여부/버전확인 확인한다. 마지막으로  => /tmp/etcd-backup으로 스넵샷을 촬영한다.


2. backup을 실행 해 본다. 아래의 명령어를 참조한다.

==> sudo ETCDCTL_API=3 etcdctl --endpoints="system의 endpoints의 ip" 
\ --cacert=<trusted-ca-file> 
\ --cert=<cert-file>
\ --key=<key-file>
\ snapshot save /tmp/etcd-backup
API 버전 기입 
<trusted-ca-file>, <cert-file> , <key-file> 찾기
==> ps -ef | grep kube | grep trusted-ca-file
      최하단 "--" 접두사 확인
==> <cert-file> / <key-file> 도 마찬가지 ps -ef | grep kube | grep cert-file 로 확인 /ps -ef | grep kube | key-file
==> tmp/etcd-backup이 만들어진다.

"snapshot saved at ~" 라고 나오면 backup이 완료된 것 이다.

3. 복원(restore) 하기
==> sudo ETCDCTL_API=3 etcdctl --data-dir <data-dir-location> 
\ snapshot restore snapshotdb

<data-dir-location> 
==> /var/lib/etcd-new 라는 새로운 db dir를 활용/ member 생성된다.
snapshotdb
==> snapshot이 있는 위치는 /tmp/etcd-backup 이다.
==> api은 3/ /var/lib/etcd-new로 restore할것인데, /tmp/etcd-backup에 있는 정보를 활용해서 한다.

기존의 운영중인 DB가 아닌 새로운 DB에 RESTORE를 해야한다.
==> /var/lib/etcd-new 라는 새로운 db생성 후 pod에 새로운 db위치를 알린다. 이 후 restart / get명령어로 확인 가능

sudo vi /etc/kubernetes/manifests/etcd.yaml
에서 path위치를 수정 ==> 자동으로 pod가 restart됨

* sudo -i 로 접근하면 가시성이 좋다.

==> 최 하단의 volumes - hostPath의 path값을 /var/lib/etcd-new로 변경 후 
저장하게되면 자도으로 재시작 됨(sudo docker ps -a | grep etcd로 확인)

==> sudo ETCDCTL_AP=3 etcdctl 
\ --data-dir /varlib/etcd-new
\ snapshot restore /tmp/etcd-backup

 

*

backup을 하는 방법에 대해 알아본다. 버전 관리 및 롤벡을 위해서 사용한다.

*

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

 

Upgrading kubeadm clusters

This page explains how to upgrade a Kubernetes cluster created with kubeadm from version 1.25.x to version 1.26.x, and from version 1.26.x to 1.26.y (where y > x). Skipping MINOR versions when upgrading is unsupported. For more details, please visit Versio

kubernetes.io


<문제.05 k8s upgrade 하기>

k8s upgrade
k8s 를 upgrade한다는것은 관련 packages인 kubeadm, kubelet,kubectl와 같은 페키지를 업데이트하여 현재 버전보다 더 높은 버전을 사용하는것이다. 단 control plane과 nodes를 upgrade하는 방법은 다르다.

centos7 기준
yum list --showuplicates kubeadm --disableexcludes=kubernets
==> 업데이트 할 수 있는 버전 확인 (1.2X.X-0을 반드시 확인)

control pane upgrade
1.22.4v에서 1.23.3v로 업데이트
kubectl config use-context hk8s
==> 현재 운영중인 k8s는 hk8s

kubectl get nodes
==> 운영중인 nodes확인

ssh hk8s-m
==> user로 접근된다. 이때 sudo -i를 사용하거나, sudo를 사용하자.

cat /etc/os-release
==> 해당 k8s가 운영중인 os를 확인한다

yum install -y kubeadm-1.23.x.0 --disableexcludes=kubernets
==> kubeadm upgarde 를 실행한다. 1.23.x.0버전을 업그레이드 한다.

kubeadm version
==> 업그레이드 버전을 확인

kubeadm upgrade plan
==> 업그레이드를 할 플렌을 짠다.

kubectl upgrade apply v1.23.x
==> apply한다. master를 업그레이드 시켜준다.

다른 컨트롤 플레인 노드의 경우는 간단히 1)kubeadm uprade node 2)kubeadm upgrade apply만 실행하면 된다.

kubectl drain <master node name> --ignore-daemonsets
kubelet과 kubectl을 업데이트 하기 전 master node에는 이미 etcd, api 등이 이미 작동중이기에, 전부 삭제하는 노드 드레인을 실행해야 한다. <master node name>자리에는 hk8s-m를 입력한다.

yum install -y kubelet-1.23.x-0 kubectl-1.23.x-0 --disableexcludes=kubernets
==> kubelet과 kubectl을 업데이트

systemctl daemon-reload
systemctl restart kubelet
==> restart

kubectl uncordon <master node name>
==> 스케쥴링을 다시 하도록 한다. master node name 에는 hk8-m을 입력

worker nodes upgarede
==> k8s과 유사함
kubeadm업그레이다 => kubeadm upgrade 호출 => 노드 드레인 => kubelet kubeadm 업그레이다 => node uncordon

ssh hk8s-w1
==> hk8s-w1로 진입

yum install -y kubeadm-1.23.x.0 --disableexcludes=kubernets
==> kubeadm업그레이드

kubeamd upgrade node
==> kubeadm node upgrade

hk8s-w1 closed
==> w1에서 빠저나간 후 노드 드레인을 한다. 이 후 다시 접근한다.

kubectl drain <node name> --ingnore-daemonsets
==> 노드 드레인을한다. <node name> 에는 hk8s-w1을 입력한다.

yum install -y kubelet-1.23.x-0 kubectl-1.23.x-0 --disableexcludes=kubernets
==> kubelet kubectl 업그레이드


systemctl daemon-reload
systemctl restart kubelet
==> 반드시 reload/restart를 해야한다.

exit로 logout한 후 kubectl uncordon hk8s-w1으로 다시 uncordon상태로 바꾼다.

예시
master node의 모든 k8s control plane및 node 구성 요소를 1.23.x V로 업그레이드 합니다. master node를 업그레이드 하기 전에 drain 하고 업그레이드 후에 uncordon해야 합니다.


================== API 인증 ====================

1. 역할 기반의 인증(RBAC)
==> CKA에서는 이것을 중점적으로 봄

API인증이란?
1. 인증 ==> kubectl 실행시 이 유저가 인가된 사용자인지 확인 (username/password/인증서/토큰/etc... k8s에서는 username/인증서를 사용)
2. 권한 파악 ==> 실제 해당 명령을 사용할 수 있는 권한을 확인
3. k8s에서 요청이 제한된건 아닌지 확인(허용되지 않은 명령인가 / ex) pod수가 2개가 한계인데, 10개로 신청할 시 등)

kubectl을 사용해 k8s에 명령어를 실행하면 항상 master의 API로 전달된다. 이 후 인증과정을 거치는데, 이때 허가받은 사람만 사용할 수 있도록 제어한다. 인증과정을 거친 후 해당 명령에 대한 권한을 확인한다. 최종적으로 k8s운영환경에서 제한된 환경을 요청하는것이 아닌지 확인한다.