LabHub
배우기 러닝패스 코스

CKAD — Kubernetes Application Developer

Pod Design — Labels, Commands, Jobs, CronJobs

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

파드의 메타데이터(라벨·애너테이션)와 실행 방식(command/args/env/restartPolicy)을 직접 지정하고, 배치 워크로드인 Job 과 CronJob 의 핵심 필드를 채울 수 있게 된다.

왜 중요한가

CKAD 문제의 절반은 "이 값을 어느 필드에 쓰는가"로 끝난다. 라벨과 애너테이션은 둘 다 metadata 밑에 있는 문자열 맵이지만 역할이 정반대다. 라벨은 셀렉터가 고르는 값이라 Service·Deployment·NetworkPolicy 가 전부 이걸 본다. 애너테이션은 셀렉터가 절대 보지 않는 메모라, 도구가 읽는 설정(change-cause, 컨트롤러 힌트)을 넣는다. 이 구분을 헷갈리면 Service 에 엔드포인트가 안 붙는 사고가 난다.

commandargs 도 마찬가지다. 이미지 안의 ENTRYPOINT/CMD 를 각각 덮어쓰는 것이지 "명령어와 인자"가 아니다. command 만 바꾸면 CMD 가 그대로 붙어 이상한 조합이 되고, args 만 바꾸면 원래 ENTRYPOINT 에 새 인자가 붙는다.

Job 은 "성공을 세는" 컨트롤러다. Deployment 가 "지금 몇 개 떠 있나"를 유지한다면 Job 은 "지금까지 몇 번 성공했나"를 센다. 그래서 파드의 restartPolicyAlways 로 두면 파드가 영원히 끝나지 않아 Job 도 끝나지 않는다.

단계

  1. 네임스페이스 ckad-design 을 만들고, 그 안에 파드 web 을 만든다. 이미지 nginx:1.27, 라벨 app=webtier=frontend.
  2. 파드 web 에 애너테이션 owner=platform-team 을 붙인다. 같은 네임스페이스에 파드 api 를 만든다 — 이미지 nginx:1.27, 라벨 app=apitier=backend.
  3. 파드 runner 를 만든다. 이미지 busybox:1.36, command["/bin/sh"], args["-c", "sleep 3600"].
  4. 파드 envtest 를 만든다. 이미지 busybox:1.36, 라벨 tier=backend. 환경변수 APP_ENV=production, APP_TIER=backend 를 고정값으로 넣고, POD_NAME 은 다운워드 API 로 metadata.name 을 참조하게 한다. command["/bin/sh","-c","sleep 3600"].
  5. 파드 oneshot 을 만든다. 이미지 busybox:1.36, restartPolicyNever, command["/bin/sh","-c","echo done"].
  6. Job batch-sum 을 만든다. completions: 4, parallelism: 2, backoffLimit: 3, 파드의 restartPolicyOnFailure, 컨테이너 이미지 busybox:1.36.
  7. CronJob nightly-report 를 만든다. schedule: "17 3 * * *", concurrencyPolicy: Forbid, startingDeadlineSeconds: 120, successfulJobsHistoryLimit: 3, 컨테이너 이미지 busybox:1.36, 파드 restartPolicyOnFailure.
  8. ckad-design 네임스페이스에서 라벨 tier=backend 인 파드 이름만 한 줄에 하나씩 /root/ckad-design/backend-pods.txt 에 저장한다 (pod/ 접두어 없이 이름만).

참고

네임스페이스와 첫 파드

네임스페이스 ckad-design 을 만들고, 그 안에 파드 web 을 만든다. 이미지 nginx:1.27, 라벨 app=webtier=frontend.

네임스페이스를 먼저 만들고 그 안에 파드를 만든다. 라벨은 metadata.labels 에 넣는다. kubectl run--labels 를 주거나 --dry-run=client -o yaml 로 뼈대를 뽑아 고치는 편이 빠르다.

라벨과 애너테이션 구분하기

파드 web 에 애너테이션 owner=platform-team 을 붙인다. 같은 네임스페이스에 파드 api 를 만든다 — 이미지 nginx:1.27, 라벨 app=apitier=backend.

라벨은 셀렉터가 고르는 값, 애너테이션은 셀렉터가 보지 않는 메모다. 이미 만든 파드에는 kubectl label, kubectl annotate 로 나중에 붙일 수 있다.

command 와 args 로 이미지 기본값 덮어쓰기

파드 runner 를 만든다. 이미지 busybox:1.36, command["/bin/sh"], args["-c", "sleep 3600"].

command 는 Dockerfile 의 ENTRYPOINT, args 는 CMD 를 덮어쓴다. 둘은 YAML 문자열 배열이고, 셸 문법(;, &&)을 쓰려면 셸을 직접 불러야 한다.

환경변수와 다운워드 API

파드 envtest 를 만든다. 이미지 busybox:1.36, 라벨 tier=backend. 환경변수 APP_ENV=production, APP_TIER=backend 를 고정값으로 넣고, POD_NAME 은 다운워드 API 로 metadata.name 을 참조하게 한다. command["/bin/sh","-c","sleep 3600"].

고정값은 env[].value, 파드 자신의 메타데이터는 env[].valueFrom.fieldRef.fieldPath 로 가져온다. 파드 이름의 필드 경로는 metadata. 로 시작한다.

restartPolicy 로 일회성 파드 만들기

파드 oneshot 을 만든다. 이미지 busybox:1.36, restartPolicyNever, command["/bin/sh","-c","echo done"].

spec.restartPolicy 는 파드 수준 필드다. 기본값 Always 는 장기 실행용이고, 한 번 돌고 끝나는 작업에는 다른 값을 쓴다. 이 필드는 만든 뒤 수정할 수 없으니 지우고 다시 만들어야 한다.

Job 의 완료 개수와 병렬도

Job batch-sum 을 만든다. completions: 4, parallelism: 2, backoffLimit: 3, 파드의 restartPolicyOnFailure, 컨테이너 이미지 busybox:1.36.

completions 는 총 몇 번 성공해야 끝인지, parallelism 은 동시에 몇 개를 굴릴지다. backoffLimit 은 실패 재시도 상한이고 기본값은 6 이다. Job 파드의 restartPolicy 에 쓸 수 있는 값은 두 가지뿐이다.

CronJob 스케줄과 동시 실행 정책

CronJob nightly-report 를 만든다. schedule: "17 3 * * *", concurrencyPolicy: Forbid, startingDeadlineSeconds: 120, successfulJobsHistoryLimit: 3, 컨테이너 이미지 busybox:1.36, 파드 restartPolicyOnFailure.

schedule 은 다섯 자리 크론 표현식(분 시 일 월 요일)이다. concurrencyPolicy 는 이전 실행이 아직 안 끝났을 때의 행동이고, startingDeadlineSeconds 는 예정 시각을 놓쳤을 때 몇 초까지 늦게라도 시작할지다.

라벨 셀렉터로 목록 뽑기 (종합)

ckad-design 네임스페이스에서 라벨 tier=backend 인 파드 이름만 한 줄에 하나씩 /root/ckad-design/backend-pods.txt 에 저장한다 (pod/ 접두어 없이 이름만).

kubectl get pods -l key=value 로 걸러내고, -o name 또는 -o jsonpath 로 이름만 남긴다. -o namepod/이름 형태라 앞의 접두어를 잘라내야 한다. 파일에는 이름만 한 줄씩 들어가야 한다.