Post

Chat GPT 질문 2

Chat GPT 질문 2

1. containerd와 docker의 차이점

containerd와 Docker는 둘 다 컨테이너 런타임 관련 기술이지만, 하는 역할과 범위가 달라요.

1-1. Docker

개발자 친화적인 올인원 플랫폼으로서 Docker는 단순한 컨테이너 런타임이 아니라:

  • 이미지 빌드 (docker build)
  • 이미지 배포 (docker push/pull)
  • 컨테이너 실행/관리 (docker run, docker ps)
  • 네트워킹, 볼륨, 플러그인 관리

까지 제공하는 엔드투엔드 도구 세트예요.
내부적으로 컨테이너 실행을 위해 containerd를 사용해 왔어요.
즉, Docker = CLI + API + 빌드 도구 + containerd + runc 조합.

1-2. containerd

컨테이너 실행을 책임지는 런타임으로서 CNCF(Cloud Native Computing Foundation)에 기여된 독립 프로젝트.

역할은 단순해요:

  • 컨테이너 이미지 가져오기 (pull)
  • 이미지 관리
  • 컨테이너 실행/중지
  • 컨테이너 파일시스템, 네트워킹 기초 지원

자체 CLI(ctr)는 있지만, 개발자 친화적이지 않고 주로 쿠버네티스 같은 오케스트레이터가 containerd API를 통해 컨테이너를 다루어요.
실행 자체는 containerd가 runc 같은 하위 런타임을 호출해서 이루어져요.

1-3. 구조 비교

1
2
3
4
5
6
7
8
9
[ Docker ]
 ├─ CLI (docker)
 ├─ Docker Engine (API 서버, 빌드 등)
 └─ containerd (컨테이너 관리)
      └─ runc (실제 컨테이너 실행)

[ containerd 단독 사용 ]
 ├─ containerd (컨테이너 관리)
 └─ runc (실행)

1-4. 차이 요약

구분Dockercontainerd
성격플랫폼/툴체인런타임
기능 범위빌드, 배포, 실행, 네트워크, 볼륨 등 포함컨테이너 이미지 관리 & 실행 중심
사용 대상개발자 (CLI 편리함)쿠버네티스/시스템 수준
의존 관계내부적으로 containerd를 사용독립 실행 가능
CLIdockerctr (불편, 디버깅용)

1-5. 👉 요약하면,

  • Docker는 개발자를 위한 올인원 도구 세트
  • containerd는 쿠버네티스 같은 시스템이 쓰는 저수준 런타임

2. 쿠버네티스(Kubernetes)에서 containerd가 Docker를 대체하게된 배경

2-1. 원래 쿠버네티스와 Docker의 관계

초창기 쿠버네티스는 컨테이너 실행을 위해 Docker를 직접 사용했어요.
Pod를 실행할 때 내부적으로 kubelet → Docker Engine → containerd → runc 이런 구조였죠.

2-2. 문제점

시간이 지나면서 몇 가지 문제가 드러났어요:

  • 중간 계층(오버헤드) 문제: 실제 컨테이너 실행에는 containerd + runc만 있으면 충분한데, Docker는 Docker Engine이라는 무거운 레이어가 하나 더 있었음.
  • 쿠버네티스 입장에서는 필요 없는 빌드/CLI 기능도 로드해야 했음.
  • CRI(Container Runtime Interface) 불일치
  • 쿠버네티스는 런타임을 추상화하기 위해 CRI라는 표준 API를 만들었어요.
  • Docker는 CRI를 지원하지 않았음 → dockershim이라는 별도의 번역기 계층을 두어야 했음.
  • 관리 복잡성이 증가했음.
  • 운영/성능 부담
  • Docker는 개발자 친화적이지만, 쿠버네티스가 원하는 건 “컨테이너 실행” 뿐.
  • 불필요한 기능이 많아서 리소스 낭비 + 성능 저하 가능성이 있었음.

2-3. containerd로 전환

containerd는 쿠버네티스 CRI를 네이티브로 지원해요. → dockershim이 필요 없어짐.
단순하고 경량 → 성능과 안정성이 개선됨.
CNCF(쿠버네티스를 관리하는 재단)에서 containerd도 관리 → 생태계 일관성 ↑.

2-4. 결과: Docker 지원 종료 (2020 발표, 2021~2022 전환)

Kubernetes v1.20에서 “Dockershim Deprecation” 발표.
v1.24부터는 공식적으로 Docker 지원 제거.
지금은 containerd, CRI-O 같은 CRI 호환 런타임을 권장.

2-5. 현재 상황

  • 개발 환경: 여전히 Docker를 많이 씀 (빌드/실행 편리).
  • 운영 환경(쿠버네티스): 주로 containerd 또는 CRI-O 사용.
  • Docker로 만든 이미지는 그대로 containerd에서 실행 가능 (이미지 포맷 표준 OCI 때문).

2-6. ✅ 정리하면,

쿠버네티스는 경량·표준화된 런타임(containerd)만 필요했기 때문에 “Docker → containerd”로 옮겨간 거예요.

3. 헬름과 커스토마이즈의 차이

쿠버네티스에서 Helm(헬름)Kustomize(커스토마이즈)는 모두 매니페스트 관리 도구인데, 접근 방식이 다릅니다.

3-1. Helm (헬름)

쿠버네티스의 패키지 매니저 (리눅스의 apt, yum 같은 역할).
앱을 Chart라는 패키지 형태로 배포/관리.

주요 특징:

  • 템플릿 기반: values.yaml 파일에 값만 넣으면 템플릿이 채워짐.
  • 패키지 레지스트리(Helm Hub 등)에서 차트를 가져와 바로 설치 가능 (helm install).
  • 배포/업데이트/롤백 기능 내장.
  • 복잡한 애플리케이션도 하나의 Chart로 관리 가능 (예: nginx + redis + db 같이).

단점:

  • 템플릿 복잡성 → 디버깅 어렵고, YAML 재사용 구조가 덜 투명함.
  • 학습 난이도가 있음.

3-2. Kustomize (커스토마이즈)

kubectl에 내장된 오버레이(Overlay) 도구.
매니페스트를 템플릿화하지 않고, YAML을 조합/변형하는 방식.

주요 특징:

  • kustomization.yaml 파일을 정의해서 base 매니페스트를 overlay로 확장.
  • 예: dev, staging, prod 환경마다 레이블/리소스 값만 patch.
  • 템플릿 언어가 아니라 YAML을 그대로 유지 → 읽기 쉽고 구조적.
  • 쿠버네티스 표준 도구(kubectl apply -k)로 바로 사용 가능.

단점:

  • Helm처럼 패키지 관리(저장소, 버전 관리)는 없음.
  • 아주 복잡한 앱 배포에는 다소 부족할 수 있음.

3-3. 비교 정리

|구분|Helm|Kustomize| |—|—|—| |성격|패키지 매니저 (쿠버네티스의 apt/yum)|매니페스트 커스터마이징 도구| |접근 방식|템플릿 + values.yaml|오버레이 방식 (patch, merge)| |배포|helm install → 릴리스 관리 (rollback 가능)|kubectl apply -k (단순 배포, 롤백 없음)| |패키지화|Chart 공유 가능 (Helm Hub, private repo)|패키지 개념 없음 (GitOps와 잘 맞음)| |학습 난이도|상대적으로 높음 (템플릿 언어)|비교적 낮음 (순수 YAML 변형)| |사용 예시|nginx ingress, prometheus 등 오픈소스 배포|환경별(dev/prod) 설정 차이 관리|

3-4. ✅ 정리

  • Helm: “앱 설치/업데이트/패키지 관리까지 해주는 쿠버네티스 앱스토어”
  • Kustomize: “같은 매니페스트를 환경별로 깔끔하게 변형하는 도구”

👉 실제 현업에서는 Helm + Kustomize를 같이 쓰는 경우도 많습니다.

  • Helm 차트로 앱을 설치
  • Kustomize로 환경별 overlay 적용

4. 쿠버네티스 매니페스트 그리고 Helm Chart 예시 vs Kustomize Overlay 예시

4-1. 매니페스트(Manifest)란?

쿠버네티스에서 리소스를 정의하는 YAML/JSON 문서를 말해요.
“내가 원하는 상태(Desired State)”를 쿠버네티스 API 서버에 전달하는 역할.
쿠버네티스는 이 매니페스트를 읽고, 실제 클러스터 상태를 맞추기 위해 동작합니다.

예: Deployment 매니페스트 (nginx 실행)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

👉 이 파일을 kubectl apply -f deployment.yaml 하면, 쿠버네티스는 nginx:1.25 컨테이너가 2개 떠 있도록 유지해줍니다.

4-2. Helm Chart 예시

Helm은 매니페스트를 템플릿 + 값(values.yaml) 구조로 관리합니다.

values.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
replicaCount: 3
image:
  repository: nginx
  tag: "1.25"

deployment.yaml (템플릿)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Chart.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ .Chart.Name }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: {{ .Values.image.repository }}:{% raw %}{{ .Values.image.tag }}
        ports:
        - containerPort: 80
  • 👉 helm install myapp ./mychart -f values.yaml 하면 템플릿이 채워져서 쿠버네티스에 배포됩니다.
  • 👉 Helm은 릴리스 단위로 관리하기 때문에, 버전업/롤백이 쉽습니다.

4-3. Kustomize Overlay 예시

Kustomize는 매니페스트를 그대로 두고, 환경별로 patch하는 방식입니다.

base/deployment.yaml (공통)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25

overlays/prod/kustomization.yaml
resources:
  - ../../base

patches:
  - target:
      kind: Deployment
      name: nginx
    patch: |
      - op: replace
        path: /spec/replicas
        value: 3
  • 👉 kubectl apply -k overlays/prod 하면 replicas가 3으로 적용된 상태가 배포됩니다.
  • 👉 템플릿 문법 없이 YAML 그대로 관리 가능.

4-4. 한 줄 정리

  • 매니페스트 = 쿠버네티스 리소스를 정의한 YAML/JSON
  • Helm = 매니페스트를 패키지(Chart)로 만들고, 템플릿 + values 방식으로 재사용
  • Kustomize = 매니페스트를 그대로 두고, 환경별 차이를 patch/overlay

혹시 제가 여기서 “언제 Helm을 쓰고, 언제 Kustomize를 쓰는 게 좋은지 (실무 시나리오별)”까지 정리해드릴까요?

5. 실무에서 Helm과 Kustomize를 사용하는 시나리오

5-1. ✅ Helm이 적합한 경우

5-1-1. 오픈소스 애플리케이션 설치

예: nginx ingress controller, prometheus, grafana, cert-manager
이미 Helm Chart로 배포되는 경우가 많아서 그냥 helm install로 설치하면 끝.
➝ 패키지 관리자로 쓰기 딱 좋음.

5-1-2. 복잡한 애플리케이션 배포

여러 리소스(Deployment, Service, ConfigMap, Secret, CRD 등)를 한꺼번에 배포할 때 유용.
Chart 안에서 모든 리소스 관계를 관리 가능.
버전/릴리스 관리 필요하면 helm upgrade, helm rollback으로 손쉽게 버전 관리.
운영 환경에서 장애 시 빠른 롤백에 유리.

5-1-3. ✅ Kustomize가 적합한 경우
  • 환경별 설정 차이 관리(dev/staging/prod)
  • 공통 매니페스트(Base) + 환경별 Overlay (replica 수, 이미지 태그, 리소스 제한 등).
  • 템플릿 언어 없이 YAML 그대로 유지 가능 → GitOps에 특히 적합.
  • 단순 커스터마이징: ConfigMap, Secret, Label, Annotation 등 간단한 차이만 반영할 때.
  • 별도 툴 설치 없이 kubectl apply -k로 바로 실행 가능.
  • GitOps 워크플로우: ArgoCD, Flux 같은 GitOps 툴과 잘 맞음.
  • 선언적 관리 → Git에 기록된 매니페스트 그대로 동작.
5-1-4. ✅ Helm + Kustomize 같이 쓰는 경우

실무에서는 두 개를 섞어서 쓰기도 합니다:

  • Helm: 오픈소스 앱을 설치 (예: helm install ingress-nginx)
  • Kustomize: 그 설치된 매니페스트를 환경별로 overlay (예: dev는 replica=1, prod는 replica=3)

이런 조합이 흔해요 → Helm은 패키지, Kustomize는 환경별 차이 관리

5-2. 📝 요약

  • Helm = 앱 설치·배포·업데이트 관리에 강함 (쿠버네티스의 apt/yum)
  • Kustomize = 매니페스트 커스터마이징·환경별 설정 관리에 강함 (overlay 도구)

실무에서는 Helm + Kustomize를 같이 쓰는 경우 많음

6. 헬름의 chart 구조

6-1. Helm Chart란?

  • 쿠버네티스 애플리케이션을 패키지화한 디렉토리 구조로서 매니페스트(YAML) + 템플릿 + 설정값(values) + 메타데이터 등을 모아놓은 것
  • helm install myapp ./mychart 하면 Chart 전체가 쿠버네티스에 배포됨

6-2. 기본 Chart 디렉토리 구조

helm create mychart 하면 생성되는 예시:

1
2
3
4
5
6
7
8
9
10
mychart/
├── Chart.yaml          # Chart 메타데이터 (이름, 버전 등)
├── values.yaml         # 기본 설정값 (사용자가 override 가능)
├── charts/             # 의존성 chart 저장 (subcharts)
├── templates/          # 쿠버네티스 매니페스트 템플릿 모음
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl    # 템플릿 함수/공통 정의
│   └── NOTES.txt       # 설치 후 사용자에게 안내 메시지
└── .helmignore         # 빌드 시 제외할 파일/폴더 (.git, README 등)

6-3. 주요 파일 설명

6-3-1. 🟢 Chart.yaml

Chart의 메타데이터 (앱 이름, 버전, 설명 등)

1
2
3
4
5
6
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
6-3-2. 🟢 values.yaml

사용자가 설정할 수 있는 기본 값으로서 템플릿에서 .Values로 접근

1
2
3
4
5
6
7
replicaCount: 2
image:
  repository: nginx
  tag: "1.25"
service:
  type: ClusterIP
  port: 80
6-3-3. 🟢 templates/

실제 쿠버네티스 매니페스트 템플릿으로서 Go 템플릿 문법 사용

1
2
3
4
5
6
7
8
9
10
11
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Chart.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
      - name: nginx
        image: "{{ .Values.image.repository }}:{% raw %}{{ .Values.image.tag }}"
6-3-4. 🟢 _helpers.tpl

재사용 가능한 헬퍼 함수 모음

1
2
3
{{- define "mychart.fullname" -}}
{{ .Release.Name }}}-{{ .Chart.Name }}
{{- end }}
6-3-5. 🟢 NOTES.txt

Chart 설치 후 사용자에게 보여줄 메시지

1
2
1. Get the application URL by running these commands:
   kubectl get svc {{ include "mychart.fullname" . }}

6-4. 실행 흐름

  1. helm install myapp ./mychart -f custom-values.yaml 실행
  2. Helm이 values.yaml + custom-values.yaml 병합
  3. templates/의 매니페스트 템플릿을 값으로 렌더링
  4. 최종 YAML을 쿠버네티스 API 서버에 적용

6-5. ✅ 요약

  • Chart.yaml → 메타데이터
  • values.yaml → 기본 설정값
  • templates/ → 매니페스트 템플릿
  • charts/ → 의존성 Chart
  • _helpers.tpl → 공통 함수
  • NOTES.txt → 설치 안내 메시지

나의 말:

7. argo cd 배포화면에 나오는 rs

Argo CD에서 애플리케이션을 배포하면 Deployment를 보통 사용하게 되는데, 이때 쿠버네티스가 자동으로 ReplicaSet (RS) 을 생성합니다.

7-1. ✅ ReplicaSet(RS)란?

쿠버네티스 리소스 중 하나로, 특정 수의 Pod 레플리카(복제본)가 항상 실행되도록 보장해주는 역할.
Deployment가 직접 Pod를 관리하지 않고, ReplicaSet을 생성해서 관리하게 되어 있어요.

즉: Argo CD → Deployment 생성 → ReplicaSet 생성 → Pod 생성

7-2. ✅ 동작 예시

7-2-1. Argo CD에서 nginx Deployment 적용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
7-2-2. 쿠버네티스 내부 동작

1) Deployment nginx 생성

2) Deployment가 자동으로 ReplicaSet 생성 (예: nginx-7c9d4c5b6d)

3) ReplicaSet이 replicas=3을 보고 Pod 3개 실행 (nginx-7c9d4c5b6d-abcde …)

7-2-3. ✅ ReplicaSet과 Deployment 관계

ReplicaSet은 Pod를 일정 개수 유지하는 역할만 함.
Deployment는 상위 개념으로, 새로운 ReplicaSet 생성 (버전 변경 시) 롤링 업데이트 / 롤백 관리 / 전략적 배포 (RollingUpdate, Recreate 등) 수행

즉,

  • ReplicaSet = “Pod 복제본 유지 관리”
  • Deployment = “ReplicaSet을 버전별로 관리 + 배포 전략 수행”

7-3. ✅ Argo CD에서 보이는 RS

Argo CD UI에서 Deployment를 배포하면, 그 하위에 ReplicaSet이 생성된 걸 볼 수 있어요.
예를 들어: nginx Deployment → nginx-7c9d4c5b6d ReplicaSet → nginx-7c9d4c5b6d-xxxxx Pod들

7-4. 👉 정리

Argo CD에서 보이는 RS는 ReplicaSet이에요.
Deployment가 생성한 Pod를 실제로 관리하는 리소스.
버전이 바뀌면 새 ReplicaSet이 생기고, 이전 ReplicaSet은 점점 Pod 수가 줄어듭니다.

8. Deployment 업데이트 시 ReplicaSet이 2개 이상 생기고 롤링 업데이트 되는 과정을 단계별로 정리

8-1. 초기 상태

Argo CD로 nginx:1.25 버전의 Deployment를 배포했다고 가정해요.

1
2
3
Deployment (nginx)
 └─ ReplicaSet (nginx-7c9d4c5b6d)  → replicas=3
      └─ Pod 3개 (nginx:1.25)

8-2. 새로운 버전 배포 (nginx:1.26)

Argo CD에서 매니페스트가 업데이트되면, Deployment는 기존 ReplicaSet을 유지하면서 새 ReplicaSet을 생성합니다.

1
2
3
Deployment (nginx)
 ├─ ReplicaSet (nginx-7c9d4c5b6d)  → replicas=3 (구 버전, nginx:1.25)
 └─ ReplicaSet (nginx-65f7c8a9b7)  → replicas=0 (신 버전, nginx:1.26)

8-3. 롤링 업데이트 진행

Deployment의 기본 전략은 RollingUpdate입니다.
즉, Pod을 한꺼번에 모두 교체하지 않고, 순차적으로 바꿔요.

예: maxUnavailable=1, maxSurge=1인 경우:

  • 새로운 ReplicaSet에서 Pod 1개 생성 (nginx:1.26)
  • 기존 ReplicaSet에서 Pod 1개 제거 (nginx:1.25 → -1개)
  • 이 과정을 반복 → 점점 신 버전 Pod 수가 늘고, 구 버전 Pod 수가 줄어듬

8-4. 최종 상태

업데이트가 완료되면 구 버전 ReplicaSet은 Pod 수가 0이 되고, 새 ReplicaSet만 남습니다.

1
2
3
Deployment (nginx)
 ├─ ReplicaSet (nginx-7c9d4c5b6d)  → replicas=0 (구 버전)
 └─ ReplicaSet (nginx-65f7c8a9b7)  → replicas=3 (신 버전, nginx:1.26)

👉 하지만 구 ReplicaSet 자체는 롤백할 때 다시 사용 가능하도록 삭제되지 않고 남아 있음.

8-5. 그림으로 요약

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
초기
Deployment
 └─ RS (old) → Pod: v1 x3

업데이트 시작
Deployment
 ├─ RS (old) → Pod: v1 x2
 └─ RS (new) → Pod: v2 x1

업데이트 중
Deployment
 ├─ RS (old) → Pod: v1 x1
 └─ RS (new) → Pod: v2 x2

업데이트 완료
Deployment
 ├─ RS (old) → Pod: v1 x0
 └─ RS (new) → Pod: v2 x3

8-6. ✅ 정리

  • Deployment는 버전별로 ReplicaSet을 생성해 Pod를 관리.
  • 롤링 업데이트 시 구 ReplicaSet은 점점 Pod 수가 줄고, 새 ReplicaSet은 Pod 수가 늘어남.
  • 최종적으로 구 ReplicaSet은 Pod 0개 상태로 남아 있어 롤백에 사용 가능.

9. maxUnavailable, maxSurge

maxUnavailable과 maxSurge는 Deployment의 롤링 업데이트(RollingUpdate) 전략에서 Pod를 얼마나 동시에 줄이고 늘릴 수 있는지를 제어하는 옵션이에요.

9-1. RollingUpdate 전략 기본 구조

Deployment에서 업데이트 전략은 두 가지가 있어요:

  • Recreate : 기존 Pod 전부 삭제 후 새 Pod 생성 (다운타임 발생 가능)
  • RollingUpdate : 기존 Pod을 조금씩 줄이고 새 Pod을 조금씩 늘려서 무중단 업데이트

RollingUpdate일 때 두 가지 핵심 파라미터 maxUnavailable, maxSurge가 등장합니다.

9-2. maxUnavailable

  • 업데이트 중에 최소 몇 개까지 Pod가 줄어들 수 있는지 (Unavailable 허용치).
  • 숫자 또는 비율(%)로 지정 가능.

예: replicas=10, maxUnavailable=2 → 업데이트 중 최소 8개는 항상 살아 있어야 함.

9-3. maxSurge

  • 업데이트 중에 최대 몇 개까지 Pod를 추가로 더 만들 수 있는지 (Surge 허용치).
  • 숫자 또는 비율(%)로 지정 가능.

예: replicas=10, maxSurge=3 → 업데이트 중 순간적으로 최대 13개 Pod까지 늘어날 수 있음.

9-4. 예시 시나리오

Deployment 매니페스트 예시:

1
2
3
4
5
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 1
    maxSurge: 1

replicas=5 라고 하면:

  • 업데이트 시작 시, 새 Pod 1개 추가 (+1, maxSurge=1) → 총 6개
  • 기존 Pod 1개 제거 (-1, maxUnavailable=1) → 다시 5개
  • 이 과정을 반복해서 순차적으로 교체

9-5. 그림으로 이해하기

1
2
3
4
5
6
7
설정: replicas=3, maxUnavailable=1, maxSurge=1
초기: Pod v1 x3
업데이트 시작
- 새 Pod v2 +1 (총 4개)
- 기존 Pod v1 -1 (총 3개)
- 반복
최종: Pod v2 x3

👉 항상 최소 2개 Pod는 살아 있고, 최대 4개까지 늘어날 수 있음.

9-6. ✅ 요약

  • maxUnavailable → 업데이트 중 동시에 죽어도 되는 Pod 개수
  • maxSurge → 업데이트 중 동시에 더 늘려도 되는 Pod 개수
  • 둘을 조합해서 무중단 배포 보장 + 리소스 효율성을 조절함

10. maxUnavailable=0 vs maxSurge=0 인 경우를 비교

두 설정은 업데이트 방식이 완전히 달라지기 때문에 운영 환경에서 중요한 의미가 있어요.

10-1. 📌 Case 1: maxUnavailable = 0

👉 업데이트 중 Pod가 절대 줄어들지 않음. 즉, 기존 Pod를 죽이기 전에 새 Pod를 먼저 띄움.

1
2
3
4
5
6
7
8
9
10
예: replicas=3, maxUnavailable=0, maxSurge=1

초기: v1 Pod x3

업데이트:
- 새 Pod v2 +1 (surge 허용) → 총 4개
- 기존 Pod v1 -1 → 총 3개
- 반복

최종: v2 Pod x3
10-1-1. ✅ 장점
  • 항상 원하는 replica 수(3개)가 보장됨 → 무중단 배포에 안전
  • 다운타임 위험 최소화
10-1-2. ❌ 단점
  • 순간적으로 Pod 수가 늘어남 → 리소스(메모리/CPU) 여유 필요
  • 클러스터 자원이 부족하면 배포가 지연될 수 있음

10-2. 📌 Case 2: maxSurge = 0

👉 업데이트 중 Pod를 더 이상 늘리지 않음. 즉, 기존 Pod를 줄이고 나서 새 Pod를 띄움.

1
2
3
4
5
6
7
8
9
10
예: replicas=3, maxUnavailable=1, maxSurge=0

초기: v1 Pod x3

업데이트:
- 기존 Pod v1 -1 (unavailable 허용) → 총 2개
- 새 Pod v2 +1 → 총 3개
- 반복

최종: v2 Pod x3
10-2-1. ✅ 장점
  • Pod 개수가 늘어나지 않음 → 리소스 절약
  • 작은 클러스터에서도 안정적으로 동작
10-2-2. ❌ 단점
  • 업데이트 도중 가용 Pod 수가 줄어들 수 있음 → 서비스 순간적 성능 저하 가능성 있음
  • maxUnavailable=1이라면 replicas=3일 때 최소 2개만 살아있게 됨

10-3. 📌 비교 요약

|설정|동작 방식|장점|단점|적합한 상황| |—|—|—|—|—| |maxUnavailable=0|기존 Pod 줄이지 않고 새 Pod 먼저 생성|무중단 배포 보장|순간적으로 리소스 더 필요|서비스 다운타임 절대 허용 불가| |maxSurge=0|기존 Pod 줄이고 나서 새 Pod 생성|리소스 절약|순간적으로 Pod 수 줄어듦 (성능 저하 가능)|자원이 빡빡한 클러스터|

10-4. ✅ 정리하면

  • maxUnavailable=0 → 다운타임 방지 우선
  • maxSurge=0 → 리소스 절약 우선
This post is licensed under CC BY 4.0 by the author.