
서비스란 외부로부터 요청을 받아 파드(Pod)에 균등하게 분배하는 로드 밸런서 역할을 수행하는 쿠버네티스 기능입니다.
외부 요청 처리: 클러스터 외부의 사용자가 보낸 요청을 처리하고 적절한 파드로 전달합니다.
로드 밸런싱: 여러 파드에 트래픽을 균등하게 분배해 특정 파드에 과부하가 걸리는 것을 방지합니다.
파드 추상화: 사용자가 개별 파드를 직접 다루지 않고, 서비스라는 추상화된 엔드포인트를 통해 접근할 수 있게 해줍니다.
실제 서비스에서는 파드(Pod)에 요청을 보낼 때, 포트 포워딩(port-forward)이나 파드 내로 직접 접근(kubectl exec …)해서 요청을 보내지 않으며, 서비스(Service)를 통해 요청을 보내는 것이 일반적입니다.
쿠버네티스에서 파드는 동적으로 생성되고 제거되면서 IP가 자주 변경됩니다. 하지만 서비스를 사용하면, IP 변경과 관계없이 사용자가 항상 동일한 방식으로 파드에 접근할 수 있습니다.
서비스는 고정된 네트워크 주소(ClusterIP)를 제공해, 파드의 IP가 바뀌어도 사용자 입장에서 동일한 주소로 일관되게 파드를 호출할 수 있게 해줍니다.

이전 글에서는 디플로이먼트(Deployment)를 사용해 백엔드 서버 3개를 실행하는 실습을 진행했었습니다. 이번에는 해당 프로젝트에서 서비스(Service)를 생성해 모든 파드에 요청이 골고루 분배되도록 설정해 보겠습니다.

nodePort: 30000으로 요청을 보냅니다.port: 8080으로 요청이 전달됩니다.targetPort: 8080으로 요청을 전달합니다.서비스 → 노드 → 외부 클라이언트 순으로 반환합니다.매니페스트 파일을 추가로 생성하고, 아래와 같이 내용을 작성합니다.
spring-service.yaml
apiVersion: v1 # Kubernetes API 버전. Service를 생성할 때 사용하는 API 버전.
kind: Service # 리소스 종류. 여기서는 Service를 생성
metadata:
name: spring-service # Service 이름. 클러스터 내에서 이 이름으로 Service를 식별
spec:
type: NodePort # Service 유형. NodePort를 사용하면 외부에서 접근 가능
selector:
app: backend-app # Service와 연결될 파드를 선택하는 조건 / app: backend-app 레이블이 설정된 파드만 연결
ports:
- protocol: TCP # 통신 프로토콜. TCP 사용
port: 8080 # Service가 클러스터 내부에서 사용할 포트 번호
targetPort: 8080 # 연결된 파드에서 실제로 사용하는 포트 번호
nordPort: 30000 # 클러스터 외부에서 이 포트 번호로 Service에 접근 가능
NodePort는 클러스터 내의 각 노드(서버)에서 지정된 고정 포트를 열어 외부에서 해당 포트를 통해 서비스에 접근할 수 있도록 설정합니다.
30000~32767 범위 내의 포트를 사용하며, 명시하지 않으면 자동으로 할당됩니다.ClusterIP는 쿠버네티스 클러스터 내부에서만 접근할 수 있도록 설정된 기본 서비스 유형입니다. 쿠버네티스에서 서비스를 생성할 때, type을 따로 지정하지 않으면 기본적으로 ClusterIP로 설정됩니다.
LoadBalancer는 클라우드 제공자의 로드 밸런서를 이용해 외부에서 트래픽을 관리하고, 서비스로 전달합니다.
매니페스트 파일을 사용해 서비스(Service)를 생성합니다.
$ kubectl apply -f spring-service.yaml

서비스가 잘 생성되었는지 확인합니다.
$ kubectl get service

