k8s/CKA

Mock Exam - 2

부엉이사장 2024. 9. 24. 02:12
Summary
  • cat > 파일경로   /  cntl + D
  • etcd 백업만 있음. restore도 꼭 연습해가야함. 실제문제에서 나왔음.
  • 그리고 시험환경에선 etcd백업할때 커맨드치는 노드가 controlplane node가 아니었음. ssh로 컨트롤플레인 노드로 접속해서 관리자권한으로 해야함!
export samp="--dry-run=client -o yaml"
export now="--force --grace-period 0"

 

$samp, $now붙은건 이 명령어로 약어만든거니까 주의

 

 

Kubectl Reference Docs

 

kubernetes.io

 

 


# 1

etcd 백업을 하라고 함

 

 

Operating etcd clusters for Kubernetes

etcd is a consistent and highly-available key value store used as Kubernetes' backing store for all cluster data. If your Kubernetes cluster uses etcd as its backing store, make sure you have a back up plan for the data. You can find in-depth information a

kubernetes.io

공식문서 링크임.

아래쪽 내려가보면 백업있음.

난 호스트권한 안주고 바로했음.

kubectl -n kube-system describe pod etcd-controlplane |$grep listen

endpoint는 client url쪽 저거 적어주면 됨

kubectl -n kube-system describe pod etcd-controlplane |$grep cert

cert쪽엔 저거,

 

kubectl -n kube-system describe pod etcd-controlplane |$grep key

key는 저거

 

kubectl -n kube-system describe pod etcd-controlplane |$grep trusted

ca file에는 저 trusted쪽거 적어주면 됨

 

마지막으로 

backup file location에는 문제에서 제시한 /opt/etcd-backup.db적어주면 됨

 

ETCDCTL_API=3 etcdctl --endpoints=https://192.32.8.6: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

이거 명령어 치면,

스냅샷이 만들어졌다는 메세지가 뜸

 

- 검토

 

 

따배씨 / ETCD Backup & Restore

Introductionetcd백업과 restore에 대해서 포스팅함Summary export samp="--dry-run=client -o yaml"export grep="grep -iC 3"export now="--force --grace-period 0"$samp, $grep, $now붙은건 이 명령어로 약어만든거니까 주의   # config

jacobowl.tistory.com

restore은 없는 문제임.

실제시험에서는 restore도 나올수 있고 나도 볼떄 나왔으니까 꼭 방법은 숙지해가샘

practice에 restore하는 방법 있으니 해보고가새여!

 

 

 

 

 

# 2

empty dir을 갖는 pod를 만들래

 

Volumes

On-disk files in a container are ephemeral, which presents some problems for non-trivial applications when running in containers. One problem occurs when a container crashes or is stopped. Container state is not saved so all of the files that were created

kubernetes.io

이런식의 양식임

kubectl run redis-storage --image redis:alpine $samp>2.yaml

저기서 volume쪽만 채워주자

apiVersion: v1
kind: Pod
metadata:
  name: redis-storage
spec:
  containers:
  - image: redis:alpine
    name: redis-storage
    volumeMounts:
    - mountPath: /data/redis
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 5Mi

걍 볼륨이름은 공식문서꺼 그대로 캐시볼륨으로 해주고

mount-path만 잘 확인

용량은 혹시몰라서 5Mi로 작게해줬음.

kubectl apply -f 2.yaml

 

- 검토

 

 

# 3    이거 안풀어도댐!

super-user-pod를 busybox이미지로 만드는데 커맨드 넣어주고 이 pod가 system time에 접근할 수 있게 해주래.

일단 system time뺴고 pod yaml부터 따자

kubectl run super-user-pod --image busybox:1.28 $samp --command -- sleep 4800 >3.yaml

자잘한거 지워주고 대충 야믈보면 이런데 system time접근하는걸 공식문서에서 찾아보자.

 

Configure a Security Context for a Pod or Container

A security context defines privilege and access control settings for a Pod or Container. Security context settings include, but are not limited to: Discretionary Access Control: Permission to access an object, like a file, is based on user ID (UID) and gro

kubernetes.io

sys_time으로 검색하니 여기가 나옴

이런식으로 되어있음

저 securityContext부분만 따서 넣자.

apiVersion: v1
kind: Pod
metadata:
  name: super-user-pod
spec:
  containers:
  - command:
    - sleep
    - "4800"
    image: busybox:1.28
    name: super-user-pod
    securityContext:
      capabilities:
        add: ["SYS_TIME"]

대충 저렇게 만들어봄.

이걸로 apply 하면됨

 

- 검토

잘모르겠음.

 

 

 

# 4

저 pod 야믈파일로 파드를 만들건데, persistent volume이랑 연결하래.

pvc만들고 pod 만들면 될듯.

일단 pvc

 

Persistent Volumes

This document describes persistent volumes in Kubernetes. Familiarity with volumes, StorageClasses and VolumeAttributesClasses is suggested. Introduction Managing storage is a distinct problem from managing compute instances. The PersistentVolume subsystem

kubernetes.io

이런건데 그냥 난 커맨드로 야믈 따려고 헀으나 안되네?

그냥 저거 필요없는부분 짤라서 쓰면,

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

참고로 request는 작게 3Mi로 했음.

근데 access mode를 모르겠네.

pv확인하면

kubectl get pv

RWO니까 Once그대로 쓰면 됨.

kubectl apply -f 4-pvc.yaml

retain이던 pv가 pvc만들고나서 bound가 된걸 확인.

 

이제 pod를 만들건데 문제에서 pod야믈 그대로 갖다 쓰라고 하니까,

cp /root/CKA/use-pv.yaml 4-pod.yaml

yaml 그대로 복사해서 가져오고 

여기에 볼륨을 설정해줘야함.

공식문서에 저 볼륨부분을 갖다 쓰면 

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

혹시몰라서 다른 잡 필드 안지우고 그대로 볼륨부분만 넣었음.

mountPath부분을 /data로 바꿔주고,

claimName필드를 my-pvc를 썼음

apply 해주니 잘 동작함

 

- 검토

아까 했던 pv랑 pvc bound상태된걸 확인해줘야하고

pod가 볼륨잘 생성된거 확인

 

 

- 문제

pvc만들었는데 bound가 안됐음. describe를 보니 스토리지 클래스가 없대. 근데 pv도 스토리지 클래스 없는데?

그래서 block 필드 지우니까 됨.

이유는 모르겠음.

 

- 실제시험에선

난 storage class설정하는것도 나옴. 사실 라벨링같은거라 어려운건 아닌데 시험에서 storage class문제 만난다고 당황하지마샘

 

 

따배씨 / persistent volume

Introduction개념은 자세히 안적고 대충 persistent volume이랑 persistent volume claim, 이 둘을 사용하는 pod의 관계를 알아야 한다.간단한 테스트 코드를 직접 쳐보며 그림으로 설명하겠다. Summarypv, pvc, pod관

jacobowl.tistory.com

pv랑 pvc관련 내포스팅

 

 

 

# 5

deployment를 만들고 이걸 업데이트 하라고 함

kubectl create deployment nginx-deploy --image nginx:1.16 --replicas 1

디플로이먼트를 잘 만들어줬음.

현재 이미지가 nginx:1.16임

kubectl set image deployments/nginx-deploy nginx=nginx1.17

nginx를 1.17로 롤링업데이트

잘 됐대.

 

set image쪽 자동완성이 안되니 reference에서 찾아보샘

 

- 검토

deployment로 확인하려면

롤링업데이트 히스토리로 확인하려면,

revision넘버를 꼭 써줘야함. 이건 안해도되긴함

 

 

# 6  이거 안풀어도댐! role rolebinding은 중요한데 유저만드는건 안나옴. mock exam3에 클러스터롤나옴! 글고 문제 풀어놔도 안풀렸다고 떠서 엄청 짜증남

john유저를 만들고 그 유저가 development ns에서 pod에 저런 권한만 주게 하라네

 

Certificates and Certificate Signing Requests

Kubernetes certificate and trust bundle APIs enable automation of X.509 credential provisioning by providing a programmatic interface for clients of the Kubernetes API to request and obtain X.509 certificates from a Certificate Authority (CA). There is als

kubernetes.io

일단 csr파일이 있으니까 유저 등록하는걸 보자

csr 인코딩 부분부터 해보면,

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

그리고 csr yaml파일 만들면

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

참고로 request 필드에 아까 저 인코딩 문자 넣어줘야함.

 

kubectl apply -f 6.yaml

john유저가 잘 만들어 졌음.

 

 

kubectl certificate approve john

pending상태인걸 풀어주면

승인된 유저가 되었음.

 

 

 

시발 문제 좆같네. 뭐지? 롤이름 따로안적어줘서 맘대로 만들었더만 틀렸다취급하네 ㅅㅂ

 

 

 

# 7

pod랑 svc를 만들고 busybox 파드에서 각각에 대한 nslookup명령어를 치고 로그를 파일로 저장하라고 함

dns문제임

 

DNS for Services and Pods

Your workload can discover Services within your cluster using DNS; this page explains how that works.

kubernetes.io

kubectl run nginx-resolver --image nginx

 

kubectl expose pod nginx-resolver --name nginx-resolver-service --port 80 --target-port 80

 

pod랑 svc각각 만들어줌

resolver pod ip 주소 확인

 

 

kubectl run test-ns --image busybox:1.28 --command -- sleep 10000

busy box pod를 test-ns라는 이름으로 만들어줌. 나중에 삭제할 예정.

참고로 busy box이미지는 슬립커맨드 안쳐주면 바로 job처럼 꺼지더라.

kubectl exec test-ns -it -- /bin/sh

그리고 만든 test-ns pod에 커맨드 접속

 

cat /etc/resolv.conf

로 확인해보면

이렇게 네임서버 잘 되어있음

저기 default.svc.cluster.local 저걸 잘 기억해두자

이제 nslookup 명령어를 칠건데, pod는 양식이 이렇다.

아까 resolver pod가 10-244-192-1아이피였음.

nslookup 10-244-192-1.default.pod.cluster.local

이명령어 쳐주면 됨

 

서비스는 이런데

서비스 아이피로는 안되더라? 내가 잘못적었는지는 모르겠는데 

그냥 서비스 이름 갖다 넣으샘

nslookup nginx-resolver-service.default.svc.cluster.local

잘 떠왔음.

 

이제 exit으로 나가고

문제 파일경로에 내용 넣어주면 끝

 

 

따배씨 / dns

Introductionk8s의 dns에 대해서 포스팅하려고한다.CKA준비하는 포스팅인데 계속 엘리스의 토끼굴에 빠지게됨 ㅡㅡ# k8s의 dns 구성k8s클러스터에서는 이렇게 서비스에 연결된 pod형식으로 dns서버역할을

jacobowl.tistory.com

내 dns포스팅임

 

 

 

 

 

# 8

node01에 static pod를 만들라고함

일단 yaml부터 따오면, 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-critical
spec:
  containers:
  - image: nginx
    name: nginx-critical

 

node목록 확인

ssh 접속은 저 NAME으로 해야함

ssh node01

 

vi /etc/kubernetes/manifests/8.yaml

static pod경로에 8.yaml파일 생성

pod양식 넣고 확인

exit

ssh 나오고,

node01에서 static pod가 잘 동작하는걸 확인

 

- 검토

지웠다 삭제하면 다시 생길거

pending이었다가 다시 running됐음

 

근데 deployment는 왜 터진거지? 걍지웠다 새로만드니 잘됨