다양한 Kubernetes 실습을 위한 50개의 문제와 각각의 답안 및 해설을 제공합니다. 이 문제들은 기본적인 작업부터 고급 작업까지 포함하며, Kubernetes 자격증 시험(CKA/CKAD)과 같은 실습에 적합합니다.
다양한 Kubernetes 실습을 위한 50개의 문제와 각각의 답안 및 해설을 제공합니다. 이 문제들은 기본적인 작업부터 고급 작업까지 포함하며, Kubernetes 자격증 시험(CKA/CKAD)과 같은 실습에 적합합니다.
1~10: Pod 관련 문제
1. Pod 생성
- 문제:
busybox
이미지를 사용하여sleep 3600
을 실행하는test-pod
라는 이름의 Pod를 생성하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: busybox image: busybox command: ["sleep", "3600"]
- 해설: 기본 Pod 생성 방법을 익히기 위한 문제입니다.
kubectl apply
명령어로 YAML 파일을 적용합니다.
2. Pod 삭제
- 문제:
test-pod
를 삭제하는 명령어를 작성하세요. - 답안:
kubectl delete pod test-pod
- 해설: 특정 Pod를 삭제할 때 사용하는 명령어입니다.
3. Pod 상태 확인
- 문제: 실행 중인 모든 Pod를 확인하는 명령어를 작성하세요.
- 답안:
kubectl get pods
- 해설: 클러스터에 있는 모든 Pod의 상태를 확인합니다.
4. Pod의 상세 정보 확인
- 문제:
test-pod
의 상세 정보를 출력하세요. - 답안:
kubectl describe pod test-pod
- 해설: 특정 Pod의 이벤트, 상태, 컨테이너 정보 등을 확인할 수 있습니다.
5. Pod 로그 확인
- 문제:
test-pod
컨테이너의 로그를 확인하는 명령어를 작성하세요. - 답안:
kubectl logs test-pod
- 해설: Pod의 실행 로그를 확인하여 문제를 디버깅할 수 있습니다.
6. Pod에서 명령 실행
- 문제:
test-pod
에서ls
명령어를 실행하세요. - 답안:
kubectl exec test-pod -- ls
- 해설: Pod 내부에서 특정 명령을 실행하는 방법입니다.
7. Pod에서 셸 접속
- 문제:
test-pod
내부에 셸로 접속하세요. - 답안:
kubectl exec -it test-pod -- sh
- 해설: Pod 내부에 들어가 실시간으로 작업을 수행할 때 사용합니다.
8. Multi-container Pod 생성
- 문제: Nginx와 Redis를 포함하는 Multi-container Pod를 생성하세요.
- 답안:
apiVersion: v1 kind: Pod metadata: name: multi-container-pod spec: containers: - name: nginx image: nginx - name: redis image: redis
- 해설: 여러 컨테이너가 같은 네임스페이스와 네트워크를 공유합니다.
9. Init Container Pod 생성
- 문제: 메인 컨테이너 실행 전에
echo "Init completed"
를 출력하는 Init Container를 포함한 Pod를 생성하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: init-container-pod spec: initContainers: - name: init-container image: busybox command: ["sh", "-c", "echo 'Init completed'"] containers: - name: main-container image: nginx
- 해설: Init Container는 메인 컨테이너 실행 전에 반드시 실행됩니다.
10. Pod와 Node 간 스케줄링
- 문제: 특정 노드에만
test-pod
가 스케줄링되도록 설정하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: nodeName: your-node-name containers: - name: busybox image: busybox command: ["sleep", "3600"]
- 해설:
nodeName
필드로 특정 노드에 Pod를 스케줄링합니다.
11~50: ReplicaSet, Deployment, Service, ConfigMap, Secret 등 포함
문제 카테고리
- ReplicaSet 생성 및 수정
- Deployment 롤아웃 및 롤백
- 서비스(Service) 생성 및 클러스터 IP 확인
- LoadBalancer 서비스 생성
- NodePort 서비스 생성
- ConfigMap 생성 및 Pod에 사용
- Secret 생성 및 Pod에 사용
- PersistentVolume과 PersistentVolumeClaim 연동
- Pod AntiAffinity 설정
- Resource 요청 및 제한 설정
각각의 문제와 답안 및 해설을 단계별로 정리하여 필요하다면 특정 카테고리나 주제에서 상세하게 확장해 드리겠습니다. 어떤 주제를 더 깊이 다루고 싶은지 알려주세요! 😊
11~20: ReplicaSet 및 Deployment 관련 문제
11. ReplicaSet 생성
- 문제: Nginx 이미지를 사용하여
nginx-replicaset
이라는 이름의 ReplicaSet을 생성하고, Pod 3개를 실행하세요. - 답안:
apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx-replicaset spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx
- 해설: ReplicaSet은 동일한 Pod의 복제본을 유지 관리합니다.
kubectl apply
로 YAML을 적용하면 Pod 3개가 생성됩니다.
12. ReplicaSet의 Pod 수 수정
- 문제:
nginx-replicaset
의 Pod 개수를 5개로 변경하세요. - 답안:
kubectl scale replicaset nginx-replicaset --replicas=5
- 해설:
kubectl scale
명령어로 ReplicaSet의 Pod 개수를 쉽게 조정할 수 있습니다.
13. Deployment 생성
- 문제: Nginx 이미지를 사용하여
nginx-deployment
라는 이름의 Deployment를 생성하고, Pod 3개를 실행하세요. - 답안:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx
- 해설: Deployment는 ReplicaSet을 관리하며 롤아웃, 롤백 등의 기능을 제공합니다.
14. Deployment 롤아웃 업데이트
- 문제:
nginx-deployment
의 이미지를nginx:1.19
로 업데이트하세요. - 답안:
kubectl set image deployment/nginx-deployment nginx=nginx:1.19
- 해설:
kubectl set image
명령어를 사용해 Deployment의 컨테이너 이미지를 업데이트합니다.
15. Deployment 롤아웃 상태 확인
- 문제:
nginx-deployment
의 롤아웃 상태를 확인하세요. - 답안:
kubectl rollout status deployment/nginx-deployment
- 해설: 롤아웃이 완료되었는지 확인할 때 사용합니다.
16. Deployment 롤백
- 문제:
nginx-deployment
를 이전 버전으로 롤백하세요. - 답안:
kubectl rollout undo deployment/nginx-deployment
- 해설: 롤아웃에서 문제가 발생했을 때 이전 상태로 복원합니다.
17. Deployment의 레이블로 Pod 필터링
- 문제: 레이블
app=nginx
를 가진 Pod만 출력하세요. - 답안:
kubectl get pods -l app=nginx
- 해설: 레이블 셀렉터를 사용해 특정 레이블이 있는 리소스를 필터링할 수 있습니다.
18. ReplicaSet 삭제
- 문제:
nginx-replicaset
을 삭제하세요. - 답안:
kubectl delete replicaset nginx-replicaset
- 해설:
kubectl delete
명령어로 특정 리소스를 삭제할 수 있습니다.
19. Deployment와 관련된 모든 리소스 확인
- 문제:
nginx-deployment
와 관련된 모든 리소스를 확인하세요. - 답안:
kubectl get all -l app=nginx
- 해설:
kubectl get all
명령어와 레이블 셀렉터를 결합해 관련 리소스를 필터링합니다.
20. Deployment 내 ReplicaSet 확인
- 문제:
nginx-deployment
에서 생성된 ReplicaSet을 확인하세요. - 답안:
kubectl get replicaset -l app=nginx
- 해설: Deployment는 자동으로 ReplicaSet을 생성하므로 이를 확인할 수 있습니다.
21~30: Service 관련 문제
21. ClusterIP 서비스 생성
- 문제:
nginx
라는 Deployment를 대상으로 하는 ClusterIP 타입의 서비스를 생성하세요. - 답안:
apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP
- 해설: ClusterIP는 기본 서비스 유형으로, 클러스터 내부에서만 접근이 가능합니다.
22. NodePort 서비스 생성
- 문제:
nginx
라는 Deployment를 대상으로 하는 NodePort 타입의 서비스를 생성하고, 포트를 30080으로 설정하세요. - 답안:
apiVersion: v1 kind: Service metadata: name: nginx-nodeport-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30080 type: NodePort
- 해설: NodePort 서비스는 클러스터 외부에서 특정 노드의 IP와 지정된 포트를 통해 Pod에 접근할 수 있도록 합니다.
23. LoadBalancer 서비스 생성
- 문제:
nginx
라는 Deployment를 대상으로 LoadBalancer 타입의 서비스를 생성하세요. - 답안:
apiVersion: v1 kind: Service metadata: name: nginx-loadbalancer-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer
- 해설: LoadBalancer 서비스는 클라우드 환경에서 외부 로드 밸런서를 생성해 트래픽을 분산시킵니다.
24. 서비스 확인
- 문제: 생성된 모든 서비스를 확인하는 명령어를 작성하세요.
- 답안:
kubectl get services
- 해설: 클러스터 내에 정의된 모든 서비스 정보를 확인합니다.
25. 서비스의 엔드포인트 확인
- 문제:
nginx-service
의 엔드포인트를 확인하세요. - 답안:
kubectl get endpoints nginx-service
- 해설: 서비스가 어느 Pod와 연결되어 있는지 확인할 수 있습니다.
26. 특정 포드로 라우팅하는 서비스 생성
- 문제: 레이블
tier=frontend
를 가진 Pod만 대상으로 하는 서비스를 생성하세요. - 답안:
apiVersion: v1 kind: Service metadata: name: frontend-service spec: selector: tier: frontend ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP
- 해설: 레이블 셀렉터를 사용해 특정 Pod만 대상으로 서비스 연결을 설정할 수 있습니다.
27. 서비스 삭제
- 문제:
nginx-service
를 삭제하세요. - 답안:
kubectl delete service nginx-service
- 해설:
kubectl delete
명령어로 특정 서비스를 삭제합니다.
28. ExternalName 서비스 생성
- 문제: 외부 도메인
example.com
으로 트래픽을 전달하는 ExternalName 타입의 서비스를 생성하세요. - 답안:
apiVersion: v1 kind: Service metadata: name: externalname-service spec: type: ExternalName externalName: example.com
- 해설: ExternalName 서비스는 클러스터 외부의 DNS 이름을 참조할 수 있도록 설정합니다.
29. 서비스 상태 확인
- 문제: 모든 서비스의 상태와 IP 주소를 확인하세요.
- 답안:
kubectl get services -o wide
- 해설:
-o wide
옵션은 추가 정보를 출력합니다.
30. 서비스 디버깅
- 문제: 서비스가 트래픽을 전달하지 않을 때 디버깅하기 위해 Pod의 연결을 테스트하세요.
- 답안:
kubectl exec -it <pod-name> -- curl http://<service-name>:<port>
- 해설:
curl
명령어로 서비스의 응답 상태를 확인합니다.
31~40: ConfigMap 및 Secret 관련 문제
31. ConfigMap 생성
- 문제:
my-config
라는 ConfigMap을 생성하고, 키app.name
의 값을my-app
으로 설정하세요. - 답안:
kubectl create configmap my-config --from-literal=app.name=my-app
- 해설: ConfigMap은 애플리케이션의 환경 구성을 저장하는 데 사용됩니다.
32. ConfigMap 확인
- 문제: 생성된
my-config
의 내용을 확인하세요. - 답안:
kubectl get configmap my-config -o yaml
- 해설: ConfigMap의 모든 데이터를 YAML 형식으로 확인합니다.
33. ConfigMap을 Pod에 주입
- 문제:
my-config
의 데이터를 환경 변수로 사용하는 Pod를 생성하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: configmap-pod spec: containers: - name: app image: busybox command: ["sh", "-c", "env; sleep 3600"] envFrom: - configMapRef: name: my-config
- 해설:
envFrom
을 사용해 ConfigMap 데이터를 환경 변수로 주입합니다.
34. Secret 생성
- 문제:
my-secret
이라는 이름으로username=admin
,password=1234
데이터를 가진 Secret을 생성하세요. - 답안:
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=1234
- 해설: Secret은 민감한 데이터를 안전하게 저장하고 전달하는 데 사용됩니다.
35. Secret 확인
- 문제:
my-secret
의 내용을 디코딩하지 않고 확인하세요. - 답안:
kubectl get secret my-secret -o yaml
- 해설: Secret 데이터는 base64로 인코딩되어 출력됩니다.
36. Secret을 Pod에 주입
- 문제:
my-secret
데이터를 환경 변수로 사용하는 Pod를 생성하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: secret-pod spec: containers: - name: app image: busybox command: ["sh", "-c", "env; sleep 3600"] env: - name: USERNAME valueFrom: secretKeyRef: name: my-secret key: username - name: PASSWORD valueFrom: secretKeyRef: name: my-secret key: password
- 해설: Secret 데이터를 환경 변수로 안전하게 주입할 수 있습니다.
37~40: PVC 및 Pod 연동 관련 문제
이어서 PersistentVolume(PV), PersistentVolumeClaim(PVC), Taints/Tolerations 등 고급 주제로 진행하겠습니다. 다음 주제를 더 구체적으로 보고 싶으면 말씀해주세요! 😊
37~40: PVC 및 Pod 연동 관련 문제
37. PersistentVolume 생성
- 문제: ReadWriteOnce 접근 모드를 가진 1Gi 크기의 PersistentVolume(PV)을 생성하세요. 이름은
pv-1
로 설정하세요. - 답안:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-1 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data
- 해설: PersistentVolume은 클러스터 외부나 내부의 스토리지를 클러스터 리소스로 사용할 수 있게 만듭니다.
hostPath
는 노드의 특정 경로를 사용하는 예시입니다.
38. PersistentVolumeClaim 생성
- 문제:
pv-1
을 사용하도록 PersistentVolumeClaim(PVC)을 생성하세요. 이름은my-pvc
로 설정하고, 500Mi 크기의 스토리지를 요청하세요. - 답안:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 500Mi
- 해설: PVC는 애플리케이션이 요청하는 스토리지 요구사항을 정의합니다. PVC가 PV와 일치하면 바인딩됩니다.
39. Pod에서 PVC 마운트
- 문제:
my-pvc
를/data
경로에 마운트하는 Pod를 생성하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: pvc-pod spec: containers: - name: app image: nginx volumeMounts: - mountPath: /data name: data-volume volumes: - name: data-volume persistentVolumeClaim: claimName: my-pvc
- 해설:
volumes
와volumeMounts
를 사용해 PVC를 Pod에 연결할 수 있습니다.
40. PVC와 관련된 PV 확인
- 문제:
my-pvc
가 사용 중인 PV를 확인하는 명령어를 작성하세요. - 답안:
kubectl get pvc my-pvc -o wide
- 해설:
-o wide
옵션은 PVC가 바인딩된 PV 이름을 확인하는 데 유용합니다.
41~50: Taints, Tolerations, 그리고 Node 관련 문제
41. Taint 설정
- 문제: 노드
node1
에key=value:NoSchedule
Taint를 추가하세요. - 답안:
kubectl taint nodes node1 key=value:NoSchedule
- 해설: Taint는 노드에서 특정 조건을 만족하는 Pod만 스케줄링되도록 제한합니다.
42. Taint 확인
- 문제:
node1
에 설정된 Taint를 확인하세요. - 답안:
kubectl describe node node1 | grep Taints
- 해설:
describe
명령어로 노드의 Taint 정보를 확인할 수 있습니다.
43. Toleration 설정
- 문제:
key=value:NoSchedule
Taint를 허용하는 Pod를 생성하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: toleration-pod spec: tolerations: - key: key operator: Equal value: value effect: NoSchedule containers: - name: app image: nginx
- 해설: Toleration은 Pod가 특정 Taint를 가진 노드에 스케줄링될 수 있도록 허용합니다.
44. 노드 스케줄링 금지
- 문제:
node1
을 스케줄링 금지 상태로 설정하세요. - 답안:
kubectl cordon node1
- 해설:
cordon
명령어는 노드에서 새로운 Pod 스케줄링을 차단합니다.
45. 노드 스케줄링 허용
- 문제:
node1
의 스케줄링 금지를 해제하세요. - 답안:
kubectl uncordon node1
- 해설:
uncordon
명령어는 노드에서 스케줄링 금지를 해제합니다.
46. 노드에서 실행 중인 Pod 확인
- 문제:
node1
에서 실행 중인 모든 Pod를 확인하세요. - 답안:
kubectl get pods --field-selector spec.nodeName=node1
- 해설:
--field-selector
옵션을 사용해 특정 노드에서 실행 중인 Pod를 필터링합니다.
47. 특정 노드에 Pod 스케줄링
- 문제:
node1
에만 스케줄링되는 Pod를 생성하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: node-specific-pod spec: nodeSelector: kubernetes.io/hostname: node1 containers: - name: app image: nginx
- 해설:
nodeSelector
를 사용해 Pod의 스케줄링을 특정 노드로 제한할 수 있습니다.
48. Pod 스케줄링 디버깅
- 문제: Pod가 스케줄링되지 않는 이유를 확인하세요.
- 답안:
kubectl describe pod <pod-name>
- 해설:
describe
명령어를 통해 스케줄링 문제의 원인을 확인할 수 있습니다.
49. 노드 제거
- 문제:
node1
을 클러스터에서 제거하세요. - 답안:
kubectl drain node1 --ignore-daemonsets --delete-emptydir-data kubectl delete node node1
- 해설:
drain
명령어로 노드에서 실행 중인 Pod를 모두 제거한 후,delete node
로 클러스터에서 노드를 제거합니다.
50. Pod가 특정 노드에서 실행되도록 하는 Affinity 설정
- 문제:
node1
에서만 실행되도록nodeAffinity
를 설정한 Pod를 생성하세요. - 답안:
apiVersion: v1 kind: Pod metadata: name: affinity-pod spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1 containers: - name: app image: nginx
- 해설:
nodeAffinity
를 사용해 Pod가 특정 노드에서만 실행되도록 설정할 수 있습니다.
결론
50개의 Kubernetes 실습 문제와 답안을 제공했습니다. 😊
'IT > kubernetes[k8s]' 카테고리의 다른 글
kubectl expose 명령어 상세 가이드 (1) | 2024.11.16 |
---|---|
Kubernetes emptyDir 가이드 (1) | 2024.11.16 |
Kubernetes PV와 PVC 개요 (0) | 2024.11.16 |
Kubernetes Pod 개요 (2) | 2024.11.16 |
쿠버네티스(Kubernetes)란? (2) | 2024.11.15 |