쿠버네티스(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으로 맵핑이 되어 접속이 가능함
'인프라 > Kubernetis' 카테고리의 다른 글
[minikube] 마스터노트와 워커 노드 재설치 (0) | 2025.09.06 |
---|---|
[minikube] Helm, Helm Chart 설치하기 (1) | 2025.08.28 |
[minikube]Pod, Replicaset, Deployment 실습 하기 (0) | 2025.08.14 |
[minikube] 레플리카셋(replicaset)과 디플로이먼트(Deployment) (2) (2) | 2025.08.13 |
[minikube] 레플리카셋(replicaset)과 디플로이먼트(Deployment) (1) (2) | 2025.08.12 |