IT/Cloud

CKA 대비 공부한 문제들

동구멍폴로 2021. 9. 26. 21:08
반응형

다음은, 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