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

쿠버네티스 기본 명령어 모음

1. 클러스터 정보 확인

# 클러스터 정보 확인
kubectl cluster-info

# 노드 상태 확인
kubectl get nodes
kubectl get nodes -o wide

# 전체 네임스페이스의 모든 리소스 확인
kubectl get all --all-namespaces

# API 리소스 목록 확인
kubectl api-resources

2. Pod 관련 명령어

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

# 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

3. Deployment 관련 명령어

# Deployment 목록 조회
kubectl get deployments
kubectl get deploy

# Deployment 생성
kubectl create deployment nginx --image=nginx
kubectl create deployment nginx --image=nginx --replicas=3

# Deployment 스케일 조정
kubectl scale deployment nginx --replicas=5

# Deployment 상세 정보
kubectl describe deployment [deployment-name]

# Deployment 수정
kubectl edit deployment [deployment-name]

# Deployment 삭제
kubectl delete deployment [deployment-name]

# 롤아웃 상태 확인
kubectl rollout status deployment [deployment-name]

# 롤아웃 히스토리 확인
kubectl rollout history deployment [deployment-name]

# 롤백 실행
kubectl rollout undo deployment [deployment-name]

4. Service 관련 명령어

# Service 목록 조회
kubectl get services
kubectl get svc

# Service 생성
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl expose pod nginx --port=80 --type=NodePort

# Service 상세 정보
kubectl describe service [service-name]

# Service 삭제
kubectl delete service [service-name]

5. ConfigMap과 Secret 관련 명령어

# ConfigMap 관리
kubectl get configmaps
kubectl create configmap [name] --from-file=[path/to/file]
kubectl create configmap [name] --from-literal=key1=value1
kubectl describe configmap [name]

# Secret 관리
kubectl get secrets
kubectl create secret generic [name] --from-literal=key1=value1
kubectl describe secret [name]

6. 네임스페이스 관련 명령어

# 네임스페이스 목록
kubectl get namespaces
kubectl get ns

# 네임스페이스 생성
kubectl create namespace [name]

# 네임스페이스 전환
kubectl config set-context --current --namespace=[name]

# 특정 네임스페이스의 리소스 조회
kubectl get all -n [namespace]

7. 리소스 모니터링 명령어

# 리소스 사용량 확인
kubectl top nodes
kubectl top pods

# 이벤트 확인
kubectl get events
kubectl get events --sort-by=.metadata.creationTimestamp

8. 구성 및 컨텍스트 관련 명령어

# 현재 컨텍스트 확인
kubectl config current-context

# 컨텍스트 목록 확인
kubectl config get-contexts

# 컨텍스트 전환
kubectl config use-context [context-name]

# kubeconfig 보기
kubectl config view

9. 리소스 관리 명령어

# 리소스 생성/수정
kubectl apply -f [file.yaml]
kubectl create -f [file.yaml]

# 리소스 삭제
kubectl delete -f [file.yaml]

# 여러 리소스 한번에 삭제
kubectl delete all --all

10. 디버깅 관련 명령어

# 임시 디버깅용 Pod 생성
kubectl run debug --image=busybox --rm -it -- /bin/sh

# 네트워크 테스트용 Pod
kubectl run test-pod --image=nginx --restart=Never

# Pod 문제 해결
kubectl describe pod [pod-name]
kubectl logs [pod-name] --previous  # 이전 컨테이너 로그

# 클러스터 상태 진단
kubectl get componentstatuses

11. 고급 명령어

# JSON 경로 사용 예시
kubectl get pods -o jsonpath='{.items[*].metadata.name}'

# 커스텀 컬럼 출력
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase

# Watch 모드로 모니터링
kubectl get pods -w

# 레이블 선택자 사용
kubectl get pods -l app=nginx

# 필드 선택자 사용
kubectl get pods --field-selector status.phase=Running

12. 유용한 옵션들

--all-namespaces, -A: 모든 네임스페이스
--output, -o: 출력 형식 지정 (yaml, json, wide 등)
--selector, -l: 레이블 선택
--force: 강제 실행
--dry-run=client: 실제 실행 없이 시뮬레이션
-v: 로그 레벨 지정

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

Kubernetes Pod 개요  (2) 2024.11.16
쿠버네티스(Kubernetes)란?  (2) 2024.11.15
Taints와 Tolerations  (1) 2024.11.15
Kubernetes Ingress  (0) 2024.11.14
쿠버네티스 서비스(Service)  (0) 2024.11.13

TaintsTolerations는 Kubernetes에서 특정 노드에 파드를 제한적으로 스케줄링할 수 있도록 해주는 기능입니다. 이들은 함께 사용되어 특정 노드에서 특정 조건을 충족하는 파드만 스케줄링할 수 있게 합니다.

1. Taints (테인트)

  • 목적: 노드에 테인트를 추가하면, 기본적으로 그 노드에 파드가 스케줄링되지 않도록 제한합니다. 테인트는 특정 조건을 설정하여 파드가 해당 노드에 배치되지 않도록 막는 역할을 합니다.
  • 구성 요소: 테인트는 , , 효과(Effect) 세 가지로 구성됩니다.
    • : 테인트를 구분하는 이름.
    • : 테인트의 추가 정보(선택 사항).
    • 효과(Effect): 테인트의 동작 방식. 아래 세 가지 중 하나를 사용합니다:
      • NoSchedule: 조건을 만족하는 파드만 이 노드에 스케줄링할 수 있습니다.
      • PreferNoSchedule: 가능한 한 스케줄링하지 않으려 하지만 필요할 경우 스케줄링할 수도 있습니다.
      • NoExecute: 기존에 이 노드에 있던 파드라도 조건을 만족하지 않으면 제거합니다.

예시:

노드에 다음과 같은 테인트를 추가한다고 가정해 보겠습니다:

kubectl taint nodes node1 key=value:NoSchedule

위 명령어는 node1key=valueNoSchedule 테인트를 추가하여, 조건을 만족하지 않는 파드는 이 노드에 스케줄링되지 않도록 합니다.

2. Tolerations (톨러레이션)

  • 목적: 톨러레이션은 특정 파드가 테인트가 설정된 노드에 스케줄링될 수 있도록 허용하는 역할을 합니다. 즉, 파드에 톨러레이션이 추가되면 해당 테인트를 무시하고 그 노드에 배치될 수 있습니다.
  • 구성 요소: 톨러레이션 역시 , , 효과(Effect)를 가집니다.
    • 파드의 톨러레이션 키와 값이 노드의 테인트와 일치하면 해당 노드에 배치될 수 있습니다.

예시:

파드에 다음과 같은 톨러레이션을 추가하여 key=value 테인트가 있는 노드에도 스케줄링되도록 할 수 있습니다:

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"

Taints와 Tolerations 사용 예시

  1. 전용 노드 설정: NoSchedule 테인트와 해당 테인트에 대한 톨러레이션을 사용하여 특정 파드만 해당 노드에 스케줄링되도록 할 수 있습니다. 예를 들어, GPU 노드에 GPU를 사용하는 워크로드만 스케줄링하도록 설정할 수 있습니다.

  2. 노드 유지 관리: NoExecute 테인트를 사용하여 유지 관리 중인 노드에서 파드를 제거하고, 작업이 완료되면 파드를 다시 스케줄링할 수 있습니다.

이렇게 TaintsTolerations는 특정 노드에 특정 파드만 스케줄링하거나 특정 조건에 따라 노드에서 파드를 제거할 때 유용하게 사용됩니다.

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

쿠버네티스(Kubernetes)란?  (2) 2024.11.15
쿠버네티스 기본 명령어 모음  (0) 2024.11.15
Kubernetes Ingress  (0) 2024.11.14
쿠버네티스 서비스(Service)  (0) 2024.11.13
쿠버네티스 - 노드  (1) 2024.11.08

 

Kubernetes Ingress

공식 문서 : https://kubernetes.io/ko/docs/concepts/services-networking/ingress/

Kubernetes Ingress Kubernetes(이하 K8s) 클러스터 내에서 외부 HTTP HTTPS 트래픽을 내부 서비스로 라우팅하는 방법을 제공하는 API 객체입니다. Ingress는 로드 밸런싱, SSL/TLS 종료, 호스트 및 경로 기반의 라우팅과 같은 다양한 트래픽 관리 기능을 지원합니다. 이를 통해 클러스터 외부에서 K8s 내부 서비스에 접근할 수 있게 해주는 중요한 역할을 합니다.

 

 

주요 개념

  1. Ingress 객체
  2. Ingress 컨트롤러
  3. 트래픽 라우팅
  4. SSL/TLS 지원
  5. 로드 밸런싱
  6. 인증 및 권한 관리

Ingress 예시 (YAML)

Ingress_example.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
  tls:
  - hosts:
    - example.com
    secretName: example-tls-secret
 

 

이 예시에서:

  • example.com 도메인으로 들어오는 요청은 example-service로 전달됩니다.
  • HTTPS 트래픽은 example-tls-secret으로 저장된 인증서를 사용해 보안 처리됩니다.

Ingress와 서비스 차이점

  • **서비스(Service)**는 클러스터 내부에서 파드 간 통신을 위한 로드 밸런싱과 접근을 관리하며, 클러스터 외부에서의 접근은 제한적입니다.
  • Ingress는 외부 트래픽을 클러스터 내부 서비스로 라우팅할 수 있는 고급 트래픽 관리 기능을 제공하며, 주로 HTTP(S) 요청을 처리합니다.

Ingress를 사용하면 다양한 트래픽 관리 요구 사항을 쉽게 처리할 수 있어 마이크로서비스 환경에서 매우 유용한 기능입니다.

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

쿠버네티스 기본 명령어 모음  (0) 2024.11.15
Taints와 Tolerations  (1) 2024.11.15
쿠버네티스 서비스(Service)  (0) 2024.11.13
쿠버네티스 - 노드  (1) 2024.11.08
클러스터의 개념  (0) 2024.11.07

 

 

서비스(Service)

**서비스(Service)**는 쿠버네티스에서 네트워크 서비스를 추상화한 리소스입니다. 서비스는 여러 파드들을 하나의 집합으로 묶어 동일한 서비스를 제공하는 애플리케이션 컴포넌트에 접근할 수 있게 해줍니다. 이를 통해 네트워크 레벨에서 로드 밸런싱, 서비스 디스커버리 등을 쉽게 구현할 수 있습니다.

서비스의 주요 특징

  1. 클러스터 내부 DNS 이름:
  2. 로드 밸런싱:
  3. 서비스 디스커버리:
  4. 클러스터 외부 노출:
  5. 서비스 타입:

서비스의 종류

쿠버네티스에서는 다양한 서비스 타입을 제공합니다:

  • ClusterIP: 클러스터 내부에서만 접근 가능한 가상 IP를 제공합니다.
  • NodePort: 클러스터의 각 노드의 지정된 포트로 서비스를 노출시킵니다.
  • LoadBalancer: 클라우드 제공자의 로드 밸런서를 사용하여 서비스를 외부로 노출시킵니다.
  • ExternalName: 외부 DNS 이름을 클러스터 내의 서비스로 매핑하여 접근할 수 있게 합니다.

서비스 예시

다음은 my-service라는 이름의 ClusterIP 서비스를 정의하는 예시입니다:

yaml

코드 복사

apiVersion: v1

kind: Service

metadata:

  name: my-service

spec:

  selector:

    app: MyApp

  ports:

    - protocol: TCP

      port: 80

      targetPort: 8080

  • selector: app: MyApp 레이블이 지정된 모든 파드들을 이 서비스에 연결합니다.
  • ports: 서비스가 사용할 포트를 지정하고, 이 포트로 들어오는 트래픽을 파드의 targetPort로 전달합니다.

서비스의 중요성

서비스는 쿠버네티스에서 애플리케이션의 네트워크 접근성을 관리하는 핵심적인 역할을 합니다. 서비스를 올바르게 설정하면 애플리케이션의 확장성을 높이고, 네트워크 관리를 간편하게 할 수 있습니다.

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

Taints와 Tolerations  (1) 2024.11.15
Kubernetes Ingress  (0) 2024.11.14
쿠버네티스 - 노드  (1) 2024.11.08
클러스터의 개념  (0) 2024.11.07
Deployment, ReplicaSet, DaemonSet, StatefulSet  (0) 2024.11.06

+ Recent posts