Deployment 객체의 update와 rollback
Deployment 객체의 배포 전략
Dockerfile의 CMD, ENTRYPOINT값
| Dockerfile 정의 | docker run 명령어 | 프로세스에 전달될 argument | |
|---|---|---|---|
| ENTRYPOINT | ENTRYPOINT ["sleep"] | docker run my-image 10 | sleep 10 |
| CMD | CMD ["sleep", "5"] | docker run my-image 10 | 10 |
Pod 정의 파일에서 ENTRYPOINT, CMD 값 overriding하기
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
command: ["sleep-2.0"] # <-- Dockerfile의 ENTRYPOINT ["sleep"]을 "sleep-2.0"으로 오버라이드
args: ["10"] # <-- ENTRYPOINT 뒤에 덧붙여질 인자
Pod의 환경변수 설정
# value 속성 사용
apiVersion: v1
kind: Pod
metadata:
name: env-value-pod
spec:
containers:
- name: my-container
image: busybox
command: ["sh", "-c", "echo '앱 환경:' $APP_ENV ' / 버전:' $APP_VERSION && sleep 3600"]
env:
- name: APP_ENV # 환경변수 이름
value: "production" # 고정된 값 (문자열)
- name: APP_VERSION
value: "v1.0.0"
# valueFrom 속성 사용
apiVersion: v1
kind: Pod
metadata:
name: env-from-configmap-pod
spec:
containers:
- name: my-container
image: busybox
command: ["sh", "-c", "echo '로그 레벨:' $LOG_LEVEL && sleep 3600"]
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config # 참조할 ConfigMap의 이름
key: APP_COLOR # ConfigMap에서 가져올 Key
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_COLOR: blue
DB_HOST: mysql-service

Secret
apiVersion: v1
kind: Secret
metadata:
name: my-database-secret # Secret의 이름
data:
# Secret 데이터는 key-value 쌍으로 정의하며, value는 반드시 Base64로 인코딩되어야 합니다.
username: YWRtaW4= # 'admin'을 Base64 인코딩
password: cGFzc3dvcmQ= # 'password'를 Base64 인코딩
Multi Container Pod
Multi Container Pod의 디자인 패턴
spec:
containers:
- name: container-one
image: image-a
- name: container-two
image: image-b
# 두 컨테이너가 순서 없이 동시에 시작되어 계속 실행됨
spec:
initContainers:
- name: wait-for-db
image: init-image-db
command: 'wait_for_db_script.sh'
- name: api-checker
image: init-image-api
command: 'wait_for_api_script'
containers:
- name: main-app
image: main-app-image
# 1. wait-for-db가 실행되고 종료.
# 2. api-checker가 실행되고 종료.
# 3. main-app이 시작되어 Pod 종료까지 실행.
spec:
initContainers:
- name: log-shipper
image: image-logger
command: 'setup-logger.sh'
restartPolicy: Always
containers:
- name: main-app
image: main-app-image
Kubernetes의 Scaling
| 유형 | 의미 | Manual 방식 | Automated 방식 |
|---|---|---|---|
| Horizontal | Pod를 추가/제거 | kubectl scale 명령어 사용 | HPA |
| Vertical | 기존 Pod의 CPU/Memory 할당량 증가 | Pod의 requests, limits 값 변경 | VPA |
| 유형 | 의미 | Manual 방식 | Automated 방식 |
|---|---|---|---|
| Horizontal | Cluster에 Node를 추가/제거 | 새 Node를 수동으로 추가 | Cluster Autoscaler |
| Vertical | 기존 Node의 CPU/Memory 증가 | 서버 downtime이 발생하기 때문에 일반적으로 사용되지 않음 | x |
Horizontal Pod Autoscaler
apiVersion: autoscaling/v2 # v2 API 버전 사용
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef: # HPA가 모니터링할 대상 리소스 지정
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization # 목표를 사용률(Utilization)로 설정
averageUtilization: 50 # 50%를 목표로 설정
In-place Resizing
Vertical Pod Autoscaler
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
updatePlicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: "my-app"
minAllowed:
cpu: "250m"
maxAllowed:
cpu: "2"
controlledResources: ["cpu"]
VPA의 구성 요소와 updateMode
| 모드 | 작동 방식 |
|---|---|
| Off | 추천만 제공하고 아무 작업도 하지 않는다. (Recommender만 작동) |
| Initial | Pod 생성 시에만 리소스를 변경하고 실행 중인 Pod는 변경하지 않는다. (Recommender, Admission Controller만 작동) |
| Recreate | 리소스 최적화가 안된 Pod들은 종료시켜 재시작을 유도한다. (3가지 VPA 구성요소 모두 작동) |
| Auto | 현재는 Recreate와 동일하지만, 향후 버전에서는 In-Place Resizing을 지원하는 모드가 될 것이다. |