Kubernetes의 Service 및 서비스 디스커버리

1. Service 개요

Kubernetes에서 Pod는 동적으로 생성되고 삭제되므로, 특정 Pod의 IP 주소를 직접 참조하는 것은 어렵다. 이를 해결하기 위해 Kubernetes는 Service라는 추상화 개념을 제공하여, Pod 간 통신을 안정적으로 유지할 수 있도록 한다.

Service는 동일한 역할을 하는 여러 Pod를 묶어 단일 엔드포인트(IP 및 DNS)로 접근할 수 있도록 해준다. 이를 통해 클라이언트는 특정 Pod가 아니라 Service를 통해 트래픽을 전달받을 수 있다.

2. Service의 주요 타입

Kubernetes에서 제공하는 Service 유형은 다음과 같다.

2.1 ClusterIP (기본값)

  • 클러스터 내부에서만 접근 가능한 서비스
  • 서비스가 생성되면, 내부 가상 IP가 할당되며 클러스터 내부에서만 접근 가능
  • 기본적인 내부 통신용으로 사용됨
  • 예제:
apiVersion: v1
kind: Service 
metadata: 
  name: my-clusterip-service. 
spec: 
  selector: 
    app: my-app. 
  ports: 
  - protocol: TCP 
    port: 80 
    targetPort: 8080

2.2 NodePort

  • 클러스터 외부에서도 접근 가능한 서비스
  • 클러스터 내 모든 노드에 동일한 포트를 열어 외부 트래픽을 전달
  • 30000-32767 범위의 포트 중 하나가 자동 할당됨
  • 외부에서 NodeIP:NodePort를 통해 서비스 접근 가능
  • 예제:
apiVersion: v1
kind: Service
  metadata:
    name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080

2.3 LoadBalancer

  • 클라우드 환경(AWS, GCP, Azure)에서 L4 로드밸런서를 자동으로 생성
  • 외부에서 직접 접근할 수 있는 퍼블릭 IP가 할당됨
  • 트래픽을 클러스터 내부의 Pod로 분산
  • 예제:
apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

2.4 ExternalName

  • DNS 이름을 직접 반환하는 서비스
  • Kubernetes 내부 서비스가 아닌 외부 서비스(AWS RDS, API Gateway 등)와 연결할 때 사용
  • 예제:
apiVersion: v1
kind: Service
metadata:
  name: my-external-service
spec:
  type: ExternalName
  externalName: example.com

3. Kubernetes의 서비스 디스커버리

Kubernetes에서 서비스 디스커버리는 크게 두 가지 방식으로 이루어진다.

3.1 환경 변수 기반 디스커버리

Pod가 생성될 때, 해당 네임스페이스의 Service 정보를 자동으로 환경 변수로 추가한다.

  • 예를 들어 my-service가 존재하면, 해당 서비스의 환경 변수가 다음과 같이 설정됨:
    • MY_SERVICE_SERVICE_HOST=10.100.200.1
    • MY_SERVICE_SERVICE_PORT=80
  • 하지만, 환경 변수를 이용한 방식은 동적으로 변경되는 서비스를 반영하기 어렵기 때문에 DNS 기반 서비스 디스커버리가 더 일반적으로 사용됨.

3.2 DNS 기반 디스커버리 (CoreDNS 활용)

Kubernetes 클러스터에서는 기본적으로 CoreDNS가 실행되며, 모든 Service는 자동으로 svc.cluster.local 도메인으로 등록됨.

예제: 서비스 간 DNS 기반 통신

  • my-servicedefault 네임스페이스에 존재하는 경우:
    • my-service.default.svc.cluster.local
  • busybox 컨테이너에서 서비스에 접근하는 방법:
    • nslookup my-service.default.svc.cluster.local
    • curl http://my-service.default.svc.cluster.local:80

4. 정리

  • Kubernetes의 Service는 Pod의 동적 IP 변화를 해결하고, 안정적인 네트워크 통신을 제공한다.
  • ClusterIP, NodePort, LoadBalancer, ExternalName과 같은 다양한 서비스 타입이 있으며, 환경에 맞게 선택해야 한다.
  • Kubernetes의 서비스 디스커버리는 환경 변수 기반DNS 기반 두 가지 방식이 있으며, 일반적으로 CoreDNS를 활용한 DNS 기반 방식이 더 많이 사용된다.

Kubernetes 네트워킹을 이해하는 것은 클러스터 운영 및 애플리케이션 배포에 매우 중요하다. 다음 글에서는 Ingress 및 Ingress Controller에 대해 자세히 알아보자! 🚀

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다