다음은, CKA 공부를 하며 정리한 내용으로, 시험을 보시는 분들에게 도움이 되길 바랍니다.
1. 시험 문제 풀기 전 반드시 해야할 것
1) Cheat Sheet 확인해 자동완성 활성화
https://kubernetes.io/docs/reference/kubectl/cheatsheet/
2) 각 문제별로 Context 확인 후 문제 풀기
2. 공부한 문제들 (각 문제에 작성된 답안으로 푸시는 것도 좋지만 참고하여 자신의 정답을 작성해 보는게 좋습니다.)
1) 스냅샷 만들기
https://v1-18.docs.kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#built-in-snapshot
- *.crt 들 경로를 아래 형식에 맞춰 입력하고, restore 하는 것도 포함.
- 아래 형식에 맞춰서 입력하기
ETCDCTL_API=3 etcdctl snapshot save --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 /opt/etcd-backup.db
ex. Etcd 스냅샷을 하는데 TLS를 이용해서 만들어라
Endpoint : https:127.0.0.1:2379
Path : /snapshot/etcd.db
Version : 3.2.12
CA : /tls/ca.crt, Client Cert : /tls/client.crt, Client Key : /tls/client.key
ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379 --cacert /tls/ca.crt --cert /tls/client.crt --key /tls/client.key snapshot save /snapshot/etcd.db
-- 생성 확인방법
ETCDCTL_API=3 etcdctl --write-out=table snapshot status /snapshot/etcd.db
2) Pod 에 nodeSelector (disktype=ssd) 추가 + 라벨 확인하고 진행할 것
- node에 라벨 추가하고 해당 노드 셀렉터 옵션을 추가하는 방법은 아래와 같음.(볼드체 확인)
==========================
node-selector.yaml
==========================
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
==========================
kubectl apply -f node-selector.yaml
-- 확인방법
kubectl get pods nginx -o wide
3) 역할/매핑
- Role 만들고 SA 만들고 매핑 (CSR 만드는건 안나옴) , 특정 namespace에 한정되도록 설정
- 권한은 create 만 주도록
kubectl create serviceaccount john --dry-run=client -o yaml > sa.yaml
kubectl apply -f sa.yaml
kubectl create role developer --resource=pods --verb=create --namespace=development
kubectl create rolebinding developer-role-binding --role=developer --user=john --namespace=development
4) Pod 만들고 거기에 서비스를 배포하는데 80 포트로 설정 + NodePort = 80으로 해라
kubectl run nginx-resolver --image=nginx
kubectl expose pod nginx-resolver --port=80 --target-port=80 --type=NodePort --name=nginx-resolver-service
--확인방법
kubectl get svc nginx-resolver-service -o yaml
5) Taint 값 확인해서 파일로 저장하기 ( NoSchedule 제외하고 node만 개수 파일로 저장 )
또는 ready 상태인 Node 갯수 저장하기 ( 단 Taints로 NoSchedule가 걸려 있는 node는 제외)
kubectl describe nodes | grep Taint
2개면 echo "2" > 파일
6) 사용률 제일 높은 pod 파일로 저장하기 + 특정 label 만 조회해야 함
(예시는 label이 overloaded-cpu 인경우)
kubectl top pods -l name=overloaded-cpu > 대상파일
7) 노드 업그레이드 하기
- 마스터노드는 1.21.1 로 / 나머지는 1.21.0으로 업그레이드 해라 (근데 마스터만 하면 됨.)
kubectl drain MASTER_NODE --ignore-daemonsets
ssh MASTER_NODE
sudo -i
apt-get update && \
apt-get install -y --allow-change-held-packages kubeadm=1.21.1-00
kubeadm upgrade plan
kubeadm upgrade apply v1.21.1
apt-get update && \
apt-get install -y --allow-change-held-packages kubelet=1.21.1-00 kubectl=1.21.1-00
sudo systemctl daemon-reload
sudo systemctl restart kubelet
** 노드에서 kubeadm 업데이트시는 아래와 같이 upgrade node(안해도 되는 것)
apt-get update && \
apt-get install -y --allow-change-held-packages kubeadm=1.21.0-00
kubeadm upgrade node
8) node 중 특정 노드(ek8s-node-0)를 unavailable 하게 만들었다가 reschedule 하도록 만들라는 문제
https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/
(* 만약 라벨을 부여하라는 내용까지 있다면 kubectl label nodes ek8s-node-0 name=ek8s-node-0 )
kubectl get node --show-labels | grep name=ek8s-node-0
kubectl drain ek8s-node-0 --ignore-daemonsets --force
kubectl get nodes <-- 확인
kubectl uncordon ek8s-node-0 <-- 복구
**https://daintree.tistory.com/16 참고
9) Node 한 개가 NotReady 상태인데 Ready가 되도록 해결하기 (고배점 문제)
- 해당 문제의 원인은 kubelet이 기동되지 않은 상태였음
--SSH로 해당 Node 접근
ssh wk8s-node-0
sudo -i
systemctl status kubelet <--kubelet 상태 확인 (inactive 상태)
systemctl restart kubelet <--kubelet 기동
systemctl status kubelet <--kubelet 상태 확인 (active 상태 확인)
10) (제대로 못 푼 문제) http 라는 이름으로 80 포트를 container Port로 추가
그리고 http 에 서비스 연동하기 서비스 이름은 줌 + nodePort로 들어오게 하는걸 also 추가하기
- http 이름으로 80포트 추가하기
kubectl edit deployment/busybox-deploy -o yaml
----------------------------------------------------------
spec:
containers:
- name: 기존 이름 유지
image: "gcr.io/google-samples/hello-app:2.0" <--이건 뭐였는지 기억 안남
env:
- name: "http"
value: "80"
----------------------------------------------------------
11) deploy01 디플로이먼트에 대해 replica 업데이트 하는 법
kubectl scale deployment/deploy01 --replicas=6
12) pod1 파드에서 특정 로그(ErrorMessageText)만 추출하여 파일로 저장하기
kubectl logs pod1 | grep 주어진ErrorMessageText > ${경로}
13) Ingress를 배포해서 이미 생성 되어 있는 서비스와 연결하고 확인하기.
https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource
- 정의하는 내용은 /hi 로 요청이 오면 5678 포트로 서비스하고 있는 서비스로 보내는데, namespace 지정되어 있음.
-> 테스트 방법 [[ curl -kL http://clustIP/hi ]] 제시됨 -> 제대로 되었다면 hi 라고 나옴
- 문제에서 요구하는 서비스 hi는 이미 배포되어 있음
- 인그레스 명세 복사
vi test.yaml ( path, service, number 수정 )
=======================
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
namespace: Namespace이름
spec:
rules:
- http:
paths:
- path: /hi
pathType: Prefix
backend:
service:
name: hi
port:
number: 5678
=======================
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: client
=======================
- 확인방법
1> IP 확인
kubectl get ingress minimal-ingress --namespace=Namespace이름
2> curl -kL http://clustIP/hi
14) Networkpolicy를 배포해서 특정 namespace의 pod만 특정 포트로 연결 할 수 있도록 하기
+ 80포트로만 접속할 수 있고, 특정 Pod에서 온 요청만 처리할 수 있도록 설정한다.
https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource
(* Ingress는 인바운드, Egress는 아웃바운드임)
vi np.yaml
=====================
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: 주어짐
namespace: 주어진 네임스페이스
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: 노드이름
podSelector: {}
ports:
- protocol: TCP
port: 8080
=====================
kubectl apply -f np.yaml
* 만약 생성하는게 아니라 수정하는 거라면, 이렇게 해보자
--특정 namepace라면
1> namespace의 label을 확인해서 matchlabels 에 추가
혹은 2> kubectl label namespace {namespace이름} user=alice
--특정 pod 에서만 받는다면
1> kubectl get pods -o wide 로 label 확인해보고
혹은 2> kubectl label pods {pod이름} role=client 하고 아래와 같이 설정
** kubectl get networkpolicy np이름 -o yaml > npp.yaml
=====================
ingress:
- from:
- namespaceSelector:
matchLabels:
이거 항목으로 label로 (namespace 라벨 k get pods --show-labels 해서 나오는거 )
podSelector:
matchLabels:
role: client
=====================
kubectl apply -f npp.yaml
15) PV / PVC 생성 후 연동하기 + PVC 업데이트 하기 (100Mi -> 10Mi)
PV : https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistent-volumes
PVC : https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims
- 예시는 Storage 100Mi 만들고, AccessMode는 RWO, path 는 경로 로 주어진 경우
#pv.yaml 파일 작성
=========================
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 100Mi
accessModes:
- ReadWriteOnce
hostPath: path: 경로
=========================
kubectl create -f pv.yaml
kubectl get pv 로 확인
pvc.yaml
==========================
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
==========================
kubectl apply -f pvc.yaml
--확인방법 : PVC 조회 시 위의 출력처럼 Bound 상태로 조회되어야 함.
kubectl get pv,pvc
+ 연동하기 : Pod의 명세 내역에 volumeMount 부분부터 쭉 추가하면 됨.
(파드가 만들어져 있다면 edit으로 연동 / 파드가 없다면 생성 후 pvc 연동)
kubectl edit pod.yaml
================================
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
================================
--확인방법 :
kubectl get pvc
+ **-> storage 부분만 원하는 용량으로 바꾸기**
+ 용량 바꾸기
예시는 10Mi-> 70Mi로 증설하기임
kubectl edit pvc pv-volume --record
입력 후 용량 변경 후 저장 (변경에 시간이 걸리니 30초 뒤 확인)
16) 사이드카 패턴으로 기존에 배포된 Pod에 container 새로 구성 / 추가로 파일시스템 같이 사용하도록 설정
+ 한 컨테이너에 여러 이미지가 돌아가도록 하시오
참고 자료 : https://daintree.tistory.com/18?category=886935
17) nginx 1.16으로 Delployment 생성 후 거기에 이미지 업그레이드를 진행하시오
+ 히스토리를 파일에 저장하기
kubectl create deployment deploy-01 --image=nginx:1.16.0
kubectl set image deployment/deploy-01 nginx=nginx:1.17.0 --record
kubectl rollout undo deployment.v1.apps/deploy-01
kubectl rollout history deployment.v1.apps/deploy-01 > 대상 파일
18 ) busybox 를 busybox123으로 Deployment 수정하기
kubectl set image deployment/busybox-deploy busybox=busybox123
'IT > Cloud' 카테고리의 다른 글
AWS App Mesh 특징 (0) | 2022.06.22 |
---|---|
GCP 자격증 시험 응시_2023 업데이트 (0) | 2022.06.03 |
Kubernetes 문제 해결/트러블 슈팅 (0) | 2021.09.26 |
CKA_시험 응시 (1) | 2021.09.08 |
CKA_준비 (0) | 2021.09.08 |