Post

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 차이

항목PodDeployment
역할실제 컨테이너 실행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 파일 생성파일 직접 읽기
  • 종류

    항목ConfigMapSecret
    목적일반 설정보안 정보
    저장 방식평문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.