본문 바로가기
DevOps/Kubernetes

[Kubernetes] YAML에서 Deploy(Deployment)와 Service의 차이

by Yoon_estar 2025. 2. 26.
728x90

💡개요

쿠버네티스(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을 직접 작성하여 실습하면서 개념을 확실히 이해하는 것이 중요합니다.