Mock Exam - 2
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는 왜 터진거지? 걍지웠다 새로만드니 잘됨