DevOps

Kubernetes - Service ( spec.type )

Vince_rf 2024. 10. 26. 02:00

Kubernetes Service 리소스의 spec.type 필드는 네트워크 트래픽을 처리하는 방식에 따라 서비스의 노출 유형을 지정하는 데 사용됩니다. spec.type에는 다음과 같은 값들이 들어갈 수 있습니다:

1. ClusterIP

  • 기본값: spec.type을 지정하지 않으면 기본적으로 ClusterIP가 사용됩니다.
  • 설명: 클러스터 내부 IP(ClusterIP)를 통해 서비스에 접근할 수 있게 합니다. 외부에서 접근할 수 없으며, 클러스터 내 다른 파드에서만 접근 가능합니다.
  • 사용 사례: 클러스터 내부 통신 전용 서비스가 필요한 경우, 예를 들어 내부 마이크로서비스 간 통신.
apiVersion: v1
kind: Service
metadata:
  name: my-internal-service
spec:
  type: ClusterIP
  ports:
    - port: 80
  selector:
    app: my-app

2. NodePort

  • 설명: 서비스가 클러스터의 각 노드에서 지정된 포트를 통해 외부에 노출됩니다. 포트 범위는 기본적으로 30000-32767 사이에서 할당됩니다.
  • 사용 사례: 간단하게 클러스터 외부에서 서비스에 접근하려는 경우, 주로 개발이나 테스트 환경에서 사용됩니다.
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30080
  selector:
    app: my-app

3. LoadBalancer

  • 설명: 클라우드 환경(AWS, GCP, Azure 등)에서 사용되며, 클라우드 제공업체의 로드 밸런서를 통해 외부에 서비스가 노출됩니다. ClusterIP 및 NodePort의 기능을 포함합니다.
  • 사용 사례: 클러스터 외부에 HTTP(S) 요청을 노출하려는 프로덕션 환경에서 주로 사용됩니다.
apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30008
  selector:
    app: my-app

4. ExternalName

  • 설명: 클러스터 외부의 DNS 이름을 사용하여 외부 서비스를 가리키는 방식입니다. ExternalName으로 지정된 서비스는 IP 주소 대신 DNS 이름을 반환합니다. port나 selector 필드는 사용할 수 없고, externalName 필드가 필수로 요구됩니다.
  • 사용 사례: 클러스터 외부의 서비스와 통신이 필요할 때 사용합니다.
apiVersion: v1
kind: Service
metadata:
  name: my-external-service
spec:
  #selector없음!!!!
  type: ExternalName
  externalName: example.com

요약

  • ClusterIP: 클러스터 내부 전용
  • NodePort: 클러스터 외부에 고정 포트를 통해 노출
  • LoadBalancer: 클라우드 로드 밸런서를 통해 외부에 노출
  • ExternalName: 외부 DNS 이름을 통해 외부 서비스 연결

 

Optional )

ExternalName의 예시에는 spec.selector가 없는데 selector를 붙여야하는가?
 
ChatGPT

아니요, ExternalName 타입의 Service에는 spec.selector를 지정하지 않습니다. ExternalName 서비스는 클러스터 외부의 특정 DNS 이름을 직접 참조하는 역할만 하기 때문에, 파드를 선택하거나 라우팅할 대상이 없습니다.

ExternalName의 특성

  • ExternalName 서비스는 클러스터 외부에 위치한 DNS 이름을 참조하는 데 사용됩니다.
  • selector가 없기 때문에 이 타입의 서비스는 Kubernetes 내부의 파드와 연관되지 않고, 요청을 지정된 DNS 이름으로 직접 전달합니다.
  • 클러스터 내부 DNS에 Service 이름으로 엔트리가 추가되어 example.com 같은 외부 도메인 이름을 사용해 외부 서비스와 통신할 수 있도록 합니다.

이 경우, my-external-service라는 이름으로 서비스에 접근하면, example.com으로 요청이 전달됩니다. selector를 사용할 필요가 없는 이유는 ExternalName이 클러스터 외부의 서비스를 참조하는 방식이기 때문입니다.