다양한 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

kubectl expose 명령어 상세 가이드

1. 기본 개념

kubectl expose는 Pod, Deployment, ReplicaSet, Service 등의 쿠버네티스 리소스를 외부에 노출시키는 명령어입니다.

2. 기본 문법

kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]

3. 주요 옵션

  • --port: 서비스가 노출할 포트
  • --target-port: 실제 애플리케이션이 실행되는 컨테이너 포트
  • --type: 서비스 타입 (ClusterIP, NodePort, LoadBalancer)
  • --name: 생성될 서비스의 이름
  • --protocol: 사용할 프로토콜 (TCP, UDP, SCTP)
  • --external-ip: 외부 IP 지정

4. 서비스 타입별 예제

4.1 ClusterIP 서비스 생성

# nginx 디플로이먼트 생성
kubectl create deployment nginx --image=nginx

# ClusterIP 서비스로 노출
kubectl expose deployment nginx --port=80 --target-port=80 --type=ClusterIP

# 생성된 서비스 확인
kubectl get svc nginx

4.2 NodePort 서비스 생성

# NodePort로 노출
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

# 생성된 서비스 확인 (30000-32767 범위의 포트가 자동 할당됨)
kubectl get svc nginx

4.3 LoadBalancer 서비스 생성

# LoadBalancer로 노출
kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer

# 생성된 서비스 확인
kubectl get svc nginx

5. 실제 사용 예제

5.1 여러 포트 노출

# multi-port-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        ports:
        - containerPort: 8080
        - containerPort: 8443
# 여러 포트를 가진 서비스 생성
kubectl expose deployment my-app --name=my-app-svc \
  --port=80,443 \
  --target-port=8080,8443 \
  --type=LoadBalancer

5.2 특정 레이블을 가진 Pod 노출

# 레이블을 지정하여 서비스 생성
kubectl expose pod my-pod --selector="app=my-app" --port=8080 --target-port=80

5.3 외부 IP를 지정한 서비스 생성

kubectl expose deployment nginx \
  --port=80 \
  --target-port=80 \
  --external-ip=203.0.113.10 \
  --type=LoadBalancer

6. 고급 사용 예제

6.1 세션 어피니티 설정

kubectl expose deployment nginx \
  --port=80 \
  --session-affinity=ClientIP \
  --type=LoadBalancer

6.2 커스텀 셀렉터 사용

kubectl expose deployment nginx \
  --port=80 \
  --selector='app=nginx,environment=prod' \
  --type=LoadBalancer

6.3 다중 프로토콜 서비스

# multi-protocol-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    port: 80
    targetPort: 8080
    protocol: TCP
  - name: udp
    port: 161
    targetPort: 161
    protocol: UDP
  type: LoadBalancer

7. 서비스 확인 및 디버깅

# 서비스 상세 정보 확인
kubectl describe service nginx

# 엔드포인트 확인
kubectl get endpoints nginx

# 서비스 연결 테스트
kubectl run test-pod --image=busybox -it --rm -- wget -qO- http://nginx

# 서비스 로그 확인
kubectl logs -l app=nginx

8. 주의사항

  1. LoadBalancer 타입은 클라우드 프로바이더가 지원하는 환경에서만 사용 가능
  2. NodePort는 보안상 프로덕션 환경에서는 권장되지 않음
  3. 외부 IP 지정은 클러스터 네트워크 정책에 따라 제한될 수 있음
  4. 포트 충돌에 주의 필요

'IT > kubernetes[k8s]' 카테고리의 다른 글

POD 실습 50 문제  (2) 2024.11.17
Kubernetes emptyDir 가이드  (1) 2024.11.16
Kubernetes PV와 PVC 개요  (0) 2024.11.16
Kubernetes Pod 개요  (2) 2024.11.16
쿠버네티스(Kubernetes)란?  (2) 2024.11.15

emptyDir의 용도와 사용 사례에 대해 상세히 설명해드리겠습니다.

Kubernetes emptyDir 가이드

emptyDir은 주로 임시 데이터 저장이나 Pod 내 컨테이너 간 데이터 공유가 필요한 경우에 사용됩니다. 특히 사이드카 패턴 구현이나 임시 작업 공간이 필요한 경우 유용합니다.

가장 대표적인 사용 사례는:

로그 수집기와 애플리케이션 간 로그 파일 공유
데이터 전처리나 임시 계산 결과 저장
멀티 컨테이너 Pod에서 컨테이너 간 데이터 공유
인메모리 캐시용 tmpfs 스토리지

emptyDir은 영구 저장소가 필요 없는 임시 데이터를 다룰 때 최적의 선택이 될 수 있습니다.

emptyDir이란?

  • Pod가 노드에 할당될 때 처음 생성되는 임시 볼륨
  • Pod가 해당 노드에서 실행되는 동안만 존재
  • Pod가 노드에서 제거되면 emptyDir의 데이터도 영구적으로 삭제됨
  • 기본적으로 노드의 디스크를 사용하지만, tmpfs(메모리 기반 파일시스템)로도 사용 가능

주요 사용 사례

  1. 사이드카 컨테이너와 메인 컨테이너 간 데이터 공유

    apiVersion: v1
    kind: Pod
    metadata:
    name: log-aggregator
    spec:
    containers:
    - name: app
     image: app-image
     volumeMounts:
     - name: log-storage
       mountPath: /var/log/app
    - name: log-aggregator
     image: log-aggregator-image
     volumeMounts:
     - name: log-storage
       mountPath: /var/log/app
    volumes:
    - name: log-storage
     emptyDir: {}
  2. 임시 작업 공간으로 사용

    apiVersion: v1
    kind: Pod
    metadata:
    name: data-processor
    spec:
    containers:
    - name: processor
     image: data-processor
     volumeMounts:
     - name: workspace
       mountPath: /workspace
    volumes:
    - name: workspace
     emptyDir: {}
  3. 체크포인트 저장 및 복구

    apiVersion: v1
    kind: Pod
    metadata:
    name: computation-pod
    spec:
    containers:
    - name: compute
     image: compute-image
     volumeMounts:
     - name: checkpoint-store
       mountPath: /checkpoint
    volumes:
    - name: checkpoint-store
     emptyDir: {}
  4. 멀티 컨테이너 간 캐시 공유

    apiVersion: v1
    kind: Pod
    metadata:
    name: cache-share-pod
    spec:
    containers:
    - name: cache-writer
     image: cache-writer
     volumeMounts:
     - name: shared-cache
       mountPath: /cache
    - name: cache-reader
     image: cache-reader
     volumeMounts:
     - name: shared-cache
       mountPath: /cache
    volumes:
    - name: shared-cache
     emptyDir: {}
  5. 메모리 기반 임시 스토리지(tmpfs)

    apiVersion: v1
    kind: Pod
    metadata:
    name: memory-cache
    spec:
    containers:
    - name: cache
     image: cache-image
     volumeMounts:
     - name: cache-volume
       mountPath: /cache
    volumes:
    - name: cache-volume
     emptyDir:
       medium: Memory
       sizeLimit: 1Gi

emptyDir 사용이 적합한 경우

  1. 임시 데이터 처리

    • 대용량 데이터 정렬/처리
    • 임시 파일 생성 및 처리
    • 중간 결과물 저장
  2. 컨테이너 간 데이터 공유

    • 로그 수집기와 애플리케이션
    • 프록시와 메인 애플리케이션
    • 사이드카 패턴 구현
  3. 캐시 데이터

    • 애플리케이션 캐시
    • 임시 계산 결과
    • 세션 데이터
  4. 체크포인트

    • 장시간 실행 작업의 중간 상태 저장
    • 복구 지점 생성

주의사항

  1. Pod가 재시작되면 데이터가 유지되지만, Pod가 삭제되면 데이터도 함께 삭제됨
  2. 노드 장애 시 데이터 손실 가능
  3. 여러 노드에서 공유할 수 없음
  4. 용량 제한 설정 가능 (sizeLimit 옵션 사용)

emptyDir은 주로 임시 데이터 저장이나 Pod 내 컨테이너 간 데이터 공유가 필요한 경우에 사용됩니다. 특히 사이드카 패턴 구현이나 임시 작업 공간이 필요한 경우 유용합니다.

가장 대표적인 사용 사례는:

  1. 로그 수집기와 애플리케이션 간 로그 파일 공유
  2. 데이터 전처리나 임시 계산 결과 저장
  3. 멀티 컨테이너 Pod에서 컨테이너 간 데이터 공유
  4. 인메모리 캐시용 tmpfs 스토리지

emptyDir은 영구 저장소가 필요 없는 임시 데이터를 다룰 때 최적의 선택이 될 수 있습니다. 더 자세한 사용 사례나 구체적인 예제가 필요하시다면 말씀해 주세요.

'IT > kubernetes[k8s]' 카테고리의 다른 글

POD 실습 50 문제  (2) 2024.11.17
kubectl expose 명령어 상세 가이드  (1) 2024.11.16
Kubernetes PV와 PVC 개요  (0) 2024.11.16
Kubernetes Pod 개요  (2) 2024.11.16
쿠버네티스(Kubernetes)란?  (2) 2024.11.15

Kubernetes PV와 PVC 개요

PV(Persistent Volume)

  • 클러스터 관리자가 프로비저닝한 스토리지 볼륨
  • Pod에 영구적인 스토리지를 제공
  • NFS, iSCSI, AWS EBS, GCP PD 등 다양한 유형의 스토리지 지원
  • 클러스터 수준에서 정의되며, 네임스페이스를 가지지 않음

PVC(Persistent Volume Claim)

  • 사용자(개발자)가 요청하는 스토리지 볼륨
  • 필요한 스토리지 용량과 접근 모드 지정
  • PV와 바인딩되어 Pod에 마운트됨
  • 네임스페이스 수준에서 정의

PV와 PVC의 관계

  1. 클러스터 관리자가 PV를 프로비저닝
  2. 사용자가 PVC를 생성하여 PV 요청
  3. 쿠버네티스가 PVC와 적절한 PV를 자동으로 바인딩
  4. Pod에서 PVC를 마운트하여 영구 스토리지 사용

PV 유형

  • 정적 프로비저닝: 미리 PV를 준비해 놓음
  • 동적 프로비저닝: PVC 요청 시 PV를 자동으로 생성

PV/PVC 생성 예시

# PV 정의
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: /data/my-pv

# PVC 정의  
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

PV/PVC 사용 예시

# Pod에서 PVC 사용
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: app-image
    volumeMounts:
    - name: app-storage
      mountPath: /app/data
  volumes:
  - name: app-storage
    persistentVolumeClaim:
      claimName: my-pvc

'IT > kubernetes[k8s]' 카테고리의 다른 글

kubectl expose 명령어 상세 가이드  (1) 2024.11.16
Kubernetes emptyDir 가이드  (1) 2024.11.16
Kubernetes Pod 개요  (2) 2024.11.16
쿠버네티스(Kubernetes)란?  (2) 2024.11.15
쿠버네티스 기본 명령어 모음  (0) 2024.11.15

Kubernetes Pod 개요

Pod란?

  • 쿠버네티스에서 가장 작은 배포 단위
  • 하나 이상의 컨테이너로 구성
  • 컨테이너들은 shared network, storage, 실행 환경을 공유
  • 단일 인스턴스로 관리되며 함께 스케일링됨

Pod의 주요 특징

  • 단일 엔터티: 구성 요소 컨테이너들이 함께 생성, 스케일링, 배포됨
  • 공유 네트워크: 같은 Pod 내 컨테이너는 localhost를 통해 통신 가능
  • 공유 스토리지: 볼륨을 통해 데이터를 공유할 수 있음
  • 리소스 공유: CPU, 메모리 등의 리소스를 공유하여 효율적 사용 가능
  • 단일 라이프사이클: Pod 내 컨테이너는 함께 생성, 배포, 종료됨

Pod 생성 방법

  • 직접 Pod 생성: kubectl run 또는 YAML 파일 적용
  • 선언적 Pod 관리: Deployment, ReplicaSet 등의 컨트롤러를 통해 관리

Pod 관리 명령어

# Pod 목록 조회
kubectl get pods
kubectl get po -o wide

# Pod 상세 정보 확인
kubectl describe pod [pod-name]

# Pod 로그 확인
kubectl logs [pod-name]
kubectl logs -f [pod-name]  # 실시간 로그
kubectl logs --tail=100 [pod-name]  # 마지막 100줄

# Pod 내부 접속
kubectl exec -it [pod-name] -- /bin/bash

# Pod 생성
kubectl run nginx --image=nginx
kubectl run nginx --image=nginx --port=80

# Pod 삭제
kubectl delete pod [pod-name]
kubectl delete pod --all

Pod 설계 시 고려사항

  • 단일 책임 원칙 (Single Responsibility Principle)
  • 컨테이너 간 결합도 최소화
  • 상태 데이터는 볼륨 등을 통해 관리
  • 프로세스 간 통신은 환경 변수, 볼륨 등으로 처리
  • 리소스 사용량을 예측하고 제한 설정

'IT > kubernetes[k8s]' 카테고리의 다른 글

Kubernetes emptyDir 가이드  (1) 2024.11.16
Kubernetes PV와 PVC 개요  (0) 2024.11.16
쿠버네티스(Kubernetes)란?  (2) 2024.11.15
쿠버네티스 기본 명령어 모음  (0) 2024.11.15
Taints와 Tolerations  (1) 2024.11.15

쿠버네티스(Kubernetes)에 대해 핵심적인 내용을 정리해드리겠습니다.

  1. 쿠버네티스란?
  • 컨테이너화된 애플리케이션의 자동 배포, 스케일링, 관리를 위한 오픈소스 플랫폼
  • 구글이 개발했으며 현재는 CNCF(Cloud Native Computing Foundation)에서 관리
  • 컨테이너 오케스트레이션의 사실상 표준(De facto standard)
  1. 주요 특징
  • 자동화된 복구(Self-healing)
  • 수평적 확장(Horizontal scaling)
  • 자동화된 롤아웃과 롤백
  • 서비스 디스커버리와 로드 밸런싱
  • 자동화된 빈 패킹(bin packing)
  • 시크릿과 구성 관리
  1. 핵심 구성 요소

컨트롤 플레인 컴포넌트:

  • kube-apiserver: API 서버, 클러스터의 게이트웨이
  • etcd: 클러스터의 데이터베이스
  • kube-scheduler: 새로운 파드 배치 담당
  • kube-controller-manager: 컨트롤러 실행 관리

노드 컴포넌트:

  • kubelet: 각 노드에서 실행되는 에이전트
  • kube-proxy: 네트워크 규칙과 포워딩 담당
  • 컨테이너 런타임: 컨테이너 실행 환경
  1. 주요 개념

    Pod: 가장 작은 배포 단위
    ReplicaSet: Pod 복제본 관리
    Deployment: 선언적 업데이트 관리
    Service: Pod 그룹에 대한 단일 접점 제공
    Ingress: 외부 접근 규칙 정의
    ConfigMap: 설정 정보 관리
    Secret: 민감한 정보 관리
  2. 실제 사용 예시:

    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:1.14.2
         ports:
         - containerPort: 80
  3. 장점

  • 확장성과 고가용성
  • 선언적 구성 관리
  • 자동화된 운영
  • 클라우드 중립적
  • 큰 커뮤니티 지원
  1. 단점
  • 학습 곡선이 가파름
  • 작은 규모에선 과도할 수 있음
  • 복잡한 설정과 관리 필요

추가적으로 더 자세한 내용이나 특정 부분에 대해 알고 싶으신 것이 있다면 말씀해 주세요.

'IT > kubernetes[k8s]' 카테고리의 다른 글

Kubernetes PV와 PVC 개요  (0) 2024.11.16
Kubernetes Pod 개요  (2) 2024.11.16
쿠버네티스 기본 명령어 모음  (0) 2024.11.15
Taints와 Tolerations  (1) 2024.11.15
Kubernetes Ingress  (0) 2024.11.14

 

Kubernetes에서 deploy, rs, ds, sts는 각각 Deployment, ReplicaSet, DaemonSet, StatefulSet을 나타내는 약어입니다. 이들은 다양한 애플리케이션 워크로드를 관리하기 위해 사용되는 주요 리소스 유형으로, 각 리소스는 고유한 목적과 기능을 가지고 있습니다.

1. Deployment (deploy)

설명:

  • Deployment는 애플리케이션을 배포하고 관리하는 데 가장 일반적으로 사용되는 리소스입니다. 주로 무상태 애플리케이션(stateless applications)에 적합하며, 원하는 수의 복제본을 유지하고 트래픽을 분산할 수 있습니다.

주요 기능:

  • 스케일링: 원하는 수만큼의 Pod를 손쉽게 늘리거나 줄일 수 있습니다.
  • 롤링 업데이트 및 롤백: 중단 없이 애플리케이션을 업데이트하고, 문제가 발생하면 롤백할 수 있습니다.
  • 자동 복구: Pod에 장애가 발생하면 자동으로 재시작되거나 대체됩니다.

사용 사례:

  • 웹 서버, API 서버 같은 무상태 애플리케이션에 적합합니다.

2. ReplicaSet (rs)

설명:

  • ReplicaSet은 특정 수의 Pod가 항상 실행되도록 보장하는 리소스입니다. Deployment가 ReplicaSet을 관리하고 생성하여 애플리케이션을 배포하는데, ReplicaSet은 Pod의 정확한 복제본 수를 유지하는 역할을 합니다. 일반적으로 직접 사용하는 경우는 드물며, Deployment와 함께 사용됩니다.

주요 기능:

  • 지속적인 복제본 유지: 정의된 수의 Pod가 실행되도록 보장하여, Pod가 죽으면 자동으로 새로운 Pod를 생성합니다.

사용 사례:

  • Deployment와 함께 사용되어 무상태 애플리케이션의 안정적인 복제본 수를 유지합니다.

3. DaemonSet (ds)

설명:

  • DaemonSet은 클러스터 내의 각 노드마다 하나의 Pod가 실행되도록 보장하는 리소스입니다. 각 노드에 필요한 시스템 서비스나 에이전트를 배포할 때 주로 사용됩니다.

주요 기능:

  • 모든 노드에 단일 Pod: 클러스터 내 모든 노드에 특정 Pod를 실행하도록 하며, 새 노드가 추가되면 자동으로 해당 노드에 Pod를 생성합니다.
  • 자동 업데이트 및 유지: 노드 수가 변경되더라도 자동으로 관리하여 모든 노드에 Pod가 실행되도록 합니다.

사용 사례:

  • 로그 수집기, 모니터링 에이전트와 같은 시스템 에이전트에 적합합니다.

4. StatefulSet (sts)

설명:

  • StatefulSet은 각 Pod가 고유한 ID와 영구 스토리지를 가지며, 정해진 순서대로 생성 및 종료되는 등 상태가 필요한 애플리케이션을 배포하고 관리하기 위해 사용됩니다.

주요 기능:

  • 고유한 네트워크 ID: 각 Pod가 고유한 네트워크 ID를 가지고 생성 순서에 따라 정렬됩니다.
  • 고정된 스토리지 제공: 각 Pod는 고유의 영구 스토리지 볼륨을 가지며, Pod가 재시작해도 데이터가 유지됩니다.
  • 순차적 배포 및 종료: 안정성을 위해 Pod를 순차적으로 생성 및 종료합니다.

사용 사례:

  • 데이터베이스, 분산 시스템 등 상태 저장 애플리케이션에 적합합니다.

요약

  • Deployment (deploy): 무상태 애플리케이션 배포 및 관리, 롤링 업데이트, 롤백 가능.
  • ReplicaSet (rs): Pod 복제본 수 유지, Deployment가 생성 및 관리.
  • DaemonSet (ds): 각 노드마다 하나의 Pod 실행, 로그 수집 및 모니터링 같은 시스템 서비스에 적합.
  • StatefulSet (sts): 고유 ID와 스토리지가 필요한 상태 저장 애플리케이션에 적합하며, 순차적 배포 및 종료가 필요함.

각 리소스는 애플리케이션의 특성과 필요에 맞추어 선택적으로 사용됩니다.

'IT > kubernetes[k8s]' 카테고리의 다른 글

쿠버네티스 서비스(Service)  (0) 2024.11.13
쿠버네티스 - 노드  (1) 2024.11.08
클러스터의 개념  (0) 2024.11.07
쿠버네티스 구성 요소  (1) 2024.10.21
Kubernetes 소개  (8) 2024.10.21

+ Recent posts