kubernetes CKA study (34) - Mock-Exam-1, Mock-Exam-2

이동명·2024년 1월 5일
0

kubernetes CKA study

목록 보기
34/37
post-thumbnail

이번 게시글에선 CKA 모의고사 1번 시험을 풀어보고 풀이를 리뷰하도록 하겠습니다. 이전 포스팅이나 자료같은 건 참고 할 수 없으며 참고할 수 있는 페이지는 kubernetes.io docs만 가능 합니다.

Mock-Exam-1

<Weight: 6>

01. Deploy a pod named nginx-pod using the nginx:alpine image.

내 풀이

kubectl create deployment --image=nginx:alpine nginx-pod

<Weight: 8>

02. Deploy a messaging pod using the redis:alpine image with the labels set to tier=msg.

내 풀이

kubectl run --image=redis:alpine messaging -l tier=msg

<Weight: 4>

03. Create a namespace named apx-x9984574.

내 풀이

k create ns apx-x9984574

<Weight: 7>

04. Get the list of nodes in JSON format and store it in a file at /opt/outputs/nodes-z3444kd9.json.

내 풀이

k get nodes -o json > /opt/outputs/nodes-z3444kd9.json

<Weight: 12>

05. Create a service messaging-service to expose the messaging application within the cluster on port 6379.

내 풀이

apiVersion: v1
kind: Service
metadata:
  name: messaging-service
spec:
  selector:
    tier: msg
  ports:
    - protocol: TCP
      port: 6379
      targetPort: 6379

<Weight: 11>

06. Create a deployment named hr-web-app using the image kodekloud/webapp-color with 2 replicas.

내 풀이

k create deployment --image=kodekloud/webapp-color hr-web-app --replicas=2

<Weight: 8>

07. Create a static pod named static-busybox on the controlplane node that uses the busybox image and the command sleep 1000.

내 풀이

/etc/kubernetes/manifests

apiVersion: v1
kind: Pod
metadata:
  name: static-busybox
spec:
  containers:
    - name: web
      image: busybox
      command: ["sleep", "1000"]

<Weight: 12>

08. Create a POD in the finance namespace named temp-bus with the image redis:alpine.

내 풀이

run --image=redis:alpine temp-bus --namespace=finance

<Weight: 8>

09. A new application orange is deployed. There is something wrong with it. Identify and fix the issue.

pod yaml에 오타가 있어서 수정함

<Weight: 10>

10. Expose the hr-web-app as service hr-web-app-service application on port 30082 on the nodes on the cluster.

내 풀이

apiVersion: v1
kind: Service
metadata:
  name: hr-web-app-service
spec:
  type: NodePort
  selector:
    app: hr-web-app
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30082

<Weight: 6>

11. Use JSON PATH query to retrieve the osImages of all the nodes and store it in a file /opt/outputs/nodes_os_x43kj56.txt.

뭔 말 인지 잘 모르겠음.

<Weight: 8>

12. Create a Persistent Volume with the given

specification

Volume name: pv-analytics

Storage: 100Mi

Access mode: ReadWriteMany

Host path: /pv/data-analytics

내 풀이

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-analytics
  labels:
    type: local
spec:
  storageClassName: pv-analytics
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/pv/data-analytics"

결과

틀린 문제 풀이

1번 문제에서 pod를 만들어야 하는데 실수로 deployment를 만들었다.

정답 : kubectl run nginx-pod --image=nginx:alpine

11번 문제는 kubernetes 클러스터의 노드들에 대한 정보 중에서 각 노드의 운영 체제 이미지(OS 이미지) 정보를 추출하고, 그 정보를 /opt/outputs/nodes_os_x43kj56.txt 파일에 저장하는 문제 였다.

정답 : kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.osImage}' > /opt/outputs/nodes_os_x43kj56.txt


Mock-Exam-2 풀이

<Weight: 10>

01. Take a backup of the etcd cluster and save it to /opt/etcd-backup.db. (etcd backup)

혹시나 먼저 자동완성이 되지 않는다면 다음의 명령어를 붙여넣어주자.

kubectl cheet 로 검색해서 찾음
https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/

source <(kubectl completion bash) # bash-completion 패키지를 먼저 설치한 후, bash의 자동 완성을 현재 셸에 설정한다
echo "source <(kubectl completion bash)" >> ~/.bashrc # 자동 완성을 bash 셸에 영구적으로 추가한다
alias k=kubectl
complete -o default -F __start_kubectl k

이렇게 하면 자동완성이 가능해 질 것 이다.

그리고 etcd backup을 찾아보자.

etcdctl backup 로 검색해서 찾음

https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/

옆 사이드메뉴에 보면 Backing up an etcd cluster 메뉴가 있음

docs에 살펴보면

ETCDCTL_API=3 etcdctl --endpoints $ENDPOINT snapshot save snapshot.db

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
  snapshot save <backup-file-location>

이런식으로 하라고 나와있음

그렇다면 지금 내가 필요한 건 4가지를 알아내야 한다.

정보는 모두 cat /etc/kubernetes/manifests/etcd.yaml 이 파일에서 알아낼 수 있다.

  • endpoints : --listen-client-urls=https://127.0.0.1:2379

  • cacert : --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

  • cert : --cert-file=/etc/kubernetes/pki/etcd/server.crt

  • key : --key-file=/etc/kubernetes/pki/etcd/server.key

그리고 대입해주고 위치 지정해주면 된다.

ETCDCTL_API=3 etcdctl --endpoints 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 /opt/etcd-backup.db


<Weight: 10>

02. Create a Pod called redis-storage with image: redis:alpine with a Volume of type emptyDir that lasts for the life of the Pod.

k run --image=redis:alpine redis-storage --dry-run=client > redis-storage.yml 으로 일단 pod yml하나 만들어 줬음

그리고 볼륨을 지정해주자

pod volumes을 검색했다.

https://kubernetes.io/docs/concepts/storage/volumes/

오른쪽 사이드메뉴에 emptyDir 이 있을 것 이다.

예제에서 아래의 볼륨 옵션만 복사를 해주고 yml 에 추가하였다.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: redis-storage
  name: redis-storage
spec:
  containers:
  - image: redis:alpine
    name: redis-storage
    resources: {}
    volumeMounts:
    - mountPath: /data/redis
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 500Mi
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

<Weight: 8>

03. Create a new pod called super-user-pod with image busybox:1.28. Allow the pod to be able to set system_time. The container should sleep for 4800 seconds.

k run --image=busybox:1.28 super-user-pod --dry-run=client -o yaml > super-user-pod.yml

일단 pod yml로 하나 만들어주고 command: ["sleep", "4800"] 도 추가 해주고 system_time 만 허용하게 해주면 될 것 같다.

security capabilities으로 검색을 하였음

https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

아래의 명령줄을 추가해야 한다.

securityContext:
  capabilities:
    add: ["NET_ADMIN", "SYS_TIME"]

<Weight: 12>

04. A pod definition file is created at /root/CKA/use-pv.yaml. Make use of this manifest file and mount the persistent volume called pv-1. Ensure the pod is running and the PV is bound. mountPath: /data persistentVolumeClaim Name: my-pvc

일단 제공해준 yml을 보면


apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: use-pv
  name: use-pv
spec:
  containers:
  - image: nginx
    name: use-pv
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

위 처럼 나와있고 pv-1 이라는 persistent volume 이 배포되어 있는 상태이다.

그 상태에서 persistent volume claim을 배포해야 한다.

pvc로 검색하였음

https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims

우측 사이드메뉴에 persistentvolumeclaims가 있음

pvc를 예시에 따라 만들면 되는데 이때 pv의 사양과 옵션을 체크 해야함.

확인 후 옵션을 맞춰서 pvc를 생성하자.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi

생성한 후 pod에서 사용한다고 해줘야 한다. 맨 처음 제공해 준 yml을 수정하자

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: use-pv
  name: use-pv
spec:
  containers:
  - image: nginx
    name: use-pv
    volumeMounts:
      - mountPath: "/data"
        name: mypd
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: my-pvc
status: {}

<Weight: 15>

05. Create a new deployment called nginx-deploy, with image nginx:1.16 and 1 replica. Next upgrade the deployment to version 1.17 using rolling update.

kubectl create deployment nginx-deploy --image=nginx:1.16 --dry-run=client -o yaml > deploy.yaml

kubectl apply -f deploy.yaml --record

kubectl rollout history deployment nginx-deploy

kubectl set image deployment/nginx-deploy nginx=nginx:1.17 --record

kubectl rollout history deployment nginx-deploy


<Weight: 15>

06. Create a new user called john. Grant him access to the cluster. John should have permission to create, list, get, update and delete pods in the development namespace . The private key exists in the location: /root/CKA/john.key and csr at /root/CKA/john.csr.

(Important Note: As of kubernetes 1.19, the CertificateSigningRequest object expects a signerName.)

(Please refer the documentation to see an example. The documentation tab is available at the top right of terminal.)

일단 john이라는 유저에게 cluster에 access 할 수 있는 권한을 줘야한다.

첫번째로 role binding을 검색해봤다.
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/

일단 인증서 서명요청을 만들어야 한다. docs에 있는 템플릿을 복사하자

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: myuser
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth

그리고 yml파일을 하나 만들어주고 서명요청 하려는 유저의 데이터를 대입하자

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: john-developer
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth

그리고 docs 에 나와 있는 대로 인코딩하자

cat john.csr | base64 | tr -d "\n"

나오는 값을 만든 yml 파일에 대입하자.

k get csr 로 확인해보면 인증서명요청이 pending 상태이기 때문에 승낙을 해줘야 한다.

k certificate approve john-developer

인증을 완료 했으니 이제 역할을 부여해야 한다.

k create role --help 로 명령어 잠시 확인해보고..

이런것들을 활용해서 문제의 지문에 맞게 아래의 명령어를 작성한다.

kubectl create role developer --verb=create,update,delete,get,list,watch --resource=pods -n development

이제 role 을 생성 했으니 해당 유저에게 binding 해주면 된다.

그 전에 k auth can-i get pods --namespace=development --as john 명령어를 활용하면 현재 리소스에 대한 권한을 확인할 수 있다.

이제 바인딩을 하기 전에 명령어 한번 봐주고..

k create rolebinding --help

kubectl create rolebinding admin --clusterrole=admin --user=user1 이걸 활용해보자.

지문에 맞게 rolebinding 생성

kubectl create rolebinding john-developer --role=developer --user=john -n development

k auth can-i create pods --namespace=development --as john명령어를 입력하면 'yes'가 나온다.

순서를 요약하면..

인증서 서명요청 > 인증서 인코딩 > 인증서 승낙 > role 생성 > role binding 생성

으로 보면 되겠다.


<Weight: 15>

07. Create a nginx pod called nginx-resolver using image nginx, expose it internally with a service called nginx-resolver-service. Test that you are able to look up the service and pod names from within the cluster. Use the image: busybox:1.28 for dns lookup. Record results in /root/CKA/nginx.svc and /root/CKA/nginx.pod

일단 지문에 따라 pod 하나를 만들자

kubectl run nginx-resolver --image=nginx

그리고 그 pod를 expose 해주자. (targetPort랑 type까지는 안 적어도 상관없음)

kubectl expose pod nginx-resolver --name=nginx-resolver-service --port=80 --target-port=80 --type=ClusterIP

그리고 클러스터 내에서 서비스 및 Pod 이름을 조회할 수 있는지 테스트 해야한다.

조회에는 busybox:1.28 이미지를 사용하고 특정 경로로 결과를 넣으라고 하는 것 같다.

일단 대기상태의 pod를 지문에 있는 이미지를 사용해서 만든다.

k run busybox --image=busybox:1.28 -- sleep 4000

그리고 만든 pod내 container에 접근하여 해당 service 및 pod에 접근이 가능한지 nslookup를 이용하여 테스트 해보자.

아래의 결과를 지문에 나와 있는 경로로 보내준다.

k exec busybox -- nslookup nginx-resolver-service > /root/CKA/nginx.svc

그리고 pod 에도 접근이 가능한지를 봐야 한다.

docs에 DNS 라고 검색했다.

https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

pod에 접근할 때

172-17-0-3.default.pod.cluster.local 템플릿을 사용하라고 나와있다.

그래서 내 pod ip를 대시로 대입해서 결과를 지문의 경로로 보내주자.

k exec busybox -- nslookup 10-244-192-1.default.pod.cluster.local > /root/CKA/nginx.pod


<Weight: 15>

08. Create a static pod on node01 called nginx-critical with image nginx and make sure that it is recreated/restarted automatically in case of a failure. Use /etc/kubernetes/manifests as the Static Pod path for example.

node01에 static pod를 만들어야 한다. static pod 이기 때문에 delete 해도 자동으로 재 시작이 되어야 한다.

따라서 재시작 정책을 넣어서 pod 하나를 yml로 복사해서 node01에 접속하여 지정된 static pod path에 만들어주면 될 것 같다.

k run --image=nginx nginx-critical --restart=Always --dry-run=client -o yaml


profile
Web Developer

0개의 댓글