본문 바로가기

k8s

4. Service

728x90

Pod는 언제든 죽고 다시 생성될 수 있는 것이 Kubernetes 환경이다.

 

즉 Pod가 죽게되면,

- Pod의 IP가 바뀔 수 있다.

- Pod의 이름도 바뀔 수 있다.

- Deployment 재배포 시 새 Pod 가 생성된다.

 

그러나 가변적인 Pod와는 달리, 평범한 애플리케이션 운영/이용자가 원하는건 아래와 같다.

- 항상 같은 주소로 접속하고 싶다.

- 여러 Pod에 트래픽을 분산하고 싶다.

- 특정 역할만을(web/db 등) 담당하는 Pod만 묶고 싶음.

 

이럴 때 사용하는 것이 Service이다.

Service 는 특정 Label을 가진 Pod들을 하나의 고정된 네트워크 엔드포인트로 묶어주는 객체

apiVersion: v1
kind: Service
metadata:
  name: svc-for-web

#k8s의 Service 정의 시작
spec:
  #가장 핵심이 되는 요소 selector!
  selector:
    # label에 type=web 이 있는 Pod를 찾아서 연결해라
    type: web
  ports:
  - port: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: svc-for-production
spec:
  selector:
    lo: production 
  ports:
  - port: 8080

 

Service의 역할

1. 고정 주소 제공

Pod의 IP는 계속 바뀌지만, Service의 이름은 바뀌지 않는다.

아래와 같은 방식으로도 호출이 가능하다.

curl svc-for-web:8080

 

2. 로드밸런싱

Service 뒤에 Pod가 여러 개 있으면 Service로 묶인 Pod에게 요청이 분산된다.

 

3. Pod 자동 발견

Pod를 정의 할 때, 

labels:

  type: web

만 정의되어 있어도 자동 포함된다.

즉, Service는 Pod를 동적으로 추적한다.

 

ports 부분에 대해서,

ports:
- port: 8080 #이렇게 port만 선언하면,
  targetPort: 8080 # targetPort는 port 값을 default로 따라간다. 즉, targetPort는 8080이 된다.

※ port -> client가 붙기 위한 Port
※ targetPort -> Pod의 Port

 

이런 구조에서는 client가 8080 포트를 사용하여 애플리케이션에 접근하면, 8080 Port를 갖는 Pod의 Service에 붙는다.

 

Service의 흐름

curl svc-for-web:8080 호출하면,

Service(svc-for-web)
        ↓
label type=web Pod 검색
        ↓
pod-1 / pod-4 발견
        ↓
둘 중 하나로 전달

 

잊지 말아햐 할 것

Service는 Pod를 "생성"하지 않는다.

Service는 오로지 이미 존재하는 Pod에 대해서 "연결"만 해준다.

[대략적인 흐름도]

사용자
 ↓
Ingress / LB
 ↓
Service
 ↓
Deployment
 ↓
Pod

Deployment → Pod 생성 관리
Service → Pod 연결/로드밸런싱
Ingress → 외부 URL 연결

'k8s' 카테고리의 다른 글

6. kubectl [create | apply | get | describe | delete | exec]  (0) 2026.05.08
5. Node Schedule  (0) 2026.05.07
3. labels  (0) 2026.05.07
1. Pod  (0) 2026.05.06
쿠버네티스 DAY1  (0) 2023.04.17