본문 바로가기
인프라/Kubernetis

[minikube] Service 란 무엇인가(ClusterIP)?

by devthrive 2025. 8. 23.
반응형

쿠버네티스(Kubernetes)에서 Service는 파드(Pod) 집합의 네트워크 접근지점을 추상화해주는 리소스입니다. 이를 통해 파드의 동적 생성·종료에도 불구하고 안정적인 접속 위치를 제공하며, 로드밸런싱을 통해 트래픽을 분산시켜 줍니다. 아래는 블로그에 쓸 수 있도록 내용 요약입니다.

쿠버네티스 Service란?
 - 파드 집합에 고정된 네트워크 엔드포인트를 제공하는 객체
   (파드가 생성·삭제되어도 일관된 IP, DNS로 접근 가능, Pod는 재실행시 동적 IP로 인해 IP가 변경 될 가능 성이 있음.)
 - 서비스 셀렉터(Selector)로 연관된 파드 집합의 트래픽을 자동 분배
 - 서비스 타입(Service Type)이 다양하여 사용 목적별 구성 가능.

 - 같은 pod의 컨테이너는 localhost를 통해 서로 통신 가능.

 

쿠버네티스 Service 주요 타입

서비스 타입 설명 및 용도
ClusterIP 기본값. 클러스터 내부에서만 접근 가능한 IP 부여. 마이크로서비스 내부 통신에 사용
NodePort 클러스터 외부에서 노드의 지정 포트를 통해 접근. 테스트·개발용, 외부 트래픽 진입 시 사용
LoadBalancer 클라우드 환경에서 외부 로드밸런서 자동 할당 및 연동. 대규모 서비스, 외부 트래픽에 적합
ExternalName 내부에서 외부 DNS 이름으로 프록시. 외부 DB·API 등과 연동 시 활용
Headless DNS를 통해 파드별로 IP를 직접 노출. 상태 기반 애플리케이션, 직접 연결이 필요한 경우.


Service의 필요성과 장점
 - 파드 변경(롤링 업데이트 등)에 상관없이 서비스 IP/DNS가 고정되어 서비스 무중단 운영 가능
 - 로드밸런싱과 네트워크 추상화를 통해 클라우드 네이티브 환경에서 일관된 서비스 제공.

 - Pod의 수명주기 문제 해결

   (파드는 생성 및 삭제가 일어나며, 동적 IP로 인해 변경 될 수 있음, 동적 속성에도 일관된 네트워크 엔드포인트 제공)

 

mypod -> deployment pod 쪽으로 통신 확인

같은 클러스터 안에서는 pod끼리 통신이 가능해서 잘 나옴

 

내부에서만 통신이 가능하지만 외부로 가가고 들어오는 서비스쪽에서는 통신이 안됨.

 - 이렇게 되면 다른 서비스 이용시 서로 통신이 안되어 서비스 장애가 발생할 수 있음.

 

그래서 서비스를 분리 후 서로 통신이 가능하게끔 해야함

 

my-service.yaml 작성

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: feel
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80
주요 필드 설명
apiVersion: v1

my-service.yaml

apiVersion: v1

 - Service 리소스의 API 버전입니다. 쿠버네티스의 기본 리소스들은 대부분 v1 사용.

kind: Service
 - 생성할 객체가 Service임을 명시합니다.

metadata.name: my-service
 - 서비스의 이름입니다. 이 이름은 동일 네임스페이스 내에서 고유해야 하며, DNS 이름 등 클러스터 내부 서비스 디스커버리에 활      용됩니다.

spec.selector: app: feel
 - 이 서비스가 트래픽을 전달할 파드를 선택하는 기준이 되는 라벨 셀렉터입니다.
    라벨이 app: feel로 지정된 모든 파드가 Service의 엔드포인트(Endpoints)로 등록됩니다.
    이 셀렉터로 파드 집합을 동적으로 관리할 수 있어, 신규 배포 또는 스케일링도 자동 반영됩니다.

spec.ports
 - 서비스가 외부/내부로 노출하는 포트와, 백엔드 파드가 실제로 리슨하는 포트를 매핑합니다.


protocol

 - 주로 TCP (필요시 UDP 등 변경 가능)


port 

 - 클러스터 내에서 서비스가 열어둘 포트 번호 (my-service:8080으로 접근)

targetPort

 - 이 서비스에 연결된 요청을 파드의 몇 번 포트로 전달할지 지정. 보통 컨테이너 내부에서 열려 있는 실제 포트와 일치시킵니다.

 

 

my-service.yml 작성 후 apply

 

service 정상 작동하는지 확인

my-service에 feel-deployment~ Pod들이 다 들어가 있음.

 

혹시 안들어 가져 있다면 해당 명령어로 통해 app=feel <<이 부분이 my-service.yaml selector 부분이랑 오타가 없는지 확인

 

이후 service ClusterIP Port가 8080 -> pod Port가 80으로 맵핑이 되어 접속이 가능함

반응형