오토에버 클라우드 2기 43일차
Workload API: 컨테이너 실행과 관리
Workload API는 쿠버네티스 클러스터에 컨테이너를 기동시키기 위한 리소스들의 집합 Pod를 기본 단위로 하여, 이를 관리하고 제어하는 다양한 컨트롤러(Controller)들로 구성됨
리소스 관계도
graph TD;
subgraph "High-Level Controllers"
Deployment("Deployment (가장 일반적)");
CronJob;
end
subgraph "Mid-Level / Direct Controllers"
ReplicaSet;
Job;
DaemonSet;
StatefulSet;
ReplicaController["ReplicaController (구버전)"];
end
subgraph "Workload Unit"
Pod;
end
Deployment -- "manages" --> ReplicaSet;
ReplicaSet -- "creates / scales" --> Pod;
CronJob -- "schedules" --> Job;
Job -- "creates" --> Pod;
DaemonSet -- "ensures on every node" --> Pod;
StatefulSet -- "manages stateful apps" --> Pod;
ReplicaController -- "creates / scales" --> Pod;
1. Pod: 쿠버네티스의 최소 배포 단위
Pod는 쿠버네티스의 가장 작은 배포 단위로, 하나 이상의 컨테이너가 모인 집합체 동일한 파드 내의 컨테이너끼리는 네트워크(IP 주소)와 스토리지를 공유하며 localhost로 통신 가능
Pod 디자인 패턴
- 사이드카 패턴 (Sidecar Pattern): 메인 컨테이너에 로그 수집, 설정 동기화 등 보조적인 기능을 수행하는 서브 컨테이너를 포함시키는 패턴
- 앰배서더 패턴 (Ambassador Pattern): 메인 컨테이너가 외부 시스템에 접속할 때, 중간에서 대리(프록시) 역할을 하는 서브 컨테이너를 포함시키는 패턴 이를 통해 개발/운영 환경 변경 없이 메인 컨테이너는 항상
localhost로 접속하도록 구성 가능 - 어댑터 패턴 (Adapter Pattern): 메인 컨테이너의 출력 데이터 형식을 외부 시스템(예: 모니터링 도구)의 요구사항에 맞게 변환해주는 컨테이너를 포함시키는 패턴
Pod 생성 및 관리
단일 컨테이너 Pod 생성 (
sample-pod.yaml)1 2 3 4 5 6 7 8
apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - name: nginx-container image: nginx
```bash kubectl apply -f sample-pod.yaml
다중 컨테이너 Pod 생성 (
sample-2pod.yaml) 하나의 Pod 안에 Nginx와 Redis 컨테이너를 함께 실행1 2 3 4 5 6 7 8 9 10
apiVersion: v1 kind: Pod metadata: name: sample-2pod spec: containers: - name: nginx-container image: nginx - name: redis-container image: redis
컨테이너 접속 및 명령어 실행
-it옵션으로 가상 터미널을 통해 컨테이너 내부 셸에 접속 가능1 2 3 4 5 6 7 8
# sample-pod의 셸에 접속 kubectl exec -it sample-pod -- /bin/sh # 컨테이너를 지정하여 접속 (다중 컨테이너 Pod의 경우) kubectl exec -it sample-2pod -c nginx-container -- /bin/sh # 외부에서 바로 명령어 실행 kubectl exec -it sample-pod -- /bin/bash -c "ls -all --classify | grep lib"
Pod Spec 상세 설정
command와args: Dockerfile의ENTRYPOINT와CMD를 덮어쓸 때 사용1 2 3 4 5 6
spec: containers: - name: nginx-container image: nginx command: ["/bin/sleep"] args: ["3600"]
hostNetwork: Pod가 노드의 네트워크를 직접 사용하도록 설정 Pod의 IP가 노드의 IP와 동일해짐 특수한 경우(네트워크 감시 등)에만 사용dnsPolicy: Pod의 DNS 해석 정책을 설정ClusterFirst(기본값): 클러스터 내부 DNS(CoreDNS)를 먼저 사용. 서비스 디스커버리에 필수Default: Pod가 실행되는 노드의 DNS 설정을 상속None: DNS 설정을 사용하지 않음.dnsConfig로 수동 설정 필요
hostAliases: Pod 내부의/etc/hosts파일에 특정 호스트 이름과 IP를 정적으로 등록1 2 3 4 5 6
spec: hostAliases: - ip: "8.8.8.8" hostnames: - "google-dns" - "google-public-dns"
workingDir: 컨테이너 내부의 작업 디렉토리를 지정
2. ReplicaSet: 파드 복제 및 자동 복구
ReplicaSet은 지정된 수의 동일한 Pod 복제본이 항상 실행되도록 보장하는 컨트롤러 노드 장애 등으로 Pod가 사라지면, 자동으로 새로운 Pod를 생성하여 서비스의 가용성을 유지함
ReplicaSet 생성 (
sample-rs.yaml)replicas: 3으로 3개의 동일한 Pod를 유지하도록 설정1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
apiVersion: apps/v1 kind: ReplicaSet metadata: name: sample-rs spec: replicas: 3 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: nginx-container image: nginx
레이블과 셀렉터: ReplicaSet은
spec.selector에 정의된 레이블을 가진 Pod들을 감시하고 관리함spec.template.metadata.labels는 새로 생성될 Pod에 붙여줄 레이블로, 두 값은 반드시 일치해야 함자동 복구 확인:
kubectl delete pod <pod-name>명령으로 Pod를 수동 삭제하면, ReplicaSet이 즉시 새로운 Pod를 생성하여replicas수를 맞추는 것을 확인할 수 있음스케일링:
kubectl scale replicaset sample-rs --replicas=5명령어로 실행 중인 Pod의 수를 동적으로 조절 가능
3. Deployment: 배포 및 업데이트 관리의 표준
Deployment는 ReplicaSet의 상위 컨트롤러로, Pod의 개수 유지뿐만 아니라 롤링 업데이트, 롤백 등 정교한 배포 전략을 관리함 쿠버네티스에서 상태 없는(Stateless) 애플리케이션을 배포할 때 가장 권장되는 방식임
Deployment 생성 (
sample-deployment.yaml) ReplicaSet과 YAML 구조가 매우 유사함1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
apiVersion: apps/v1 kind: Deployment metadata: name: sample-deployment spec: replicas: 3 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: nginx-container image: nginx
롤링 업데이트 (Rolling Update) Deployment는 업데이트 시, 새 버전의 ReplicaSet을 만들고 트래픽을 점진적으로 전환하여 무중단 업데이트를 수행함
1 2 3 4 5
# 컨테이너 이미지 버전을 1.16으로 업데이트 kubectl set image deployment/sample-deployment nginx-container=nginx:1.16 # 업데이트 진행 상태 확인 kubectl rollout status deployment/sample-deployment
롤백 (Rollback) 업데이트에 문제가 있을 경우, 이전 버전으로 쉽게 되돌릴 수 있음
1 2 3 4 5 6 7 8
# 변경 이력 확인 kubectl rollout history deployment/sample-deployment # 이전 버전으로 롤백 kubectl rollout undo deployment/sample-deployment # 특정 리비전(버전)으로 롤백 kubectl rollout undo deployment/sample-deployment --to-revision=1
변경 일시 중지 (Pause & Resume) 여러 변경 사항을 적용한 후 한 번에 배포하고 싶을 때, 업데이트를 일시적으로 중지할 수 있음
1 2 3 4 5 6 7
# 업데이트 일시 중지 kubectl rollout pause deployment/sample-deployment # (이미지 변경 등 여러 작업 수행) # 일시 중지 해제 및 변경 사항 적용 kubectl rollout resume deployment/sample-deployment
4. ReplicaSet vs Deployment
디플로이먼트(Deployment)가 상위 관리자이고, 레플리카셋(ReplicaSet)은 그 아래에서 단순 반복 작업을 하는 중간 관리자
| 구분 | 레플리카셋 (ReplicaSet) | 디플로이먼트 (Deployment) |
|---|---|---|
| 핵심 역할 | Pod 개수 유지 | Pod 그룹의 배포, 업데이트, 롤백 관리 |
| 업데이트 기능 | ❌ 없음 | ✅ 무중단 롤링 업데이트 |
| 롤백 기능 | ❌ 없음 | ✅ 이전 버전으로 롤백 |
| 직접 사용 여부 | 거의 안 함 | 항상 사용 (권장) |
| 비유 | 단순 반복 작업을 하는 ‘작업 반장’ | 전체 프로젝트를 책임지는 ‘총괄 매니저’ |
| 관계 | 디플로이먼트의 하위 구성 요소 | 레플리카셋을 생성하고 관리하는 상위 컨트롤러 |
직접 ReplicaSet을 쓰지 않는 이유
만약 우리가 Deployment를 사용하지 않고 ReplicaSet으로만 Pod를 관리한다면, 아래와 같은 핵심 기능들을 모두 수동으로, 위험하게 처리해야 한다
- 애플리케이션 업데이트:
ReplicaSet은 업데이트 기능이 없다 v1 앱을 v2로 바꾸려면, v2용ReplicaSet을 새로 만들고, 기존 v1ReplicaSet의 Pod 수를 수동으로 줄이면서 v2ReplicaSet의 Pod 수를 늘리는 복잡한 과정을 거쳐야 한다 이 과정에서 서비스가 중단될 위험이 매우 커짐 - 롤백 (Rollback): v2 업데이트에 문제가 생겼을 때, 이전 v1 상태로 돌아가려면 v1
ReplicaSet의 YAML 파일을 다시 적용하는 등의 수동 작업이 필요Deployment처럼 간단한 명령어 한 번으로 되돌릴 수 없다