Link Search Menu Expand Document

애플리케이션 배포법

애플리케이션으로 배포되는 오브젝트 형태

  1. 파드 (Pod)
  2. 디플로이먼트 (Deployment)
  3. 레플리카셋 (ReplicaSet)
  4. 잡 (Job): 파드로 계속 떠있으면 부담이 되는 작업을 처리하기 위한 오브젝트
  5. 크론잡 (CronJob): 잡을 주기적으로 실행할 수 있도록 하는 오브젝트
  6. 데몬셋 (DaemonSet): 노드마다 1개씩만 올라가는 파드
  7. 스테이트풀셋 (StatefulSet): 순서를 지키면서 배포가 되고 상태를 가지고 있는 파드
    • 기존의 Pod는 stateless

파드(Pod)

pod.yaml

apiVersion: v1
kind: Pod
metadata:
    labels:
        run: po-nginx
    name: po-nginx
spec:
    containers:
    - image: nginx
        name: nginx
  • apiVersion: 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전
  • kind: 오브젝트 종류
  • metadata: 오브젝트를 유일하게 구분지어 줄 데이터
  • spec: 오브젝트에 대해 의도한 상태

애플리케이션 배포법 - 01 파드

디플로이먼트(Deployment)

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deploy-nginx
  name: deploy-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: po-nginx
  template:
    metadata:
      labels:
        app: po-nginx
    spec:
      containers:
      - name: nginx
        image: nginx
  • selector: 디플로이먼트가 관리할 파드를 찾는 방법 정의
  • template: 파드를 생성하는 템플릿
  • 디플로이먼트가 파드를 포함하고 있는 구조

애플리케이션 배포법 - 02 디플로이먼트

레플리카셋(ReplicaSet)

replicaset.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: rs-nginx
  name: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: po-nginx
  template:
    metadata:
      labels:
        app: po-nginx
    spec:
      containers:
      - image: nginx
        name: nginx
  • 디플로이먼트와 코드 차이는 없음

애플리케이션 배포법 - 03 레플리카셋

ReplicaSet 대신 Deployment를 사용하는 이유

애플리케이션 배포법 - 04 레플리카셋

  • 위의 이미지는 컨테이너 버전을 순차적으로 Update하는 Rolling Update 과정을 나타냄
  • Deployment가 1개만 있을 경우 Update를 위해서는 추가적인 Deployment가 필요
  • 그러한 구조 대신 Deployment가 ReplicaSet을 만들고 ReplicaSet의 복제본으로 업데이트를 진행

커맨드(command)와 인자(args)

컨테이너에 명령이 필요한 이유

  1. 계속 동작하게 하고 싶을 때

애플리케이션 배포법 - 05 커맨드와 인자

  1. 사용자가 원하는 명령을 내리고 싶을 때

애플리케이션 배포법 - 06 커맨드와 인자

명령에 인자(args)를 추가하는 방법

애플리케이션 배포법 - 07 커맨드와 인자

잡(Job)

1-1-job-curl-succ

apiVersion: batch/v1
kind: Job
metadata:
  name: job-curl-succ
spec:
  template:
    spec:
      containers:
      - name: net-tools
        image: sysnet4admin/net-tools
        command: ["curlchk", "nginx"]
      restartPolicy: Never
  • apiVersion: 일괄적으로 일어난다는 의미의 batch
  • 한 번에 여러 개의 잡을 순차적 또는 동시에 실행할 수 있음
  • restartPolicy: 지정하지 않을 경우 기본이 Always
    • 잡에서 이것을 지정하지 않으면 잡의 본연에 목적에 맞지 않으므로 에러 발생
  • 실행하고 결과를 log로 확인할 목적으로 사용

잡의 병렬 실행

애플리케이션 배포법 - 08 잡

  • completions: 순차적 실행
  • parallelism: 병렬 실행

잡의 자동 종료

애플리케이션 배포법 - 09 잡

  • activeDeadlineSeconds: 실행 후 완료 여부에 상관 없이 일정 시간 경과시 종료
  • ttlSecondsAfterFinished: TTL(Time To Live), 잡이 완료된 시점 이후 일정 시간 경과시 종료

크론잡(CronJob)

주기성을 가지고 실행되어야 할 내용이 있을 경우 사용하는 오브젝트

cronjob-1m-hist10-curl.yaml

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cj-1m-hist3-curl
spec:
  schedule: "*/1 * * * *"
  successfulJobsHistoryLimit: 10
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: net-tools
            image: sysnet4admin/net-tools
            command: ["curlchk", "nginx"]
          restartPolicy: Never
  • successfulJobsHistoryLimit: 기본값은 3, 이 수치를 넘는 동작 완료된 크론잡은 삭제됨

크론(cron) 규칙

애플리케이션 배포법 - 10 크론잡

데몬셋(DaemonSet)

노드마다 1개씩 배포되는 파드

daemonset.yaml

애플리케이션 배포법 - 11 데몬셋

  • 디플로이먼트는 배포 갯수를 지정해줘야 하지만 데몬셋은 워커 노드마다 1개씩만 배포되기 때문에 replicas 항목이 없음

스테이트풀셋(StatefulSet)

상태를 유지하고 있는 파드

statefulset.yaml

애플리케이션 배포법 - 12 스테이트풀셋

  • serviceName: 쿠버네티스에서 제공하는 서비스 오브젝트의 이름
  • 스테이트풀셋으로 배포할 경우 해시값이 아닌 고정된 이름을 가짐