04 Deployment
04 Deployment
1. Note
1. Note
- 구조
- Deployment는 어떻게 운영할지를 선언
- ReplicaSet은 몇 개를 유지할지를 보장
- Pod은 실제 실행되는 단위
- Service는 Pod에 접근하는 방법
- ConfigMap·Secret·Volume은 Pod이 외부에서 가져오는 데이터
- 디플로이먼트에서 설정을 잘해야한다!
2. Deployment
1. Deployment
- Kubernetes에서 애플리케이션의 선언적 업데이트를 제공하는 API 객체
- 상태를 선언함
- 상태를 안정적으로 유지하면서 애플리케이션 또는 서비스의 원하는 상태를 설명하고,
- Kubernetes가 목표 상태를 현재 상태에 맞추도록 할 수 있음.
- 주로 상태가 없는 (stateless) 애플리케이션을 관리하는데 적합
2. 특징
- 롤아웃과 롤백
- 애플리케이션을 배포할 때 선언적 업데이트를 사용함.
- 새 버전의 컨테이너 이미지로 업데이트를 진행할 때 롤아웃을 자동으로 진행
- 문제가 발생하면 이전 버전으로 롤백할 수 있음
- 스케일링
- 리플리카셋(ReplicaSet)을 활용하여 자동으로 업데이트하여 관리함
- 애플리케이션의 인스턴스 수를 쉽게 늘리거나 줄일 수 있음
- 자동 복구
- 노드 오류나 기타 이유로 인해 실패한 Pod를 자동으로 대체함
- 애플리케이션의 가용성을 보장하게됨
- 버전 관리와 추적
- 애플리케이션의 버전을 추적하고, 언제든지 이전 상태로 돌아갈 수 있는 옵션을 제공
- CI/CD 파이프라인과 통합하기에 적합함
3. Pod와 Deployment 차이
| 항목 | Pod | Deployment |
|---|---|---|
| 역할 | 실제 컨테이너 실행 | Pod 운영 관리 |
| 장애 복구 | 없음 | 자동 복구 |
| 자동 재생성 | 없음 | 있음 |
| 스케일링 | 직접 해야 함 | replicas로 자동 |
| 롤링 업데이트 | 없음 | 지원 |
| 롤백 | 없음 | 지원 |
| 실무 사용 | 거의 안 함 | 대부분 사용 |
3. 명령어
1. 실행 명령어
1
kubectl apply -f deployment.yaml
2. 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
apiVersion: apps/v1 # Deployment에서 사용하는 API 버전
kind: Deployment # 생성할 리소스 타입
metadata:
name: nginx-deployment # Deployment 이름
spec:
replicas: 2 # 유지할 Pod 개수
selector:
matchLabels:
app: nginx # app=nginx 라벨을 가진 Pod 관리(조회용)
# 굳이 디플로이로 생성안해도 무관함. 단순 조회용으로도 생성가능하지만 비권장
template:
metadata:
labels:
app: nginx # 생성될 Pod의 라벨 (만들어진 파드들은 전부 이 라벨로 관리)
spec:
containers:
- name: nginx # 컨테이너 이름
image: nginx:latest # 사용할 Docker 이미지
ports:
- containerPort: 80 # 컨테이너 내부 포트
- name: log-agent
image: fluentd
.....
# 파드내에서 여러개의 컨테이너 생성 가능함.
# 파드 내부에서 소통할때는 localhost + Port 접근
# DNS이름(서비스에서 선언한)으로 가면 해당 파드의 맞는 포트로 접근됨.
4. ConfigMap / SecretKey
1. ConfigMap, SecretKey
- 환경변수 또는 파일 마운트 등으로 POD에서 사용하는 패턴
- 근래에는 더 복잡한 암호화된 별도 외부 시스템을 사용하기도 한다고 함.
- Secret라고해서 정말 치명적인 정보들을 보관하지 X
방법
방식 특징 Kubernetes 예시 Pod 내부 결과 애플리케이션 사용 방식 Environment Variable 환경변수로 주입 env,envFromDB_HOST=mysql-serviceSystem.getenv()Volume Mount 파일처럼 마운트 volumeMounts,volumes/config/application.yml파일 생성파일 직접 읽기 종류
항목 ConfigMap Secret 목적 일반 설정 보안 정보 저장 방식 평문 base64 인코딩 접근 권한 상대적으로 넓음 제한 많이 검 보안 정책 낮음 높음
2. ConfigMAp
1. 명령어
1
kubectl apply -f xxx.yaml
2. Yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
# 환경변수로 사용할 값
DB_HOST: mysql-service
DB_PORT: "3306"
# 파일로 mount할 설정 파일
application.yml: |
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://mysql-service:3306/test
2. Deployment에서 주입
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
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-deployment
spec:
replicas: 2
selector:
matchLabels:
app: spring-app
template:
metadata:
labels:
app: spring-app
spec:
containers:
- name: spring-container
image: my-spring-app:1.0
env: # 환경변수로 주입
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config # appConfig에서
key: DB_HOST # DB_PORT KEY
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: app-config # appConfig에서
key: DB_PORT # DB_PORT KEY
volumeMounts:
- name: config-volume
mountPath: /config/application.yml # Pod 내부 생성될 파일 위치
subPath: application.yml # ConfigMap key 이름
volumes: # 실제 ConfigMap 연결 / Env는 X됨
- name: config-volume # 볼륨마운트할때 사용할 이름
configMap:
name: app-config #컨피그맵 이름
3. Secret
1. 명령어
1
kubectl apply -f secret.yaml
2. Yaml
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
stringData:
DB_PASSWORD: my-password
JWT_SECRET: my-jwt-secret
3. Deployment에서 주입
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
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-deployment
spec:
replicas: 2
selector:
matchLabels:
app: spring-app
template:
metadata:
labels:
app: spring-app
spec:
containers:
- name: spring-container
image: my-spring-app:1.0
env: # Secret → 환경변수 주입
- name: DB_HOST
valueFrom:
secretKeyRef: # ConfigMap이랑 선언 차이
name: app-secret # Secret 이름
key: DB_HOST # Secret 내부 KEY
- name: DB_PORT
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PORT
volumeMounts:
- name: secret-volume
mountPath: /config/application.yml # Pod 내부 생성될 파일 위치
subPath: application.yml # Secret 내부 key 이름
volumes: # 실제 Secret 연결 / Env는 X됨
- name: secret-volume
# volumeMounts.name 과 연결
secret:
secretName: app-secret # 사용할 Secret 이름
This post is licensed under CC BY 4.0 by the author.