2 분 소요

1. Service란

쿠버네티스에서 서비스는 파드의 논리적인 집합과 그것들에 접근할 수 있는 정책을 정의하는 추상적 개념임.
즉 서비스는 파드들을 ㅌ오해 실행되고 있는 애플리케이션을 네트워크에 노출시키는 가상의 컴포넌트임.
Service에 대한 type으로는 4가지가 존재

  • ClusterIP
  • NodePort
  • LoadBalancer
  • ExternalName

2. ClusterIP

ClusterIP는 클러스터 내부 IP를 노출하는 단순한 서비스 유형임.
클러스터 외부에서 연결할 수 없음.
즉, 파드들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP임.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Service
metadata:
  name: my-svc
Spec:
  type: ClusterIP
  selector:
    app: web-application
    environment: staging
  port:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080

다른 쿠버네티스 리소스와 마찬가지로 name 값을 포함한 메타데이터 블록이 존재
name 값은 클러스터의 다른 곳에서 서비스에 액세스할 수 있는 방법

Spec은 세 가지 부분으로 구성됨

  • type
    • 기본 유형은 ClusterIP이므로 ClusterIP 서비스를 한다면 지정할 필요가 없음
  • selector
    • selector는 해당 파드의 메타데이터에 있는 레이블과 일치하는 키와 값으로 구성
    • 이때 service는 트래픽을 전달할 app=web-application && environment=staging인 파드를 찾음
  • ports
    • 서비스 포트(80)는 애플리케이션 파드의 포트(8080)에 매핑
    • 둘 이상의 포트를 열 수 있고, 여러 포트를 연다면 이름 필드가 필요
    • protocol
      • TCP, UDP, HTTP, PROXY, SCTP 지원

3. NodePort

NodePort는 외부 서비스 유형으로 실제로 클러스터 외부에서 액세스할 수 있음
NodePort 서비스를 만들 때 같은 이름의 ClusterIP 서비스가 자동으로 만들어지고 NodePort에 의해 라우팅되어 클러스터 내부에서 서비스에 계속 액세스할 수 있음
따라서 NodePort는 LoadBalancer 서비스가 구성 불가능할 때 애플리케이션에 외부적으로 액세스할 수 있는 좋은 방안임.

NodePort는 클러스터에 있는 모든 노드에서 서비스에 액세스할 수 있는 포트를 염
이 포트는 기본적으로 30000-32767 범위에 있고 서비스가 만들어지면 자동 연결됨.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Service
metadata:
  name: my-svc
Spec:
  type: NodePort
  selector:
    app: web-application
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 31000
  • 해당 서비스는 모든 노드의 [Node IP] : [nodePort]에서 액세스할 수 있음
  • nodePort를 지정하지 않으면 기본 범위 내에서 랜덤으로 지정됨

    image

  • 클러스터의 모든 노드에서 서비스에 접근할 수 있음
  • 네트워크 요청은 액세스하는 노드뿐만 아니라 모든 노드의 파드간에 Load Balancing이 수행됨
  • 하지만 클라우드 서비스를 사용한다면 서버 간에 요청을 분산할 수 있는 다양한 도구가 존재
    • LoadBalancer 서비스를 사용하면 가능

4. LoadBalancer

LoadBalancer는 클러스터의 실행 위치를 기반으로 LoadBalancer를 프로비저닝하는 쿠버네티스의 특수 서비스 유형임.
해당 유형은 서비스를 클라우드 제공자 측의 자체 로드 밸런서로 노출시키며, 이에 필요한 NodePort와 ClusterIP 역시 자동 생성됨.

클라우드 프로바이더에서 제공하는 로드밸런서를 동적으로 생성하는 방식임.
예를 들어, AWS에서 쿠버네티스는 ELB(Elastic Load Balancer), ALB(Application Load Balancer)를 지원하여 이를 동적으로 관리할 수 있게 해주는 Service가 LoadBalancer 타입임.

AWS, GCP, AZURE 등과 같은 클라우드 환경이 아니라, 온프레미스 환경의 클러스터에서는 로드밸런서가 이용 불가능함.
따라서 MetalLB 같은 기술 등을 사용하여 LoadBalancer 타입을 사용해야 함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: Service
metadata:
  name: my-svc
  annotations:
    Service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws..
spec:
  type: LoadBalancer
  select:
    app: web-application
  ports:
    - name: http
      portocol: TCP
      port: 80
      targetPort: 8080

image

  • LoadBalancer 타입 Service는 NodePort 타입 Service를 감싸서 만들어짐.
    • 따라서 LoadBalancer도 ClusterIP 사용 가능
    • LoadBalnacer는 NodePort를 타겟 그룹으로 생성
    • NodePort로 들어온 요청은 ClusterIP로 전달되어 Pod로 포워딩
    • 즉 NodePort랑 비교하면, 트래픽 진입 시점이 과정이 하나 더 생김
      • Node의 IP를 통해서 들어오는 방식이 아닌 외부 LoadBalancer에 요청하고 알아서 NodePort에 트래픽 분산

5. ExternalName

ExternalName Service 유형은 클러스터에서 실제로 실행하지 않는 애플리케이션을 프락시하는 데 사용할 수 있으며, 동시에 서비스를 언제든지 업데이트할 수 있게 추상화해 관리할 수 있음

즉 외부로 요청을 전달하는 목적의 서비스임.

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Service
metadata:
  name: my-svc
  namespace: prod
spec:
  type: ExternalName
  externalName: myapp.domain.com # 외부 서비스 domain

Ref.

카테고리:

업데이트: