๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/Docker & Kubernetes

[Kubernetes] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค Deployment ๋ฐ Service ํŒŒ์ผ ๊ฐ€์ด๋“œ

by ๋ญ…์ฆค 2025. 2. 17.
๋ฐ˜์‘ํ˜•

1. ๊ฐœ์š”

Kubernetes์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๋ ค๋ฉด Deployment์™€ Service ํŒŒ์ผ์ด ํ•„์ˆ˜์˜ˆ์š”. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” deployment.yaml๊ณผ service.yaml์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ , ๊ฐ ์•„๊ทœ๋จผํŠธ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š”.

 

2. Deployment ํŒŒ์ผ (deployment.yaml)

Deployment๋Š” Kubernetes์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฆฌ์†Œ์Šค ์ค‘ ํ•˜๋‚˜์˜ˆ์š”.

๊ธฐ๋ณธ ์˜ˆ์ œ (deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
  labels:
    app: my-app
spec:
  replicas: 3  # ์‹คํ–‰ํ•  Pod ๊ฐœ์ˆ˜
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: nginx:latest  # ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€
        ports:
        - containerPort: 80  # ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋…ธ์ถœํ•  ํฌํŠธ

์ฃผ์š” ์•„๊ทœ๋จผํŠธ ์„ค๋ช…

ํ•„๋“œ ์„ค๋ช…
apiVersion ์‚ฌ์šฉํ•  Kubernetes API ๋ฒ„์ „ (apps/v1)
kind ์ƒ์„ฑํ•  ๋ฆฌ์†Œ์Šค ํƒ€์ž… (Deployment)
metadata ์ด๋ฆ„, ๋ผ๋ฒจ ๋“ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„ค์ •
spec.replicas ์ƒ์„ฑํ•  Pod ๊ฐœ์ˆ˜ (3๊ฐœ)
spec.selector.matchLabels ์–ด๋–ค ๋ผ๋ฒจ์„ ๊ฐ€์ง„ Pod๋ฅผ ๊ด€๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •
spec.template Pod์˜ ํ…œํ”Œ๋ฆฟ ์ •์˜ (์‹ค์ œ ์‹คํ–‰๋  ์ปจํ…Œ์ด๋„ˆ ์„ค์ •)
spec.template.spec.containers ๋ฐฐํฌํ•  ์ปจํ…Œ์ด๋„ˆ ์ •์˜
image ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ (์—ฌ๊ธฐ์„œ๋Š” nginx:latest)
ports.containerPort ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์—ด์–ด๋‘˜ ํฌํŠธ (80๋ฒˆ)

 

์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜

1๏ธโƒฃ Rolling Update ์„ค์ •

๋ฐฐํฌ ์ค‘ ๋ฌด์ค‘๋‹จ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด strategy๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”.

  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1  # ํ•œ ๋ฒˆ์— ๋ช‡ ๊ฐœ์˜ Pod๊ฐ€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋Š”์ง€
      maxSurge: 1  # ์ถ”๊ฐ€๋กœ ๋ช‡ ๊ฐœ์˜ Pod๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€

2๏ธโƒฃ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถ”๊ฐ€

        env:
        - name: ENV_VAR_NAME
          value: "my-value"

3๏ธโƒฃ ์ž์› ์ œํ•œ ๋ฐ ์š”์ฒญ ์„ค์ •

        resources:
          requests:
            cpu: "500m"  # ์ตœ์†Œ 0.5 CPU ํ•„์š”
            memory: "256Mi"  # ์ตœ์†Œ 256MB ๋ฉ”๋ชจ๋ฆฌ ํ•„์š”
          limits:
            cpu: "1"  # ์ตœ๋Œ€ 1 CPU ์‚ฌ์šฉ ๊ฐ€๋Šฅ
            memory: "512Mi"  # ์ตœ๋Œ€ 512MB ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

 

3. Service ํŒŒ์ผ (service.yaml)

Service๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ Pod์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•ด์š”.

๊ธฐ๋ณธ ์˜ˆ์ œ (service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app  # ์—ฐ๊ฒฐํ•  Pod์˜ ๋ผ๋ฒจ ์ง€์ •
  ports:
  - protocol: TCP
    port: 80  # ์„œ๋น„์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๋…ธ์ถœํ•˜๋Š” ํฌํŠธ
    targetPort: 80  # ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํฌํŠธ
  type: ClusterIP  # ๊ธฐ๋ณธ๊ฐ’ (ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ)

์ฃผ์š” ์•„๊ทœ๋จผํŠธ ์„ค๋ช…

ํ•„๋“œ ์„ค๋ช…
apiVersion ์‚ฌ์šฉํ•  Kubernetes API ๋ฒ„์ „ (v1)
kind ์ƒ์„ฑํ•  ๋ฆฌ์†Œ์Šค ํƒ€์ž… (Service)
metadata ์ด๋ฆ„, ๋ผ๋ฒจ ๋“ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„ค์ •
spec.selector ์—ฐ๊ฒฐํ•  Pod๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ผ๋ฒจ (app: my-app)
spec.ports ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ํฌํŠธ ์„ค์ •
port ์„œ๋น„์Šค๊ฐ€ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋Š” ํฌํŠธ (80)
targetPort ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ (80)
type ์„œ๋น„์Šค ํƒ€์ž… (๊ธฐ๋ณธ๊ฐ’: ClusterIP)

Service ํƒ€์ž… ์ข…๋ฅ˜

ํƒ€์ž… ์„ค๋ช…
ClusterIP ๊ธฐ๋ณธ๊ฐ’, ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ (์™ธ๋ถ€ ์ ‘๊ทผ ๋ถˆ๊ฐ€)
NodePort ๋…ธ๋“œ์˜ ํŠน์ • ํฌํŠธ๋ฅผ ์—ด์–ด ์™ธ๋ถ€์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ (30000-32767 ๋ฒ”์œ„)
LoadBalancer ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ
ExternalName DNS ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐ

NodePort ์‚ฌ์šฉ ์˜ˆ์ œ

  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080  # ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ (30000-32767 ๋ฒ”์œ„ ๋‚ด์—์„œ ์„ค์ • ๊ฐ€๋Šฅ)

 

 

 

4. Deployment์™€ Service ์ ์šฉ ๋ฐฉ๋ฒ•

1๏ธโƒฃ Deployment ๋ฐ Service ์ƒ์„ฑ

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

2๏ธโƒฃ ๋ฐฐํฌ ์ƒํƒœ ํ™•์ธ

kubectl get pods
kubectl get services

3๏ธโƒฃ Service๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ธฐ

  • ClusterIP ํƒ€์ž…: ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ curl http://my-app-service:80 ์‚ฌ์šฉ
  • NodePort ํƒ€์ž…: http://<๋…ธ๋“œ IP>:30080 ๋กœ ์ ‘์† ๊ฐ€๋Šฅ
  • LoadBalancer ํƒ€์ž…: ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ํผ๋ธ”๋ฆญ IP ํ• ๋‹น ํ›„ ์ ‘์†

 

  • Deployment๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋กœ, replicas, image, rollingUpdate ๋“ฑ์˜ ์„ค์ •์ด ์ค‘์š”ํ•ด์š”.
  • Service๋Š” Pod์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋ฉฐ, ClusterIP, NodePort, LoadBalancer ๋“ฑ์˜ ํƒ€์ž…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์‹ค๋ฌด์—์„œ๋Š” Deployment์™€ Service๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ AI ๋ชจ๋ธ ์„œ๋น™, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”.

์ด ๊ธ€์„ ํ†ตํ•ด deployment.yaml๊ณผ service.yaml์˜ ๊ตฌ์กฐ์™€ ์•„๊ทœ๋จผํŠธ๋ฅผ ์ดํ•ดํ•˜๊ณ , Kubernetes ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง์ ‘ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•