Certified Kubernetes Application Developer (CKAD) #20 시험 팁과 시간 관리, 자주 틀리는 패턴
#1부터 #19까지 5개 도메인을 모두 정리했습니다. 이 글은 실기 시험에 들어가기 직전 한 번 더 읽고 갈 압축본입니다. 새로운 도메인은 없고, 2시간 실기를 어떻게 운영하는지와 시리즈 전체에서 응시자가 가장 자주 점수를 흘리는 함정만 모았습니다. 객관식이 아니라 빈 터미널에 직접 만들어 내는 시험이라, 같은 지식이라도 운영이 합격과 불합격을 가릅니다.
2시간 운영 전략 #
작업 단위 운영 #
CKAD는 약 15〜20개 작업을 2시간 안에 풀어야 합니다. 객관식처럼 문항당 균등하게 시간을 나누는 것이 아니라, 작업마다 배점이 화면에 표시되므로 그 배점이 곧 우선순위입니다.
| 단계 | 시간 | 행동 |
|---|---|---|
| 1차 풀이 | 약 90분 | 배점 높고 쉬운 작업부터. 막히면 flag 후 즉시 다음 작업 |
| 2차 풀이 | 약 20분 | flag 한 작업만 다시 봄. 부분 점수라도 확보 |
| 검산 | 약 10분 | k get으로 결과 확인, context,namespace,파일명 재확인 |
시간 관리의 첫 번째 룰 #
한 작업에 과몰입하지 않습니다. 배점에 비해 시간이 오래 걸린다 싶으면 일단 가능한 데까지 만들어 두고 flag 후 넘어갑니다. 합격선은 66%이므로 어려운 한두 작업을 포기해도 됩니다. 배점 4점짜리 막히는 작업 하나를 붙들다가 배점 8점짜리 쉬운 작업 두 개를 놓치는 것이 가장 흔한 실패입니다.
배점 높고 쉬운 것부터 #
작업 목록을 처음부터 끝까지 한 번 훑으면서 배점 대비 난이도를 머릿속으로 표시합니다. generator로 한 줄에 끝나는 작업, 익숙한 리소스 작업을 먼저 처리해 점수를 빠르게 쌓고, 손이 많이 가는 작업을 뒤로 미루는 운영이 합격선을 넘기는 길입니다.
kubectl 속도 셋업 재정리 #
#1에서 잡은 셋업을 시험 시작 직후 1분 안에 끝냅니다. 작업당 수십 초씩 아끼는 투자입니다.
# kubectl을 k로
alias k=kubectl
# dry-run + YAML 출력을 do로
export do="--dry-run=client -o yaml"
# 즉시 삭제를 now로 (Pod를 빠르게 지우고 다시 만들 때)
export now="--force --grace-period=0"
# 자동완성 (k 까지 확장)
source <(kubectl completion bash)
complete -o default -F __start_kubectl k~/.vimrc에는 YAML 들여쓰기 사고를 막는 설정을 넣습니다.
set expandtab
set tabstop=2
set shiftwidth=2
set number추가로 손에 익혀 두면 좋은 vim 동작이 있습니다. YAML 블록을 통째로 들여쓰기할 때 비주얼 모드(V)로 줄을 선택한 뒤 >로 한 단계 들이고, .으로 반복합니다. 들여쓰기를 한 칸 더 보고 싶으면 :set list로 탭과 공백을 눈으로 구분합니다.
명령형 generator를 적극 활용한다 #
CKAD에서 매니페스트를 처음부터 손으로 쓰는 사람은 시간을 잃습니다. 대부분의 리소스는 run,create,expose로 뼈대를 뽑은 뒤 필요한 필드만 고치는 편이 빠르고 오타도 적습니다.
# Pod 뼈대
k run nginx --image=nginx $do > pod.yaml
# Deployment 뼈대 (replicas 포함)
k create deploy web --image=nginx --replicas=3 $do > deploy.yaml
# Job / CronJob 뼈대
k create job pi --image=perl $do > job.yaml
k create cronjob report --image=busybox --schedule="*/5 * * * *" $do > cj.yaml
# ConfigMap / Secret
k create configmap app-config --from-literal=KEY=value $do > cm.yaml
k create secret generic app-secret --from-literal=PASSWORD=1234 $do > secret.yaml
# Service (Deployment 노출)
k expose deploy web --port=80 --target-port=8080 $do > svc.yamlgenerator로 만들 수 없는 필드(probe, securityContext, volume 등)는 뼈대 YAML을 연 뒤 kubectl explain으로 경로를 확인해 채웁니다. 브라우저로 문서를 여는 것보다 빠른 경우가 많습니다.
k explain pod.spec.containers.livenessProbe
k explain deployment.spec.strategy --recursive공식 문서를 빠르게 활용한다 #
CKAD는 시험 중 kubernetes.io/docs와 그 하위 문서 열람이 허용됩니다. 그래서 모든 YAML 필드를 외울 필요는 없습니다. 다만 운영에 두 가지 원칙이 있습니다.
- 즐겨찾기보다 검색. 시험 환경 브라우저에 미리 만들어 둔 즐겨찾기를 옮기기 어려운 경우가 있으므로, 문서 상단 검색창에
liveness probe,networkpolicy처럼 키워드를 쳐서 예시 YAML로 바로 가는 동선을 손에 익힙니다. - 문서 시간도 시험 시간. 문서를 뒤지는 동안에도 타이머는 흐릅니다. 자주 쓰는 리소스는 generator로 뼈대를 즉시 만들고, 문서는 generator로 안 되는 세부 필드를 확인하는 용도로만 씁니다.
문서에서 YAML 스니펫을 복사할 때는 들여쓰기가 따라오므로, 붙여 넣은 직후 :set paste로 자동 들여쓰기 간섭을 끄는 것이 안전합니다.
자주 틀리는 패턴 #
실기에서 점수를 흘리는 단골 패턴입니다. 지식 부족보다 운영 실수로 잃는 점수가 더 많습니다.
1) context와 namespace 미전환 #
각 작업은 지정된 클러스터와 네임스페이스에서 풀어야 채점됩니다. 작업 설명에 제시되는 use-context 명령을 먼저 실행하지 않으면, 답을 맞게 만들어도 다른 클러스터에 만들어져 0점입니다.
k config use-context <작업에서 지정한 컨텍스트>
k config set-context --current --namespace=<작업 네임스페이스>2) dry-run을 안 쓰고 손으로 작성 #
빈 화면에 YAML을 처음부터 타이핑하면 느리고 오타가 납니다. 매니페스트가 필요한 거의 모든 작업은 k ... --dry-run=client -o yaml > file.yaml로 시작합니다.
3) YAML 들여쓰기와 탭 #
탭과 공백이 섞이거나 들여쓰기가 한 칸 어긋나면 apply가 실패합니다. ~/.vimrc의 expandtab,shiftwidth=2를 시작 시 반드시 적용합니다.
4) 요청 파일명과 경로 불일치 #
“/opt/course/2/pod.yaml에 저장하라” 같은 지시는 채점이 그 경로를 봅니다. 경로,파일명을 정확히 맞추지 않으면 결과물이 맞아도 점수가 없습니다.
5) 작업을 끝까지 안 읽음 #
한 작업에 여러 조건이 붙는 경우가 많습니다. 이미지만 바꾸고 replicas 조정을 빠뜨리거나, label은 붙였는데 env 주입을 놓치면 부분 점수만 받습니다. 작업 설명의 모든 조건을 짚고 시작합니다.
6) imperative로 되는 걸 굳이 YAML로 #
label 추가,이미지 변경,scale,rollout 같은 작업은 명령 한 줄로 끝나는데 YAML을 만들어 편집하면 시간 낭비입니다.
k set image deploy/web nginx=nginx:1.25
k scale deploy/web --replicas=5
k label pod nginx tier=frontend
k rollout undo deploy/web7) 변경 후 apply 안 함 #
YAML 파일을 고쳐 놓고 apply를 안 하면 클러스터에는 반영되지 않습니다. 편집 후 k apply -f file.yaml을 잊지 않습니다.
8) label과 selector 오타 #
Deployment의 selector.matchLabels와 Pod 템플릿의 labels가 다르면 생성에 실패하고, Service의 selector가 Pod label과 어긋나면 트래픽이 닿지 않습니다. generator가 맞춰 준 label을 임의로 고칠 때 한쪽만 바꾸지 않도록 주의합니다.
부분 점수와 검산 #
CKAD는 작업 단위로 채점되며 일부 작업은 부분 점수가 있습니다. 완벽하게 못 풀 것 같은 작업도 만들 수 있는 데까지 만들어 두면 점수가 들어옵니다. 그리고 작업을 끝낼 때마다 짧게 검산합니다.
# 만든 리소스가 실제로 떴는지
k get pod,deploy,svc -n <namespace>
# Pod가 Running인지, 재시작이 없는지
k get pod nginx -o wide
# 적용된 필드가 의도대로인지
k describe pod nginx | less
k get deploy web -o yaml | grep -A3 strategy검산은 30초 안에 끝나지만, “다 했다고 생각한 작업이 사실 실패해 있던” 가장 흔한 실점을 막습니다.
헷갈리는 개념 쌍 #
작업 중 순간적으로 헷갈리기 쉬운 쌍을 한 줄 차이로 압축합니다.
| 쌍 | 한 줄 차이 |
|---|---|
| liveness vs readiness probe | 죽으면 재시작 vs 준비 안 되면 트래픽 차단 |
| requests vs limits | 스케줄링 보장량 vs 사용 상한 |
| QoS (Guaranteed/Burstable/BestEffort) | requests=limits vs 일부만 설정 vs 미설정 |
| ClusterIP vs NodePort | 클러스터 내부 전용 vs 노드 포트로 외부 노출 |
| env vs volume (ConfigMap/Secret) | env는 변경 후 재생성 필요 vs volume은 자동 갱신 |
| Job restartPolicy | OnFailure 또는 Never만 허용 (Always 불가) |
마지막 줄은 단골 함정입니다. Job과 CronJob의 Pod 템플릿에 restartPolicy: Always를 넣으면 생성이 거부됩니다. OnFailure 또는 Never를 씁니다.
도메인별 응시 직전 체크리스트 #
각 도메인에서 손이 바로 나와야 하는 핵심 명령과 필드입니다.
도메인 1: Application Design and Build (20%) #
- 멀티 컨테이너 Pod:
spec.containers에 둘 이상,spec.initContainers로 init - sidecar는
initContainers에restartPolicy: Always로도 표현 - Job/CronJob:
restartPolicyOnFailure/Never,completions,parallelism,backoffLimit - CronJob
schedule,concurrencyPolicy(Forbid/Allow/Replace)
도메인 2: Application Deployment (20%) #
-
k create deploy,k set image,k scale,k rollout status/undo - rolling update:
strategy.rollingUpdate.maxSurge,maxUnavailable - Helm:
helm install,upgrade,rollback,-f values.yaml - Kustomize:
kustomization.yaml,k apply -k
도메인 3: Application Observability and Maintenance (15%) #
-
k logs(-f,--previous,-c),k describe로 이벤트 확인 - probe 3종:
livenessProbe,readinessProbe,startupProbe(exec/httpGet/tcpSocket) -
k debug,k port-forward, ephemeral container로 디버깅
도메인 4: Application Environment, Configuration and Security (25%) #
- ConfigMap/Secret:
envFrom,valueFrom,volume 마운트 - ServiceAccount 지정, RBAC
Role,RoleBinding - SecurityContext:
runAsUser,fsGroup,readOnlyRootFilesystem,capabilities - requests/limits로 QoS 결정,
LimitRange - Volume:
emptyDir,PVC,projected,ephemeral
도메인 5: Services and Networking (20%) #
-
k expose로 Service, typeClusterIP/NodePort/LoadBalancer/ExternalName - Service
selector와 Pod label 일치 확인 - Ingress
rules,paths,backend - NetworkPolicy
podSelector,ingress/egress,policyTypes(기본 deny 동작 이해)
온라인 감독 응시 직전 점검 #
CKAD는 PSI 원격 터미널에 접속해 작업하는 온라인 감독 시험입니다. 시험 시작 전에 다음을 확인합니다.
신분증 #
- 영문 표기가 있는 신분증 (여권 권장), 이름이 등록 정보와 정확히 일치
- 감독관 채팅 안내에 따라 신분증 양면을 카메라에 제시
응시 환경 #
- 책상 위 모든 물건 치움, 벽면 메모,포스터 제거
- 듀얼 모니터는 한 대만 사용, 보조 화면 분리
- 가족,룸메이트 출입 차단, 조용한 단독 공간 확보
시스템 #
- 응시 30분 전 입실해 시스템 점검 통과
- 백그라운드 앱,알림,VPN 종료, 안정적인 유선 네트워크 권장
- 시험 시작 후 가장 먼저
alias k,do,자동완성,.vimrc셋업
정리 #
이 글에서 잡은 것:
- 2시간 운영. 작업당 배점이 우선순위. 배점 높고 쉬운 것부터, 막히면 flag 후 다음, 과몰입 금지
- 속도 셋업.
alias k,do,now,자동완성,vim 들여쓰기를 시작 1분 안에 - generator와 explain. 뼈대는 명령형으로, 세부 필드는
k explain과 검색으로 - 문서 활용. 즐겨찾기 대신 검색, 문서 시간도 시험 시간
- 단골 실수 8가지. context/namespace, dry-run 미사용, 들여쓰기, 파일명, 작업 미완독, 불필요한 YAML, apply 누락, label/selector 오타
- 부분 점수와 검산. 만들 수 있는 데까지 만들고
k get으로 확인 - 헷갈리는 개념 쌍, 도메인별 핵심 명령, 온라인 감독 점검
다음: 풀스케일 실기 모의고사 #
마지막 글입니다.
#21 풀스케일 실기 모의고사 (전 도메인 통합 시나리오 + 해설)에서는 실제 시험과 비슷한 도메인 분포로 통합 시나리오를 풀고 상세 해설을 답니다. 시험 환경처럼 시간을 재며 풀어 보고, 부족한 도메인을 한 번 더 다지는 마지막 단계입니다.