ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CKA 대비 공부한 문제들
    Cloud & Infra/Cloud 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 

     

    반응형

    'Cloud & Infra > 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
Designed by Tistory.