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

+ Recent posts