오늘의 인기 글
최근 글
최근 댓글
Today
Total
12-26 16:37
관리 메뉴

우노

[K8S] Service - ClusterIP, NodePort, LoadBalancer 본문

DevOps/Kubernetes

[K8S] Service - ClusterIP, NodePort, LoadBalancer

운호(Noah) 2023. 3. 26. 14:54

Service란?

  • Pod는 IP가 랜덤하게 지정 되고, 재시작 될 때마다 변경되기 때문에, 고정된 엔드포인트로 호출하는 것이 어렵습니다.
  • 이때, Service를 사용해 고정된 IP로 Pod에 접근하도록 설정할 수 있습니다.
  • 뿐만 아니라, Service를 통해 트래픽이 여러 Pod들에게 로드밸런싱되도록 설정할 수 있습니다.

Service Type

  • 서비스 유형은 크게 3가지로 구분됩니다.
    • ClusterIP
    • NodePort
    • LoadBalancer
    • ExternalName (해당 유형은 생략하겠습니다.)

ClusterIP

  • 디폴트 설정입니다.

  • ClusterIP 유형은, Service에 클러스터 내부 가상 IP 주소인 ‘ClusterIP’를 할당해, 클러스터 내부에서만 해당 Service에 접근할 수 있도록하는 설정입니다.

  • 예제 생성 코드

      apiVersion: v1
      kind: Service
      metadata:
        name: hello-node-svc
      spec:
        type: ClusterIP
        selector:             # 이 서비스가 적용될 파드 정보를 지정
          app: hello-node
        ports:
          - protocol: TCP
            port: 80          # Cluster 안에서 내부적으로 Service 객체에 접근하기 위해 사용되는 포트
            targetPort: 8080  # Service 객체로 전달된 요청을 Pod로 전달할 때 사용되는 포트

NodePort

  • NodePort 유형은, 클러스터 내부에서 Service의 가상 IP 주소인 ‘ClusterIP’와 Port를 통해 접근할 수 있을뿐만 아니라,

  • 각 Node의 IP와 설정된 Port를 통해서도 접근이 가능하도록 하는 설정입니다.

  • 예제 생성 코드

      apiVersion: v1
      kind: Service
      metadata:
        name: myapp-service
      spec:
        type: NodePort
        selector:            # 이 서비스가 적용될 파드 정보를 지정
          app: myapp
        ports:
          - nodePort: 30000  # Node에 접근할 때 사용되는 포트
            port: 80         # Cluster 안에서 내부적으로 Service 객체에 접근하기 위해 사용되는 포트
            targetPort: 80   # Service 객체로 전달된 요청을 Pod로 전달할 때 사용되는 포트
    • ClusterIP에 80포트로도 Service에 접근할 수 있지만,
    • Node IP에 30000 포트로도 Service에 접근할 수 있게 됩니다.
  • 그러나 직접 노드의 IP를 사용해 접근하는 것은 일반적으로 보안상 권장되지 않으며,

  • 프로덕션 환경에서는 DNS 이름이나 LoadBalancer, Ingress와 같은 다른 서비스 유형을 사용하는 것이 더 안전합니다.

LoadBalancer

  • Service를 외부에 노출시키는 설정입니다.

  • 따라서, 서비스의 외부 IP에 포트를 통해 서비스에 접근할 수 있게 됩니다.

  • 예제 생성 코드

      apiVersion: v1
      kind: Service
      metadata:
        name: my-loadbalancer-svc
      spec:
        type: LoadBalancer
        selector:
          app: my-app         # 이 서비스가 적용될 파드 정보를 지정
        ports:
          - protocol: TCP
            port: 80          # Cluster 안에서 내부적으로 Service 객체에 접근하기 위해 사용되는 포트
            targetPort: 8080  # Service 객체로 전달된 요청을 Pod로 전달할 때 사용되는 포트

참고

Comments