DevOps/Kubernetes

쿠버네티스 - Service

재성스 2024. 10. 4. 17:25
반응형

Kubernetes에서 Service는 클러스터 내부의 Pod들이 외부 혹은 내부에서 네트워크 트래픽을 주고받을 수 있게 하는 리소스이다. 파드들은 IP 주소가 동적으로 할당되기 때문에, 파드가 재시작되면 IP 주소가 바뀌게 된다. 이를 해결하기 위해 Service는 파드의 네트워크 연결을 추상화하고, 파드가 종료되거나 재시작되더라도 클라이언트가 지속적으로 파드에 연결할 수 있게 해주는 역할을 한다.

* 네트워크 트래픽이란? 데이터나 요청이 네트워크를 통해 주고받는 흐름을 의미한다. 예를 들어 , 클라이언트가 파드에서 실행중인 애플리케이션에 요청을 보내거나, 파드끼리 데이터를 주고받는 것이 네트워크 트래픽이다.(트래픽이란, 일반적으로 HTTP 요청, 데이터 패킷 전송 등을 포함한다.)


* 네트워크 연결을 추상화한다? 파드는 일시적이며, 재시작되거나 재배포되면 IP주소가 동적으로 변경된다. 이를 해결하기 위해 서비스가 추상화 게층으로 동작해서 파드의 IP 주소가 변경되더라도 서비스 IP를 통해 계속해서 파드에 접근할 수 있게 한다.
즉, 클라이언트는 서비스가 제공하는 고정된 IP와 포트를 통해 파드에 끊기지 않고 접속하게 하며, 파드의 실제 IP가 변하더라도 서비스는 이를 은닉하도 트래픽을 올바른 파드로 전달할 수 있게 한다. 

Kubernetes에는 여러 Service 타입이 있으며, 이 글에서는 ClusterIP, NodePort, LoadBalancer에 대해 다룬다. 

 

1. ClusterIP 서비스

ClusterIP는 클러스터 내부에서만 접근할 수 있는 IP 주소를 제공하는 쿠버네티스의 기본 서비스 유형이다. 외부 네트워크에서는 접근할 수 없지만, 클러스터 내부의 다른 파드들이 이 IP를 통해 통신할 수 있다. 네트워크 연결을 추상화하는 방식으로, 클러스터 내부에서 파드의 IP 주소를 일일이 관리할 필요 없이, 서비스 IP를 통해 여러 파드에 트래픽을 전달할 수 있다.

예시 pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-1  # 파드 이름
  labels:
    app: pod  # 파드에 붙여진 레이블
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1  # 특정 노드에 파드를 배포
  containers:
  - name: container
    image: kubetm/app  # 컨테이너 이미지
    ports:
    - containerPort: 8080  # 컨테이너 내부에서 사용하는 포트
  • pod-1은 8080 포트에서 애플리케이션을 실행하는 파드이다. 이 파드는 노드 k8s-node1에 배포된다.

예시 ClusterIP 서비스

apiVersion: v1
kind: Service
metadata:
  name: svc-1  # 서비스 이름
spec:
  selector:
    app: pod  # 레이블이 app: pod인 파드를 대상으로 설정
  ports:
  - port: 9000  # 서비스가 외부로 노출하는 포트
    targetPort: 8080  # 파드 내 컨테이너의 포트
  • Service의 default type은 ClusterIP이므로, 명시하지 않으면 자동으로 ClusterIP 타입으로 생성된다.
  • svc-1 서비스는 app: pod 레이블을 가진 파드를 대상으로 설정되어 있으며, 9000번 포트로 들어오는 트래픽을 파드의 8080번 포트로 전달한다. 이 서비스는 클러스터 내부에서만 접근 가능하며, 외부에서는 접근할 수 없다.
  • 클러스터 내부의 파드들은 svc-1의 ClusterIP를 통해 연결될 수 있고, 파드가 재시작되거나 IP 주소가 변경되더라도 서비스 IP로 안정적으로 접근할 수 있다.

 

2. NodePort 서비스

NodePort는 클러스터 외부에서 노드의 IP 주소와 특정 포트를 통해 서비스에 접근할 수 있도록 한다. 노드의  IP 주소와 NodePort 범위(30000~32767) 내에서 지정된 포트로 외부 트래픽이 파드로 전달된다. 네트워크 트래픽이 외부에서 들어오면 노드의 지정된 포트로 접속이 이루어지고, kubernetes는 이를 적절한 파드로 전달한다.

apiVersion: v1
kind: Service
metadata:
  name: svc-2  # 서비스 이름
spec:
  selector:
    app: pod  # 레이블이 app: pod인 파드를 대상으로 설정
  ports:
  - port: 9000  # 서비스가 외부로 노출하는 포트
    targetPort: 8080  # 파드 내 컨테이너의 포트
    nodePort: 30001  # 외부에서 접근 가능한 NodePort
  type: NodePort  # NodePort 서비스 유형
  externalTrafficPolicy: Local  # 로컬 트래픽만 전달
  • svc-2 서비스는 30001번 NodePort를 통해 외부 트래픽을 받아, 8080번 포트에서 실행 중인 파드로 트래픽을 전달한다.
  • 클러스터 외부에서 노드 IP : 30001로 접근하면, NodePort는 트래픽을 app:pod 레이블을 가진 파드의 8080번 포트로 전달한다. NodePort를 통해 외부에서 클러스터 내 파드로의 트래픽을 안전하게 전달할 수 있다.

 

3. LoadBalancer 서비스

LoadBalancer는 외부에서 들어오는 트래픽을 받아서 Kubernetes 클러스 내부의 파드로 전달하는 서비스 유형이다. 주로 클라우드 환경에서 사용되며, 클라우드 제공자(GCP, AWS, Azure 등)는 로드 밸런서를 자동으로 생성해서 외부 네트워크 트래픽을 파드로 안전하게 전달한다. 반면, 온프레미스 환경에서는 로드 밸런서가 동작하지 않으며, 동작을 원할 경우 로드 밸런서 플러그인을 설치해야 한다.

apiVersion: v1
kind: Service
metadata:
  name: svc-3  # 서비스 이름
spec:
  selector:
    app: pod  # 레이블이 app: pod인 파드를 대상으로 설정
  ports:
  - port: 9000  # 서비스가 외부로 노출하는 포트
    targetPort: 8080  # 파드 내 컨테이너의 포트
  type: LoadBalancer  # LoadBalancer 서비스 유형

 

Service 타입 비교

유형 기본 동작 외부 접근 주요 사용 사례 장점 단점
ClusterIP 클러스터 내부에서만 접근 가능 불가능 (내부 트래픽만 처리) 클러스터 내부 서비스 통신, 외부 노출이 필요 없느 단순하고 빠르며, 보안적 (내부에서만 트래픽 처리) 외부 트래픽을 받을 수 없음
NodePort 클러스터 외부에서 노드의 IP와 포트를 통해 접근 가능 가능 (노드 IP와 노드 포트를 사용) 개발 환경에서 외부 접근을 허용해야 할 때, 또는 로컬 외부 트래픽을 노드에 노출시킬 수 있음 노드가 많을 경우 모든 노드에 포트를 열어둬야 함
LoadBalancer 클라우드 제공자의 로드 밸런서 또는 플러그인 설치를 통해 외부에서 접근 가능 가능(클라우드 로드 밸런서를 통해) 프로덕션 환경에서 외부 트래픽을 처리해야 할 때, 클라우드 환경에서 사용 자동으로 클라우드 로드밸런서 생성, 외부 접근이 용이 클라우드 환경에 의존, 추가 비용 발생 가능

 

반응형