https://kubernetes.io 의 document 만을 참고하여 문제를 풀 것.
사전에 auto completion 을 설정되어 있으므로 잘 활용하면 효율적임.
tmux 도 제공되므로 활용하면 좋음.
문제 지시에 따라 context 를 지정한 후 문제를 푼다.(sudo -i 를 한경우 반드시 context를 확인해야 함)
sudo -i 를 사용해야 할 경우도 있음. --> sudo 명령어를 사용하는게 나을 듯.
시험전략
- 시험전에 pc compatibility 체크
- 74점 이상이므로 너무 어려운 문제를 풀려고 하지 말것.
- 최신 버전으로 시험 준비
- CKA portal :
24 or 28 문제 출제??
시험 환경 설정
🔒 kubectl autocompletion 하기
echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
source .bashrc
예상 시험 문제
🔒 kubeadm으로 클러스터 구성하기
1. container runtime 설치
: kubernetes.io 사이트에서 "container runtime" 로 검색 한 후 "container runtimes" 클릭 후 설정
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# Apply sysctl params without reboot
sudo sysctl --system
apt install containerd
2. container runtime 설치
: kubernetes.io 사이트에서 "install with kubeadm" 로 검색 한 후 설정
apt 패키지를 업데이트하고 ubernetes apt저장소를 사용하는 데 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
Google Cloud 공개 서명 키를 다운로드
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
Kubernetes apt 리포지토리를 추가
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
패키지 인덱스를 업데이트 apt하고 kubelet, kubeadm 및 kubectl을 설치하고 해당 버전을 고정
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
3. control-plane node 초기화
$ kubeadm init
...
## 완료가 되면 아래와 같은 메시지가 출력됨
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
4. CNI 설치
아래 명령어로 weave network add-on을 설치합니다.
<weabenet 설치>
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
## 실행결과
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created
2022.10.20 일 기준으로 kubectl 버전에 따라 위의 명령어가 수행되지 않을 경우, 아래 명령어를 수행한다
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
<calico 설치>
1. operator 설치
kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
2. calico 설정 파일 다운로드
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.3/manifests/custom-resources.yaml -O
3. calico 설치
kubectl create -f custom-resources.yaml
<flannel 설치>
주의할 점 : master node에서 컨트롤 플레인 설정 시 반드시 --pod-network-cidr=10.244.0.0/16 옵션으로 수행해야 한다
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
아래 명령어로 flannel CNS를 설치한다.
kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
5. node join
worker node에서 kubeadm join 수행
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
6. 클러스터 설치 확인
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 10h v1.25.3
worker-1 Ready <none> 10h v1.25.3
worker-2 Ready <none> 10h v1.25.3
🔒 node join 추가하기
🔑 : kubernetes.io 사이트에서 busybox 로 검색 한 후 설정
1. container runtime 설치
$ apt install containerd
2. kubeadm, kubectl, kubelet 설치
추가할 node에 kubernetes.io 의 문서를 참조하여 설치
3. kubeadm create -- 명령어로 join 명령어 추출
$ kubeadm token create --print-join-command
## 아래 IP는 각자의 master node ip
kubeadm join 10.178.0.29:6443 --token i9ty38.mujkeddsah1364iu --discovery-token-ca-cert-hash sha256:a172d4a560907269b1b6cc6f40bc1e16fa8092831f92b24515297eb7b5a50a51
4. node join 수행
kubeadm create 명령어로 추출한 명령어를 master node에서 수행
kubeadm join 10.178.0.29:6443 --token i9ty38.mujkeddsah1364iu --discovery-token-ca-cert-hash sha256:a172d4a560907269b1b6cc6f40bc1e16fa8092831f92b24515297eb7b5a50a51
5. node 확인
kubectl get nodes 로 추가된 node 확인
🔒 POD 생성하기(Busybox sleep 3600)
🔑 : kubernetes.io 사이트에서 busybox 로 검색 한 후 설정
아래 내용의 busybox.yaml 파일로 pod를 생성한다.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'sleep 3600']
또는 아래 명령어를 수행한다.
kubectl run busybox --image=busybox --command -- sleep 3600
🔒 ETCD backup & restore
- etcdctl 설치
sudo apt install etcd-client
- etcd backup : etcd 프로세스를 grep 하면 프로세스에서 --trusted-ca-file, --cert-file, --key-file 옵션을 확인할 수 있다.
각각 --cacert, --cert, --key 와 매칭된다. 마지막 snapshotdb는 백업파일명이다.
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshotdb
Snapshot saved at snapshotdb
-etcd restore
ETCDCTL_API=3 etcdctl --endpoints 10.2.0.9:2379 snapshot restore snapshotdb
OR
ETCDCTL_API=3 etcdctl --data-dir <data-dir-location> snapshot restore snapshotdb
db를 restore 한 후 static pod 인 etcd 에 정보를 수정한다. static pod 의 yaml 파일은 /etc/kubernetes/manifests 디렉토리에 etcd.yaml 파일로 존재한다. 복구한 디렉토리 정보를 이 파일을 수정해 준다. 수정할 곳은 2군데이다.
복원된 etcd 정보는 etcd pod가 자동으로 적용된다. 복구되는 동안에는 kubectl 명령어가 hang 상태가 된다.
(복구하는데 시간이 약간 소요된다)
spec:
containers:
- command:
- etcd
- --advertise-client-urls=https://10.10.1.23:2379
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --client-cert-auth=true
- --data-dir=/var/lib/etcd ==> 복원한 디렉토리로 수정
volumeMounts:
- mountPath: /var/lib/etcd ==> 복원한 디렉토리로 수정
name: etcd-data
- mountPath: /etc/kubernetes/pki/etcd
name: etcd-certs
🔒 kubernetes Upgrade
업그레이드할 버전 결정
apt update
apt-cache madison kubeadm
# 목록에서 최신 버전(1.24)을 찾는다
# 1.24.x-00과 같아야 한다. 여기서 x는 최신 패치이다.
컨트롤 플레인 노드 업그레이드
컨트롤 플레인 노드의 업그레이드 절차는 한 번에 한 노드씩 실행해야 한다. 먼저 업그레이드할 컨트롤 플레인 노드를 선택한다. /etc/kubernetes/admin.conf 파일이 있어야 한다.
"kubeadm upgrade" 호출
첫 번째 컨트롤 플레인 노드의 경우
kubeadm 업그레이드 : x 문자를 업그레이드하려는 버전의 문자로 바꾼다.
# 1.24.x-00에서 x를 최신 패치 버전으로 바꾼다.
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.24.x-00 && \
apt-mark hold kubeadm
다운로드하려는 버전이 잘 받아졌는지 확인한다.
kubeadm version
업그레이드 계획을 확인한다.이 명령은 클러스터를 업그레이드할 수 있는지를 확인하고, 업그레이드할 수 있는 버전을 가져온다. 또한 컴포넌트 구성 버전 상태가 있는 표를 보여준다.
kubeadm upgrade plan
업그레이드할 버전을 선택하고, 적절한 명령을 실행한다. 예를 들면 다음과 같다.
# 이 업그레이드를 위해 선택한 패치 버전으로 x를 바꾼다.
sudo kubeadm upgrade apply v1.24.x
명령이 완료되면 다음을 확인해야 한다.
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.24.x". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
CNI 제공자 플러그인을 수동으로 업그레이드한다.
다른 컨트롤 플레인 노드의 경우
첫 번째 컨트롤 플레인 노드와 동일하지만 다음을 사용한다.
sudo kubeadm upgrade node
kubeadm upgrade plan 을 호출하고 CNI 공급자 플러그인을 업그레이드할 필요가 없다
노드 드레인
- 예약 불가능으로 표시하고 워크로드를 제거하여 유지 관리를 위해 노드를 준비합니다.
-
# <node-to-drain>을 드레인하는 노드의 이름으로 바꾼다. kubectl drain <node-to-drain> --ignore-daemonsets
kubelet과 kubectl 업그레이드
- 모든 컨트롤 플레인 노드에서 kubelet 및 kubectl을 업그레이드한다.
# replace x in 1.24.x-00의 x를 최신 패치 버전으로 바꾼다
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.24.x-00 kubectl=1.24.x-00 && \
apt-mark hold kubelet kubectl
- kubelet을 다시 시작한다.
sudo systemctl daemon-reload
sudo systemctl restart kubelet
노드 uncordon
- 노드를 스케줄 가능으로 표시하여 노드를 다시 온라인 상태로 전환한다.
-
# <node-to-drain>을 드레인하는 노드의 이름으로 바꾼다. kubectl uncordon <node-to-drain>
워커 노드 업그레이드
워커 노드의 업그레이드 절차는 워크로드를 실행하는 데 필요한 최소 용량을 보장하면서, 한 번에 하나의 노드 또는 한 번에 몇 개의 노드로 실행해야 한다.
kubeadm 업그레이드
- 모든 워커 노드에서 kubeadm을 업그레이드한다.
# 1.24.x-00의 x를 최신 패치 버전으로 바꾼다
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.24.x-00 && \
apt-mark hold kubeadm
"kubeadm upgrade" 호출
- 워커 노드의 경우 로컬 kubelet 구성을 업그레이드한다.
-
sudo kubeadm upgrade node
노드 드레인(master node에서 수행)
- 스케줄 불가능(unschedulable)으로 표시하고 워크로드를 축출하여 유지 보수할 노드를 준비한다.
-
# <node-to-drain>을 드레이닝하려는 노드 이름으로 바꾼다. kubectl drain <node-to-drain> --ignore-daemonsets
kubelet과 kubectl 업그레이드
- kubelet 및 kubectl을 업그레이드한다.
# 1.24.x-00의 x를 최신 패치 버전으로 바꾼다
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.24.x-00 kubectl=1.24.x-00 && \
apt-mark hold kubelet kubectl
- kubelet을 다시 시작한다.
sudo systemctl daemon-reload
sudo systemctl restart kubelet
노드에 적용된 cordon 해제(master node에서 수행)
- 스케줄 가능(schedulable)으로 표시하여 노드를 다시 온라인 상태로 만든다.
-
# <node-to-drain>을 노드의 이름으로 바꾼다. kubectl uncordon <node-to-drain>
클러스터 상태 확인
모든 노드에서 kubelet을 업그레이드한 후 kubectl이 클러스터에 접근할 수 있는 곳에서 다음의 명령을 실행하여 모든 노드를 다시 사용할 수 있는지 확인한다.
kubectl get nodes
모든 노드에 대해 STATUS 열에 Ready 가 표시되어야 하고, 버전 번호가 업데이트되어 있어야 한다
🔒 json format 출력
🔑 : jsonpath 형식으로 출력
🔒 디플로이먼트 업데이트
🔑 : 다음 단계에 따라 디플로이먼트를 업데이트한다.
nginx:1.14.2 이미지 대신 nginx:1.16.1 이미지를 사용하도록 nginx 파드를 업데이트 한다.
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1
또는 다음의 명령어를 사용한다.
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
대안으로 디플로이먼트를 edit 해서 .spec.template.spec.containers[0].image 를 nginx:1.14.2 에서 nginx:1.16.1 로 변경한다.
kubectl edit deployment/nginx-deployment
다음과 유사하게 출력된다.
deployment.apps/nginx-deployment edited
롤아웃 상태를 보려면 다음을 실행한다
kubectl rollout status deployment/nginx-deployment
업데이트된 디플로이먼트에 대해 자세한 정보 보기
- 롤아웃이 성공하면 kubectl get deployments 를 실행해서 디플로이먼트를 볼 수 있다. 이와 유사하게 출력된다.
-
NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 36s
kubectl get rs 를 실행해서 디플로이먼트가 새 레플리카셋을 생성해서 파드를 업데이트 했는지 볼 수 있고, 새 레플리카셋을 최대 3개의 레플리카로 스케일 업, 이전 레플리카셋을 0개의 레플리카로 스케일 다운한다.
kubectl get rs
이와 유사하게 출력된다.
NAME DESIRED CURRENT READY AGE
nginx-deployment-1564180365 3 3 3 6s
nginx-deployment-2035384211 0 0 0 36s
🔒 trouble shooting
- kubelet, controller-manager, apiserver 등등 상태 분석
- node 에 대해 describe, log 분석
- pod에 대해 describe, log 분석
- kubelet, controller-manager, apiserver 등등 상태 분석
-
🔒 kubernetes cluster 구성(with kubeadm 으로 설치)
- docker는 설치되어 있으니까, control plane에서 kubeadm(kubelet 이 같이 설치됨), CNI를 설치하고 worker node에서 kubeadm(kubelet 이 같이 설치됨)을 설치한 후 master node에 join 한다.
kubernetes 문서에서는 다 설치하는 것으로 설명되어 있으니 전체를 설치한다.
1) 6443 port가 사용하지 않고 있는지 확인(6443 port는 apiserver에서 사용할 port)
- telnet 이나 nc 명령어로 확인
nc 127.0.0.1 6443
2) kubeadm, kubelet and kubectl 설치
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
3) control-plane node 초기화
kubeadm init
4) 환경 설정
일반 user로 kubectl 명령어를 사용하기 위해 아래 명령어를 수행
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
root 는 아래 명령어 수행
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc
5) CNI 설치
공식문서에서 CNI 설치 명령어를 찾을 수 없음.
how ? 별도 url 에서 찾는다. <<< 문서를 찾는 단어를 찾아본다 >> v1-2... 이런게 있었던거 같다.
CNI 설치(flannel or weave-net)
🔒 참고
pod spec의 arg와 command 차이
command는 docker 의 ENTRYPOINT이고 arg는 CMD이다.
'쿠버네티스' 카테고리의 다른 글
쿠버네티스 - play with k8s (0) | 2022.10.20 |
---|---|
쿠버네티스 설치 - unbutu 22.04 (0) | 2022.06.27 |
쿠버네티스 보충 (0) | 2022.06.08 |
CKA 자격증 취득하기 #2 (0) | 2022.05.23 |
CKA 자격증 취득하기 #1 (0) | 2022.05.18 |