LabHub

CKAD — 쿠버네티스 애플리케이션 개발자 · 애플리케이션 설계와 빌드 · 실습

파드 설계 — 라벨, 명령, Job, CronJob

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/ 접두어 없이 이름만).

참고

단계 8개

  1. 네임스페이스와 첫 파드
  2. 라벨과 애너테이션 구분하기
  3. command 와 args 로 이미지 기본값 덮어쓰기
  4. 환경변수와 다운워드 API
  5. restartPolicy 로 일회성 파드 만들기
  6. Job 의 완료 개수와 병렬도
  7. CronJob 스케줄과 동시 실행 정책
  8. 라벨 셀렉터로 목록 뽑기 (종합)