cka 시험이 2주를 앞두고.. 필수 문제들을 정리한다.
시험 팁! 빠른 타이핑을 위한 명령어 미리 입력해두기
# (기본설정)
alias k=kubectl # 시험에 적용되어 있다.
# sample yaml 얻기
export do="--dry-run=client -o yaml" # k create deploy nginx $do
# pod 삭제시 즉시삭제
export now="--force --grace-period 0" # k delete pod {pode-name} $now
# 출처 : 피터의 개발 이야기 [https://peterica.tistory.com/540]
1. Kubernetes 클러스터 업그레이드
https://webheck.tistory.com/entry/cka-Cluster-Upgrade-Process
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
쿠버네티스를 업그레이드 하는 순서는 크게는 다음과 같다.
1. Container Engine 설치 (Docker/containerd , istio 등) - 시험에선 설치되어 있는 환경
2. Install
- Kubernetes 툴 설치 : kubeadm
- master, worker kubelet/kubectl 설치
3. kubeadm 을 이용한 Master 노드에서 API 업그레이드
4. Worker 노드에서 join 하기
다음 순서에 맞춰 업그레이드를 진행해 주면 된다.
1. 먼저 상단 Docs 에 들어간다. (Upgrading Kubeadm Clusters)
업그레이드할 버전을 확인후 진행해준다.
다음 명령어를 통해 kubeadm 업그레이드를 진행한다. (아래 내용은 Docs에 있는 내용)
★필수!! 시험에서 주어진 context 를 꼭 사용한다. (컨텍스트 사용은 시험 시작전 습관적으로 사용하여 확인하기)
[user@console ~]$ kubectl config use-context {$컨텍스트명}
# 이후 master node 를 확인후에 ssh 를 이용하여 이동
[user@console ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 10d v.1.30.1
worker Ready <none> 10d v.1.30.1
[user@console ~]$ ssh master
# 이동후 sudo 명령어를 얻기 위해 sudo -i 입력
[user@master ~]$ sudo -i
[user@master ~]#
Determine which version to upgrade to
Find the latest patch release for Kubernetes 1.31 using the OS package manager:
- 업그레이드 할 버전을 체크
# Debian Linux
# Find the latest 1.31 version in the list.
# It should look like 1.31.x-*, where x is the latest patch.
sudo apt update
sudo apt-cache madison kubeadm
# RHEL Linux
sudo yum list --showduplicates kubeadm --disableexcludes=kubernetes
Upgrading control plane nodes
Call "kubeadm upgrade"
For the first control plane node
1. Upgrade kubeadm - kubeadm 을 먼저 업그레이드 해준다.
## kode-kloud 에서는 먼저 우분투 repository 에서 kubernetes 의 버전을 명시적으로 변경해 주어야 했다.
vim /etc/apt/sources.list.d/kubernetes.list
##"/etc/apt/sources.list.d/kubernetes.list" 1L, 108B
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /
## REHL 의 경우 경로는 다음에 있다.
vi /etc/yum.repos.d/kubernetes.list
# Debian Linux
# replace x in 1.31.x-* with the latest patch version
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.31.x-*' && \
sudo apt-mark hold kubeadm
# REHL Linux
sudo yum install -y kubeadm-'1.31.x-*' --disableexcludes=kubernetes
2. Verify that the download works and has the expected version - 설치된 버전 확인해보기
kubeadm version
3. Verify the upgrade plan:This command checks that your cluster can be upgraded, and fetches the versions you can upgrade to. It also shows a table with the component config version states. - 쿠버네티스 컴포넌트 업그레이드 상태 확인하기
- plan 뒤에 버전을 입력하면 해당 버전에 대한 plan 만 목록을 확인할 수 있다.
sudo kubeadm upgrade plan v1.23.3 # 1.23.3 목록만 확인됨.
- 위 명령어를 입력하면 각 컴포넌트들이 어떤 버전으로 업그레이드 되는지 확인 가능하며 해당 업그레이드를 위한 kubeadm 명령어 (아래명령어) 도 알려준다.
4. Choose a version to upgrade to, and run the appropriate command. - 업그레이드 적용
# replace x with the patch version you picked for this upgrade
sudo kubeadm upgrade apply v1.31.x
5. Manually upgrade your CNI provider plugin. - 실제 상황에서는 Container Network Interface 를 설치해야한다. ex) Flannel / Calico 등
이후 실제 현업에서는 다른 master 노드가 있을경우 위 docs에 포함된 명령어로 업그레이드 진행해야 하나 문제에서는 하나의 마스터 노드만 존재할 것임으로 스킵!
sudo kubeadm upgrade node ## 시험에서는 SKIP
Drain the node
이제 kubeadm 을 이용하여 각 컴포넌트의 업그레이드가 완료되었다.
kubelet 업그레이드를 위해 master 노드에서 사용중이었던 pod를 모두 drain 시켜준다.
이후 kubelet 을 업그레이드 진행해 주어야 한다.
drain 동작은 master 에서 진행되는 것이 아닌 kubelet 이 실행중인 환경으로 나와야 한다. (위 ssh master 위치에서 진행하면 안됨!)
# replace <node-to-drain> with the name of your node you are draining
kubectl drain <node-to-drain> --ignore-daemonsets
kubectl get ndoes # drian 작업 잘 진행되었는지 확인
drain 한 이후 다시 master 노드에 들어와서 kubelet 업그레이드를 docs를 활용하여 진행해준다.
Upgrade kubelet and kubectl
1. Upgrade the kubelet and kubectl
# replace x in 1.31.x-* with the latest patch version
# Debian
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.31.x-*' kubectl='1.31.x-*' && \
sudo apt-mark hold kubelet kubectl
# REHL
sudo yum install -y kubelet-'1.31.x-*' kubectl-'1.31.x-*' --disableexcludes=kubernetes
2. Restart the kubele
sudo systemctl daemon-reload
sudo systemctl restart kubelet
Uncordon the node
이후 다시 마스터 노드에 pod가 스케쥴링 되도록 uncrodon 을 진행한다 ( master 위치가 아닌 exit 를 이용하여 console로 나오는거 꼭 확인!)
# replace <node-to-uncordon> with the name of your node
kubectl uncordon <node-to-uncordon>
2. ETCD 백업문제 (고득점임.. 꼭 숙지해서 점수 따기)
https://webheck.tistory.com/entry/cka-Backup-and-Restore-Methods
https://webheck.tistory.com/entry/cka-Backup-and-Restore-Methods-2
ETCD 백업의 동작은 크게 두가지로 진행된다.
1. 현재의 상태를 스냅샷으로 저장하기.
2. 저장된 스냅샷으로 ETCD 복원하기.
ETCD Bakup
docs 에서 내가 검색한 키워드 -> etcd -> Kubernetes Components | Kubernetes -> etcd -> back-up
1. etcdctl 을 이용하여 백업진행. 진행시 컨테스트 변경 및 노드 접근하여 진행.
ETCDCTL_API=3 etcdctl --endpoints $ENDPOINT snapshot save snapshot.db
# 문제에서 각 키를 주어준다면 아래 활용
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
snapshot save <backup-file-location>
ETCD Restore
위 에서 생성한 backup 파일 또는 주어진 backup 파일을 이용하여 현재 컨텍스트의 etcd 를 백업할 수 있다.
ETCDCTL_API=3 etcdctl snapshot restore --data-dir <data-dir-location> snapshotdb
#### 현재 날짜 (2024.09.03) 기준 etcdctl 이 deprecate 되었다. 아래명령어를 사용하여 백업이 가능하다.
etcdutl --data-dir <data-dir-location> snapshot restore snapshot.db
Note:
The usage of etcdctl for restoring has been deprecated since etcd v3.5.x and is slated for removal from etcd v3.6. It is recommended to utilize etcdutl instead.
나머지는 추후..정리..... 넘 많다.
댓글