Practice Test / Core Concept
POD
Summary
- 6번 / 멀티컨테이너 파드. describe으로 보면댐
- 9번 / pod에러는 describe해서 event보면댐
- 13번 / 이미지 에러뜬거 yaml수정하고 apply안되고 edit으로 고쳐야함
- vim에디터 줄 끝 $
# kodekloud
https://identity.kodekloud.com/sign-in?redirect_uri=https%3A%2F%2Flearn.kodekloud.com%2Fuser%2Fcourses%2Fudemy-labs-certified-kubernetes-administrator-with-practice-tests%2Fmodule%2Fe6ae2f68-9b3a-439e-a534-d63d372840d2%2Flesson%2F5c388f3e-bd27-41bd-9c3c-613dafc29bf9
identity.kodekloud.com
# 1
파드가 지금 몇개 있냐는 거다.
kubectl get pods
아무것도 없다고 한다. 답은 0
# 2
nginx이미지로 pod를 하나 만들라고 한다.
Pods
Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run t
kubernetes.io
공식문서에서 pod yaml따오면 됨
vi ex2.yaml
이걸로 야믈 파일 만들어서
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
공식문서 yaml에서 nginx에 태그 떼서 저장
kubectl apply -f ex2.yaml
으로 생성하면 됨
kubectl run nginx --image=nginx
이건 그냥 run커맨드로 빨리 만들기.
# 3
지금 pod가 몇개냐고 함
네임스페이스는 안물어보네
kubectl get pods
총 4개네
# 4
새로운 pod에 어떤 이미지를 사용했냐고 함
저 new pods에 이미지 물어보는듯
kubectl describe pod newpod머쩌구 | grep image
busybox를 썼다고 함.
# 5
어떤 노드에 pod들이 있냐고 함
kubectl get pod -o wide
pod 네 개 모두 controlplane에만 있다고 함
# 6
얼마나 많은 컨테이너가 pod webapp에 있냐고 함
kubectl describe pod webapp
야믈양식으로 보면 nginx랑 agentx컨테이너 두개가 있는 pod임. infra까지하면 세개이긴 한데..
# 7
webapp pod에서 어떤 이미지를 사용헀냐고 함.
6번문항보면 nginx랑 agentx두개 썼네
# 8
지금 webapp pod가 무슨 상태냐고 함
kubectl get pods
imagepullbackoff상태네
레디보면 컨테이너가 한개만 생성되고 하나에서 오류뜬듯?
도커헙에서 이미지 못가져와서 그런거임.
# 9
왜 webapp pod의 agentx컨테이너는 에러떴냐는거임.
도커헙에 이미지 없으니까..
근데 솔루션에서는 describe쳐보라길래 쳐봤음
agentx:latest이미지가 도커헙에 없다고 함.
# 9
kubectl get pods하면 나오는 출력에서 ready컬럼은 뭘 의미하냐는 거임.
1/1, 1/2 이런거
1/1은 pod하나에 컨테이너 한개인 일반적인 pod이고, 1/2는 pod하나에 컨테이너 2개 들어있는 pod임
앞에숫자는 돌아가고있는 컨테이너고 뒤에 숫자는 총 컨테이너
# 11
webapp이라는 pod를 삭제하래.
kubectl delete pod webapp
# 12
redis123이미지를 사용해서 redis pod를 만들어보라네
공식문서에서 yaml따와서 이미지랑 이름 바꿔서 만들면 됨
이름은 pod이름이 redis니까 metadata부분으로 수정해야함
잘 만들어졌다.
이미지 풀 안된건 상관없음. 어쨋든 pod가 만들어진거니까.
kubectl run redis --image=redis123
이 커맨드로 그냥 만들어도 되고
# 13
아까 이미지 생성된걸 이미지 고쳐서 정상으로 만들란다.
kubectl get pod redis -o yaml > ex13.yaml
pod를 yaml형식으로 받고 이걸 ex13.yaml이란 파일에다가 넣음.
vi ex13.yaml
빔에디터로 보면
저기 이미지를 redis로 바꾸자.
해당 줄 젤끝으로가는 vim에디터 명령어는 $임니다.
암튼
저장하고,
kubectl apply -f ex13.yaml
으로 했지만?
에러 ㅡㅡ
yaml이 단순하니까 그냥 공식문서에서 따오고 apply 하거나,
kubectl edit pod redis
이걸로 고치면 됨.
edit은 에러 자주생겨서 apply 자주쓰는데 여긴 apply 가 에러생긴다.
끗
ReplicaSet
Summary
- 11번 / api version임. 공식문서 yaml보면 나옴. 컨트롤러(job뺴고)는 apps/1, 서비스랑 pod는 v1
- 12번 / 컨트롤러는 셀렉터랑 라벨링으로 컨트롤러가 관리할 pods들을 연결시켜줌
- 14번 / 컨트롤러를 edit으로 고쳐도 pod들에 적용이안됨. 컨트롤러는 죽은 pod들을 다시 살리니까 edit하고 pod들 죽이면 알아서 edit적용된 pod들을 만들어줌
- 15, 16번 / 스케일링
# 1
현재 pod가 몇개 있냐고하네
kubectl get pods
없대
# 2
default namespace에 레플리카셋이 얼마나 있냐고 함.
kubectl get replicaset.apps
얘도 없대
# 3
다시 레플리카셋 몇개녜
kubectl get replicaset.apps
한개 생김
옆에 desired current는 파드갯수
네개의 pod가 생김
# 4
새로 생긴 레플리카셋의 요구되는 pod개수는 몇개녜
아까 4개라고 함
# 5
저 레플리카셋의 pod에선 어떤 이미지를 사용했냐고 함.
kubectl describe replicasets.apps new-replica-set
이걸 보면
busybox777을 썼다고 함
# 6
저 레플리카셋의 얼마나 많은 pod들이 ready상태냐고 함
ready컬럼에 빵개
# 7
왜그러냐는데?
kubectl get pods
image pull back off 라고함
이미지 못받은거임.
kubectl describe pod new-replica-set-해시
이걸로 pod 자세히 event부분 보면
더 자세하게 나옴
# 8
pod하나 삭제해보래
kubectl delete pod new-replica-set-해시
# 9
이제 얼마나 많은 pod들이 있냐고 하네?
kubectl get pods
# 10
왜 삭제했는데 그대로 네개냐고 함
레플리카셋이 살렸겠지
근데 지울수 없다고 하는 선택지는 틀린게 아까 pod들 보면
저 AGE컬럼보면 새로 생긴 pod 생긴지 얼마나됐는지 나옴
즉 죽였다가 살린거임
# 11
새로운 replicaset을 yaml로 만들어보래
cd /root/
아예 그냥 cd로 옮겨감
ls
저 yaml로 만들어보라고 함
kubectl apply -f 야믈파일
안됐는데 문제에서 문제 수정해보라고 함
api버전이 잘못됐다고 함.
vi 파일이름
api version부분을 apps/v1으로 수정하샘
kubectl apply -f 파일이름
이제 잘 만들어짐.
api version은 쿠버네티스 리소스 관리하는건데 컨트롤러는 job종류 제외하고는 apps/v1임
pod나 service가 v1이고.
그냥 공식문서 뒤져보면 yaml양식에 나와있음.
ReplicaSet
A ReplicaSet's purpose is to maintain a stable set of replica Pods running at any given time. Usually, you define a Deployment and let that Deployment manage ReplicaSets automatically.
kubernetes.io
# 12
저 두번째 yaml파일로 만들어보고 문제 수정해보래.
kubectl apply -f 파일이름2
셀렉터가 라벨이랑 안맞는대
컨트롤러는 셀렉터랑 라벨링으로 컨트롤러가 관리하는 pod들을 이어주니까
yaml파일 다시 보자
vi 파일이름2
안맞네?
두개 똑같이 만들어주자
kubectl apply -f 파일이름2
# 13
레플리카셋 두개삭제
kubectl delete replicaset.apps 레플리카1 레플리카2
# 14
아까 이미지 오류떳던 new레플리카셋을 동작하게 수정하래.
kubectl edit replicaset.apps new-레플리카셋
이미지 이름 고쳐주고 저장
kubectl get pods
수정했는데 여전히 이미지 에러뜬 pod들이 있음
컨트롤러는 pod죽이면 새로만들어주니까 파드 삭제해보면 다시 생겨날거
kubectl delete pods --all
죽이니까 다시 살아난 pod들.
# 15
컨트롤러 스케일링 해보라는데?
kubectl scale replicaset new-replica-set --replicas 5
숫자 스케일링 잘 됐음.
edit으로도 될거같
스케일링에 대한 공식문서
kubectl scale
Synopsis Set a new size for a deployment, replica set, replication controller, or stateful set. Scale also allows users to specify one or more preconditions for the scale action. If --current-replicas or --resource-version is specified, it is validated bef
kubernetes.io
# 15
두개로 다시 스케일링 해보래
이번엔 edit으로 해보자
kubectl edit replicasets.apps 레플리카이름
replicas바꾸고 저장
pod보니까 다섯개중 3개 종료되고있음
Deployment
Summary
export samp="--dry-run=client -o yaml"
# 1
default 네임스페이스에 몇개의 pod가 있냐고함
# 2
레플리카셋은 몇개있냐고 함
kubectl get replicaset.apps
# 3
디플로이먼트는 몇개있냐고함
kubectl get deployment.app
# 4
이젠 deployment몇개냐고함
# 5
레플리카셋은 몇개냐고함
deployment가 생기면 replicaset도 생기니..
종속관계니까
# 6
지금 pod는 몇개녜
# 7
몇개의 pod가 ready 상태냐고함
# 8
저 deployment에서 pod들이 무슨 이미지를 사용했냐고함
kubectl describe deployments.apps frontend-deployment
# 9
왜 deployment가 ready가 아니냐고함
kubectl logs deployments/frontend-deployment
아니면 직접 pod를 봐서
kubectl describe pod frontend-deployment-6469748456-해시
이미지 에러 있다고 보면됨
# 10
저 yaml파일로 디플로이먼트를 만들어보라는데 에러있으면 고치래
kubectl apply -f 파일이름
에러뜨면서 안된대.
apiversion이 잘못된가 헀는데 job뺴고 컨트롤러는 apps/v1이 맞음.
공식문서 보면 됨.
Deployments
A Deployment manages a set of Pods to run an application workload, usually one that doesn't maintain state.
kubernetes.io
저기 자세히보면 "no kind deployment is registered for version apps/v1 머시기" 라고 있음
공식문서 yaml파일인데 kind부분이 대문자로 시작함
yaml파일에선 소문자임
대문자로 바꾸고 apply
vi 파일이름
kubectl apply -f 파일이름
# 11
저 조건으로 deployment를 만들어보라고함.
kubectl create deployment httpd-frontend --replicas 3 --image httpd:2.4-alpine
난 야믈로따서 apply로 만듬
kubectl create deployment httpd-frontend --replicas 3 --image httpd:2.4-alpine $samp>11.yaml
$samp는 따로 설정한거니까 조심!
kubectl apply -f 11.yaml
Namespaces
Summary
- 6번 / 같은 name space에 있는 pod와 서비스는 dns 서비스이름만으로 접근가능
- 6번 / dns이름 규칙 = <service>. <namespace>.svc.cluster.local
export samp="--dry-run=client -o yaml"
$samp붙은건 이 명령어로 약어만든거니까 주의
# 1
kubectl get namespaces
하나하나 장인정신으로 세보니 열개임
# 2
research namespace에는 몇개의 pod가 있냐고함
kubectl get pods -n research
# 3
finance ns에 pod 만들어보래
kubectl run redis --image redis -n finance $samp > 3
.yaml
kubectl apply -f 3.yaml
# 4
blue 파드는 어느 ns에 있냐고 함
kubectl get pods --all-namespaces |grep blue
컬럼 맨앞이 ns니까 marketing에 있음
# 5
blue 웹에 접근해보래. 난 exec쓰라는건줄..
kubectl describe pod blue -n marketing
또 난 접속하라길래 뭔가해서 저걸로 ip얻고 port 얻어서
curl 쳤음
curl 10.42.0.15:8080
나중에 알아서 위에 탭새로 뜨길래 눌러보니
여기로 들어가짐.
대충 curl쳤을떄 사이트 맞는거같음.
# 6
blue pod가 어떤 dns를 쓰고있냐고함.
사실 잘 이해가 안되는거긴 한데.. 기억도 잘 안나고..
일단 대충 생각해보자면,
DNS for Services and Pods
Your workload can discover Services within your cluster using DNS; this page explains how that works.
kubernetes.io
공식문서에 나온대로 blue pod로 해당 명령어 쳐보면
kubectl exec -it pods/blue -n marketing -- cat /etc/resolv.conf
marketing.svc.cluster.local로 dns서버되어있음.
굳이 저렇게 할필요는 없는게 양식이 정해져있음.
<namespace>.svc.cluster.local
my-svc.my-namespace.svc.cluster-domain.example
뭐 이런식이라니까 db-service.marketing.svc.cluster.local이렇겠지?
저걸 blue 웹에가서 6379포트로 쳐보면
근데 blue pod랑 db-service는 같은 name space에 있음
때문에 그냥 서비스 이름만 쳐줘도 됨

success가 뜸
개념공부할때 dns관리해주는 pod도 따로있던걸로 기억하는데..
# 7
아예 dns이름 풀로 물어봄.
위에서 이미 썼음. 다만 ns가 바뀌었으니 문제대로 dev로 바뀌어야함.
Service
Summary
- grep할때 대소문자 구분
- 대소문자 구분 안하려면 -i옵션 붙이샘
export samp="--dry-run=client -o yaml"
$samp붙은건 이 명령어로 약어만든거니까 주의
# 1
default ns에 서비스가 몇개있녜
kubectl get svc
# 3
kubernetes 서비스는 무슨타입이냐고 함
kubectl describe svc kubernetes
# 4
타겟포트는?
# 5
라벨은 몇개
# 6
엔드포인트 갯수는?
# 7
디플로이먼트는 몇개
kubectl get deployment.apps
# 8
deployment의 pod에서 사용한 이미지는 뭐녜
kubectl describe deployments.apps simple-webapp-deployment | grep -i image
# 10
이 서비스 만들래
문제에서 저 yaml파일은 걍 양식 다 있긴한데
공식문서에서 nodeport검색하면 댐
Service
Expose an application running in your cluster behind a single outward-facing endpoint, even when the workload is split across multiple backends.
kubernetes.io
잘 나와있음.
대충 쓰면
kubectl apply -f service-definition-1.yaml
Imperactive Commands
Summary
- 서비스만들때 대문자 ClusterIP로. 안써도 상관은 없음.
- 서비스는 pod나 deployment먼저 만들
export samp="--dry-run=client -o yaml"
export grep="grep -iC 3"
$samp, $grep붙은건 이 명령어로 약어만든거니까 주의
# 2
pod만들래
kubectl run nginx-pod --image nginx:alpine $samp>2.yaml
라벨링도 원래 붙었나 싶은데 뭐 쩃든..
kubectl apply -f 2.yaml
# 3
이 pod도 만들래
kubectl run redis --image redis:alpine --labels tier
=db $samp>3.yaml
kubectl apply -f 3.yaml
+라벨을 더 달려면 쉼표로 구분하면 된다.
kubectl run redis --image=redis:alpine --labels=tier=db,env=prod,app=cache
kubectl describe redis|$grep label
# 4
서비스를 만들라고 함.
kubectl expose pod redis --name=redis-service --port=6379 $samp > 4.yaml
expose가 만들어진 pod에 연결되는 서비스 만들어달라는거였구나..
pod가 없으면 에러뜸.
kubectl apply -f 4.yaml
# 5
deployment를 만들래.
kubectl create deployment webapp --image kodekloud/we
bapp-color --replicas 3 $samp>5.yaml
kubectl apply -f 5.yaml
# 6
pod를 만들래
kubectl run custom-nginx --image nginx --port 8080 $samp > 6.yaml
# 7
ns만들래
controlplane ~ ➜ kubectl create namespace dev-ns $samp > 7.yaml
controlplane ~ ➜ vi 7.yaml
# 8
deployment를 저 ns에다가 redis이미지 써서 만들고 레플리카는 2개 쓰라네.
kubectl create deployment redis-deploy --namespace dev-ns --image redis --replicas 2 $samp > 8.yaml
# 9
httpd파드를 httpd:alpine이미지로 만들고, ClusterIP타입 서비스를 만들어서 연결시키라고 함. 포트는 80이라고 함.
kubectl run httpd --image httpd:alpine $samp > 9-pod.yam
이걸로 pod만드샘
여기서 apply 때려주고
(안떄려주면 서비스만드는거에서 오류뜸)
이제 이 pod에 연결될 service를 만들어야함
kubectl expose pod httpd --name httpd --port 80 $samp > 9-svc.yaml
라벨링도 잘 맞춰져 있음.