서비스 (Service)

artp·2025년 1월 6일

kubernetes

목록 보기
7/18
post-thumbnail

서비스(Service)란?

서비스란 외부로부터 요청을 받아 파드(Pod)에 균등하게 분배하는 로드 밸런서 역할을 수행하는 쿠버네티스 기능입니다.

서비스의 역할

외부 요청 처리: 클러스터 외부의 사용자가 보낸 요청을 처리하고 적절한 파드로 전달합니다.
로드 밸런싱: 여러 파드에 트래픽을 균등하게 분배해 특정 파드에 과부하가 걸리는 것을 방지합니다.
파드 추상화: 사용자가 개별 파드를 직접 다루지 않고, 서비스라는 추상화된 엔드포인트를 통해 접근할 수 있게 해줍니다.

서비스 사용 이유

실제 서비스에서는 파드(Pod)에 요청을 보낼 때, 포트 포워딩(port-forward)이나 파드 내로 직접 접근(kubectl exec …)해서 요청을 보내지 않으며, 서비스(Service)를 통해 요청을 보내는 것이 일반적입니다.

쿠버네티스에서 파드는 동적으로 생성되고 제거되면서 IP가 자주 변경됩니다. 하지만 서비스를 사용하면, IP 변경과 관계없이 사용자가 항상 동일한 방식으로 파드에 접근할 수 있습니다.
서비스는 고정된 네트워크 주소(ClusterIP)를 제공해, 파드의 IP가 바뀌어도 사용자 입장에서 동일한 주소로 일관되게 파드를 호출할 수 있게 해줍니다.

서비스의 구조

실습: 서비스(Service)를 활용해 백엔드(Spring Boot) 서버와 통신해보기

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

요청 흐름 정리(NodePort → 서비스 → 파드)

1. 클라이언트의 요청

  • 외부 클라이언트가 노드(Node)의 nodePort: 30000으로 요청을 보냅니다.

2. 노드에서 서비스로 전달

  • 노드는 NodePort를 통해 들어온 요청을 서비스로 전달합니다.
  • 이 과정에서 포트 포워딩이 발생하며, 서비스의 port: 8080으로 요청이 전달됩니다.

3. 서비스에서 파드로 전달

  • 서비스는 로드밸런싱을 통해 연결된 파드 중 하나를 선택합니다.
  • 선택한 파드의 targetPort: 8080으로 요청을 전달합니다.

4. 파드의 응답

  • 파드는 요청을 처리하고, 응답을 서비스 → 노드 → 외부 클라이언트 순으로 반환합니다.

1. 매니페스트 파일 생성

매니페스트 파일을 추가로 생성하고, 아래와 같이 내용을 작성합니다.
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에 접근 가능

2. Service 종류

1. NodePort

NodePort는 클러스터 내의 각 노드(서버)에서 지정된 고정 포트를 열어 외부에서 해당 포트를 통해 서비스에 접근할 수 있도록 설정합니다.

  • 작동 방식:
    • 클러스터의 모든 노드에서 동일한 고정 포트(NodePort)가 열립니다.
    • 외부 사용자는 노드의 IP 주소와 NodePort를 사용해 서비스에 접근합니다.
    • NodePort는 30000~32767 범위 내의 포트를 사용하며, 명시하지 않으면 자동으로 할당됩니다.

2. ClusterIP

ClusterIP는 쿠버네티스 클러스터 내부에서만 접근할 수 있도록 설정된 기본 서비스 유형입니다. 쿠버네티스에서 서비스를 생성할 때, type을 따로 지정하지 않으면 기본적으로 ClusterIP로 설정됩니다.

  • 작동 방식:
    • 클러스터 내부에서만 접근 가능한 가상 IP(ClusterIP)를 생성합니다.
    • 클러스터 내 다른 파드나 서비스가 이 IP를 사용해 통신할 수 있습니다.
    • 외부에서 직접 접근은 불가능합니다.

3. LoadBalancer

LoadBalancer는 클라우드 제공자의 로드 밸런서를 이용해 외부에서 트래픽을 관리하고, 서비스로 전달합니다.

  • 작동 방식:
    • 클라우드 환경(AWS, Azure 등)에서 로드 밸런서를 생성합니다.
    • 로드 밸런서는 외부 IP를 통해 들어오는 요청을 NodePort로 전달하며, 적절히 분배합니다.
    • 외부 사용자는 로드 밸런서가 제공하는 외부 IP를 통해 서비스에 접근합니다.

3. 서비스 생성

매니페스트 파일을 사용해 서비스(Service)를 생성합니다.

$ kubectl apply -f spring-service.yaml

4. 서비스 상태 확인

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

$ kubectl get service

5. 서비스 접속 테스트

profile
donggyun_ee

0개의 댓글