다양한 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 등 포함

문제 카테고리

  1. ReplicaSet 생성 및 수정
  2. Deployment 롤아웃 및 롤백
  3. 서비스(Service) 생성 및 클러스터 IP 확인
  4. LoadBalancer 서비스 생성
  5. NodePort 서비스 생성
  6. ConfigMap 생성 및 Pod에 사용
  7. Secret 생성 및 Pod에 사용
  8. PersistentVolume과 PersistentVolumeClaim 연동
  9. Pod AntiAffinity 설정
  10. 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
  • 해설: volumesvolumeMounts를 사용해 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 설정

  • 문제: 노드 node1key=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

+ Recent posts