애플리케이션 배포법
애플리케이션으로 배포되는 오브젝트 형태
- 파드 (Pod)
- 디플로이먼트 (Deployment)
- 레플리카셋 (ReplicaSet)
- 잡 (Job): 파드로 계속 떠있으면 부담이 되는 작업을 처리하기 위한 오브젝트
- 크론잡 (CronJob): 잡을 주기적으로 실행할 수 있도록 하는 오브젝트
- 데몬셋 (DaemonSet): 노드마다 1개씩만 올라가는 파드
- 스테이트풀셋 (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
: 오브젝트에 대해 의도한 상태
디플로이먼트(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
: 파드를 생성하는 템플릿- 디플로이먼트가 파드를 포함하고 있는 구조
레플리카셋(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
- 디플로이먼트와 코드 차이는 없음
ReplicaSet 대신 Deployment를 사용하는 이유
- 위의 이미지는 컨테이너 버전을 순차적으로 Update하는 Rolling Update 과정을 나타냄
- Deployment가 1개만 있을 경우 Update를 위해서는 추가적인 Deployment가 필요
- 그러한 구조 대신 Deployment가 ReplicaSet을 만들고 ReplicaSet의 복제본으로 업데이트를 진행
커맨드(command)와 인자(args)
컨테이너에 명령이 필요한 이유
- 계속 동작하게 하고 싶을 때
- 사용자가 원하는 명령을 내리고 싶을 때
명령에 인자(args)를 추가하는 방법
잡(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로 확인할 목적으로 사용
잡의 병렬 실행
completions
: 순차적 실행parallelism
: 병렬 실행
잡의 자동 종료
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) 규칙
데몬셋(DaemonSet)
노드마다 1개씩 배포되는 파드
daemonset.yaml
- 디플로이먼트는 배포 갯수를 지정해줘야 하지만 데몬셋은 워커 노드마다 1개씩만 배포되기 때문에
replicas
항목이 없음
스테이트풀셋(StatefulSet)
상태를 유지하고 있는 파드
statefulset.yaml
serviceName
: 쿠버네티스에서 제공하는 서비스 오브젝트의 이름- 스테이트풀셋으로 배포할 경우 해시값이 아닌 고정된 이름을 가짐