💡개요
쿠버네티스(kubernetes)에서 애플리케이션을 배포할 때, Deploymentd와 Service는 핵심적인 역할을 합니다. 많은 사람들이 이 두가지를 혼동하기 쉬운데, 실제로는 각기 다른 목적을 가지고 있습니다. 이 글에서는 Deployment와 Service의 개념과 차이점, 그리고 실제 YAML 예제를 통해 어떻게 구성되는지 자세히 살펴보겠습니다.
🔍 Deployment란?
Deployment는 애플리케이션을 실행할 POD(파드)를 생성하고 관리하는 오브젝트(Object)입니다. 단순히 Pod를 생성하는 것이 아니라 스케일링(Scaling), 롤링 업데이트(Rolling Update), 롤백(Rollback)등의 기능을 제공합니다.
🧩 Deployment의 주요 기능
- Pod의 생성 및 관리 : Pod의 개수를 설정하고 유지
- 자동 복구(Self-healing) : 장애가 발생한 Pod를 자동으로 재시작
- 롤링 업데이트(Rolling Update) : 무중단 배포를 지원
- 롤백 기능 : 문제가 발생하면 이전 버전으로 북구 가능
🗒️ Deployment YAML 예제
tapiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 3 # 3개의 Pod 실행
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app-image:v1
ports:
- containerPort: 80
🗂️Deployment 설명
- replicas : 3 → 3개의 Pod를 실행
- selector.matchLabels.app : my-app → 라벨이 my-app인 Pod만 관리
- template.spec.containers → 컨테이너 정의, image: my-app-image:v1 로 애플리케이션 실행
🔍 Service란?
Service는 쿠버네티스 클러스터 내에서 실행 중인 Pod를 네트워크적으로 연결하는 역할을 합니다. Pod는 동적으로 생성/삭제되기 때문에 IP 주소가 변할 수 있는데, Service는 이러한 Pod들을 하나의 고정된 엔드포인트(/Stable Endpoint)로 접근할 수 있도록 해줍니다.
🧩 Service의 주요 기능
- Pod 간의 네트워크 연결 관리
- 부하분산(Load Balancing) 기능 제공
- Pod의 IP 주소가 변해도 고정된 접근 방식 제공
- 외부 트래픽을 내부 Pod로 라우팅 가능(NodePort, LoadBalancer)
🗒️ Service YAML 예제
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
🗂️Service 설명
- selector.app: my-app → my-app 라벨이 있는 Pod와 연결
- ports.pot: 80, targetPort: 80 → Pod의 containerPort: 80 과 연결
- type: ClusterIP → 클러스터 내부에서만 접근 가능한 서비스
🚩 Deployment와 Service의 차이점
항목 | Deployment | Service |
역할 | 애플리케이션(Pod) 배포 및 관리 | 네트워크 연결 부하 분산 |
리소스 종류 | apps/v1 | v1 |
주요 기능 | Pod 생성, 삭제, 업데이트, 복구 | Pod간 네트워크 연결, 로드밸런싱, 외부 접근 |
예제 키워드 | kind: Deployment | kind: Service |
연결 방식 | Pod 템플릿을 기반으로 컨테이너 실행 | selector를 이용해 Pod와 연결 |
🧪 Deployment와 Service 의 관계
Deployment만 배포하면 Pod가 실행되지만, 외부에서 접근할 방법이 없습니다. 따라서 Service를 함께 정의하여 트래픽을 특정 Pod로 전달해야합니다. Deployment는 애플리케이션의 실행을 담당하고, Service는 실행된 애플리케이션에 네트워크를 통해 접근할 수 있도록 해주는 역할을 합니다.
🗒️ Deployment + Service YAML 예제
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app-image:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
💡Service의 타입
쿠버네티스 Service는 여러 가지 타입이 있으며, 용도에 맞게 선택할 수 있습니다.
타입 | 설명 |
ClusterIP | (기본값) 클러스터 내부에서만 접근 가능 |
Nodeport | 노드의 특정 포트를 통해 외부 접근 가능 |
LoadBalancer | 클라우드 제공자의 로드밸런서를 통해 외부 접근 가능 |
ExternalName | 외부 도메인 이름으로 라우팅 |
🗒️ NodePort타입 예제
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
type: NodePort
🏆 결론
쿠버네티스에서 Deployment와 Service는 서로 보완적인 관계를 가집니다.
- Deployment는 Pod를 생성하고 관리하는 역할을하며, 애플리케이션의 스케일링, 복구, 업데이트 등을 담당합니다.
- Service는 Pod 간 네트워크 연결을 담당하며, 클러스터 내부 또는 외부에서 Pod에 접근할 수 있도록 해줍니다.
따라서 쿠버네티스에서 애플리케이션을 배포할 때는 Deployment와 Service를 함께 사용해야합니다. YAML을 직접 작성하여 실습하면서 개념을 확실히 이해하는 것이 중요합니다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] containerd VS CRI-O 차이점 (0) | 2025.03.01 |
---|---|
[Kubernetes] Kubernetes NodePort란? (0) | 2025.02.28 |
[EKS] aws-load-balancer-controller 배포 (0) | 2025.02.14 |
[EKS] EKS 애플리케이션 배포 실습 (0) | 2025.02.13 |
[Kubernetes] Kubernetes에서 PV(Persistent Volume)와 PVC(Persistent Volume Claim)의 관계 (0) | 2025.02.12 |