이번 게시글에선 CKA 모의고사 1번 시험을 풀어보고 풀이를 리뷰하도록 하겠습니다. 이전 포스팅이나 자료같은 건 참고 할 수 없으며 참고할 수 있는 페이지는 kubernetes.io docs만 가능 합니다.
<Weight: 6>
내 풀이
kubectl create deployment --image=nginx:alpine nginx-pod
<Weight: 8>
내 풀이
kubectl run --image=redis:alpine messaging -l tier=msg
<Weight: 4>
내 풀이
k create ns apx-x9984574
<Weight: 7>
내 풀이
k get nodes -o json > /opt/outputs/nodes-z3444kd9.json
<Weight: 12>
내 풀이
apiVersion: v1
kind: Service
metadata:
name: messaging-service
spec:
selector:
tier: msg
ports:
- protocol: TCP
port: 6379
targetPort: 6379
<Weight: 11>
내 풀이
k create deployment --image=kodekloud/webapp-color hr-web-app --replicas=2
<Weight: 8>
내 풀이
/etc/kubernetes/manifests
apiVersion: v1
kind: Pod
metadata:
name: static-busybox
spec:
containers:
- name: web
image: busybox
command: ["sleep", "1000"]
<Weight: 12>
내 풀이
run --image=redis:alpine temp-bus --namespace=finance
<Weight: 8>
pod yaml에 오타가 있어서 수정함
<Weight: 10>
내 풀이
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>
뭔 말 인지 잘 모르겠음.
<Weight: 8>
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
<Weight: 10>
혹시나 먼저 자동완성이 되지 않는다면 다음의 명령어를 붙여넣어주자.
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>
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>
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>
일단 제공해준 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>
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>
일단 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>
일단 지문에 따라 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>
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