Hướng Dẫn Thi CKA
Đạt Chứng Chỉ 2026
Ghi chú ôn thi thực tế, bài tập thực hành, kubectl cheat sheet, mẹo làm bài và phân tích toàn bộ syllabus Kubernetes v1.35. Bao gồm: etcd backup, RBAC, kubeadm, Gateway API, NetworkPolicy, xử lý sự cố, và luyện đề killer.sh. Kết quả: 89%.
Thông Tin Kỳ Thi CKA Tháng 3/2026
Tất cả thông tin cần biết trước khi đăng ký thi
| Hạng mục | Chi tiết |
|---|---|
| Hình thức thi | Thực hành trực tiếp trên terminal — KHÔNG phải trắc nghiệm |
| Thời gian | 2 giờ |
| Điểm đạt | 66% (nhiều guide cũ ghi 75% — đã thay đổi) |
| Phiên bản Kubernetes | v1.35 |
| Số câu hỏi | ~17–25 task (thay đổi theo phiên) |
| Chi phí | $445 USD (bao gồm 1 lần thi lại miễn phí) |
| Hiệu lực chứng chỉ | 2 năm |
| Nền tảng thi | PSI Secure Browser (giám sát từ xa) |
| Tài liệu được phép | kubernetes.io/docs, kubernetes.io/blog, github.com/kubernetes |
| Hệ điều hành trong thi | Ubuntu Linux terminal |
| Ngôn ngữ | Tiếng Anh, Nhật, Trung giản thể |
| Kèm theo | 2 session killer.sh simulator (24 giờ mỗi session), khoá học self-paced |
Phân Bổ Tỉ Lệ Điểm
5 tên miền chính — tập trung vào Troubleshooting (30%) và Cluster Architecture (25%)
- StorageClass và PersistentVolume
- Volume Mode, Access Modes, Reclaim Policy
- Cấu hình ứng dụng với Persistent Storage
- PV/PVC binding — storageClassName phải khớp chính xác
- Đánh giá cluster và node logging
- Giám sát ứng dụng
- Logs container stdout/stderr
- Xử lý lỗi ứng dụng (Pending/CrashLoopBackOff/ImagePullBackOff)
- Xử lý lỗi cluster component
- Xử lý sự cố mạng
- Deployments, Rolling Update và Rollback
- ConfigMaps và Secrets
- Scale ứng dụng
- DaemonSet, StatefulSet, tự phục hồi
- Resource Limits và tác động đến scheduling
- Static Pods, nodeSelector, Taints/Tolerations
- RBAC — Role, ClusterRole, RoleBinding
- Cài đặt cluster cơ bản với kubeadm
- Cluster High Availability
- Nâng cấp phiên bản cluster với kubeadm
- Backup và Restore etcd
- Cấu hình mạng trên cluster node
- Kết nối giữa các pod
- ClusterIP, NodePort, LoadBalancer
- Ingress Controller và Ingress Resources
- Gateway API (GA trong v1.2+)
- NetworkPolicy — kiểm soát traffic
- CoreDNS
Domain 1: Storage 10%
PV/PVC binding, StorageClass, Access Modes — câu hỏi thường thẳng và dễ điểm nếu nắm chắc
storageClassName phải khớp chính xác giữa PV và PVC — bao gồm cả chữ hoa/thường. manual ≠ Manual ≠ chuỗi rỗng.Access Modes — Cần nhớ thuộc
| Mode | Viết tắt | Ý nghĩa thực tế |
|---|---|---|
ReadWriteOnce | RWO | Một node mount đọc-ghi. Dùng 90% trường hợp. |
ReadOnlyMany | ROX | Nhiều node mount chỉ đọc. Hiếm gặp trong thi. |
ReadWriteMany | RWX | Nhiều node mount đọc-ghi. Không hoạt động với hostPath. |
ReadWriteOncePod | RWOP | Chỉ một pod mount đọc-ghi. Mới từ v1.29+. |
Reclaim Policy — Chính sách thu hồi
| Policy | Điều gì xảy ra |
|---|---|
Retain | PV tồn tại sau khi PVC bị xoá. Dữ liệu an toàn nhưng phải dọn thủ công. Dùng khi đề bài yêu cầu dữ liệu tồn tại. |
Delete | PV và storage bên dưới bị xoá. Mặc định của hầu hết cloud StorageClass. Cẩn thận! |
Recycle | Deprecated — không dùng, không cần nhớ. |
YAML Mẫu — PV + PVC + Pod
# PersistentVolume — cluster-scoped (không có namespace) apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 5Gi accessModes: [ReadWriteOnce] persistentVolumeReclaimPolicy: Retain storageClassName: manual # phải khớp với PVC! hostPath: path: /data/my-pv --- # PersistentVolumeClaim — namespace-scoped apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc namespace: default spec: accessModes: [ReadWriteOnce] resources: requests: storage: 2Gi storageClassName: manual # phải khớp với PV! --- # Pod sử dụng PVC spec: containers: - name: app image: nginx:1.27 volumeMounts: - name: data mountPath: /usr/share/nginx/html volumes: - name: data persistentVolumeClaim: claimName: my-pvc
Domain 2: Troubleshooting 30%
Domain lớn nhất — phải xây dựng quy trình xử lý bài bản thay vì mò mẫm ngẫu nhiên
Vị trí logs — Biết để tra cứu nhanh
| Component | Lệnh kiểm tra log |
|---|---|
kubelet | journalctl -u kubelet (systemd service) |
kube-apiserver | k logs -n kube-system kube-apiserver-<node> |
kube-scheduler | k logs -n kube-system kube-scheduler-<node> |
kube-controller-manager | k logs -n kube-system kube-controller-manager-<node> |
etcd | k logs -n kube-system etcd-<node> |
containerd | journalctl -u containerd |
Xử lý theo trạng thái Pod
- PVC chưa bound →
k get pvc— kiểm tra storageClassName có khớp không - Taint không có toleration tương ứng →
k describe nodexem mục Taints - Không đủ tài nguyên →
k describe podevents sẽ hiện "Insufficient cpu/memory" - nodeSelector hoặc affinity không khớp node nào → kiểm tra labels của node
- ResourceQuota namespace bị đầy →
k describe resourcequota -n <ns>
k logs <pod> --previous— luôn chạy lệnh này đầu tiên, lỗi thường rõ ràng- Sai command/entrypoint — bẫy:
["sh", "-c"]vs["sh -c"] - Thiếu cấu hình (env vars, configmaps, secrets)
- Gần như luôn là lỗi đánh máy tên image — kiểm tra từng ký tự
- Private registry thiếu imagePullSecrets
Lệnh debug toàn diện
# Kiểm tra node k get nodes k describe node <node-name> ssh <node> -- sudo systemctl status kubelet ssh <node> -- sudo journalctl -u kubelet --no-pager | tail -50 # Kiểm tra pod k describe pod <pod-name> # xem phần Events ở cuối k logs <pod-name> k logs <pod-name> --previous # pod đã crash k logs <pod-name> -c <container> # pod nhiều container # Kiểm tra service/endpoint k get endpoints <service-name> # rỗng = selector không khớp pod k describe svc <service-name> # Kiểm tra DNS k run test-dns --image=busybox:1.36 --rm -it -- nslookup kubernetes # Kiểm tra control plane khi cluster bị lỗi k get pods -n kube-system sudo kubeadm certs check-expiration ls /etc/kubernetes/manifests/
Domain 3: Workloads & Scheduling 15%
Deployments, rolling updates, ConfigMaps, static pods, scheduling constraints
Rolling Update và Rollback
k create deployment webapp --image=nginx:1.26 --replicas=3 # Cập nhật image (trigger rolling update) k set image deployment/webapp nginx=nginx:1.27 # ⚠️ LƯU Ý: "nginx" ở đây là TÊN CONTAINER trong pod spec, không phải tên deployment! k rollout status deployment/webapp k rollout history deployment/webapp # Rollback về phiên bản trước k rollout undo deployment/webapp # Rollback về revision cụ thể k rollout undo deployment/webapp --to-revision=2
ConfigMap và Secret — 3 cách inject vào Pod
envFrom: - configMapRef: name: app-config - secretRef: name: db-creds
env: - name: DATABASE_USER valueFrom: secretKeyRef: name: db-creds key: DB_USER
volumeMounts: - name: config-vol mountPath: /etc/config volumes: - name: config-vol configMap: name: app-config # ⚠️ Mount volume ConfigMap vào thư mục sẽ thay thế toàn bộ nội dung thư mục đó! # Dùng subPath nếu chỉ muốn mount 1 file.
Static Pods — Đặc biệt quan trọng
/etc/kubernetes/manifests/.# Tìm đường dẫn static pod cat /var/lib/kubelet/config.yaml | grep staticPodPath # Thường là: /etc/kubernetes/manifests # Tạo static pod sudo tee /etc/kubernetes/manifests/static-web.yaml <<EOF apiVersion: v1 kind: Pod metadata: name: static-web spec: containers: - name: web image: nginx:1.27 EOF
Domain 4: Cluster Architecture 25%
etcd backup/restore, kubeadm, RBAC — phân biệt CKA với CKAD rõ nhất tại đây
RBAC — Kiểm soát truy cập
| Object | Phạm vi | Gắn với |
|---|---|---|
Role | Namespace | RoleBinding |
ClusterRole | Toàn cluster | ClusterRoleBinding hoặc RoleBinding |
RoleBinding | Namespace | Role hoặc ClusterRole |
ClusterRoleBinding | Toàn cluster | ClusterRole |
# Tạo Role (quyền trong namespace) k create role pod-reader \ --verb=get,list,watch \ --resource=pods \ -n dev # Tạo RoleBinding k create rolebinding read-pods \ --role=pod-reader \ --serviceaccount=dev:my-sa \ -n dev # Kiểm tra quyền (rất hay dùng trong thi) k auth can-i list pods -n dev \ --as=system:serviceaccount:dev:my-sa
etcd Backup và Restore — GẦN NHƯ CHẮC CHẮN CÓ TRONG ĐỀ
--cacert, --cert, --key. Tìm đường dẫn cert trong /etc/kubernetes/manifests/etcd.yaml.# BACKUP etcd ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key # Kiểm tra snapshot ETCDCTL_API=3 etcdctl snapshot status /tmp/etcd-backup.db --write-table # RESTORE etcd # Bước 1: Restore ra thư mục mới ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db \ --data-dir=/var/lib/etcd-restored # Bước 2: Cập nhật etcd manifest để dùng thư mục mới sudo vi /etc/kubernetes/manifests/etcd.yaml # Đổi --data-dir=/var/lib/etcd → /var/lib/etcd-restored # Đổi hostPath.path tương ứng # Bước 3: Đợi etcd restart (~30-60s) — kubectl có thể không respond, bình thường!
kubeadm Upgrade — Control Plane → Worker
### CONTROL PLANE NODE ### sudo apt-mark unhold kubeadm sudo apt-get install -y kubeadm=1.35.0-1.1 sudo apt-mark hold kubeadm sudo kubeadm upgrade plan sudo kubeadm upgrade apply v1.35.0 sudo apt-get install -y kubelet=1.35.0-1.1 kubectl=1.35.0-1.1 sudo systemctl restart kubelet ### WORKER NODE ### # Từ control plane: drain worker k drain worker-1 --ignore-daemonsets --delete-emptydir-data # SSH vào worker, upgrade sudo apt-get install -y kubeadm=1.35.0-1.1 kubelet=1.35.0-1.1 kubectl=1.35.0-1.1 sudo kubeadm upgrade node # ← worker dùng "node", không phải "apply"! sudo systemctl restart kubelet # Từ control plane: uncordon k uncordon worker-1
Domain 5: Services & Networking 20%
Services, Ingress, Gateway API, NetworkPolicy, DNS — NetworkPolicy là nơi mất điểm nhiều nhất
Các loại Service
| Type | Cách hoạt động | Khi nào dùng |
|---|---|---|
| ClusterIP | IP nội bộ cluster | Service nội bộ (mặc định) |
| NodePort | ClusterIP + cổng trên mọi node (30000-32767) | Dev/test, truy cập trực tiếp qua node |
| LoadBalancer | NodePort + cloud LB | Production trên cloud |
| ExternalName | CNAME đến DNS external | Trỏ đến dịch vụ bên ngoài |
NetworkPolicy — Quy tắc quan trọng
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend namespace: prod spec: podSelector: matchLabels: app: backend policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 8080
Gateway API — Mới trong v1.35 (GA)
Gateway và HTTPRoute trỏ đến backend service.apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: my-gateway spec: gatewayClassName: nginx listeners: - name: http protocol: HTTP port: 80 --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: my-route spec: parentRefs: - name: my-gateway rules: - backendRefs: - name: my-service port: 80
Lệnh Imperative Nhanh
Dưới áp lực 2 giờ thi, imperative nhanh hơn viết YAML nhiều lần
$do = --dry-run=client -o yaml và $now = --force --grace-period=0. Dùng trong luyện tập nhưng nhớ phải gõ đầy đủ trong thi!## POD k run nginx --image=nginx:1.27 k run nginx --image=nginx:1.27 --port=80 --labels=app=web k run nginx --image=nginx:1.27 --dry-run=client -o yaml > pod.yaml ## DEPLOYMENT k create deployment webapp --image=nginx:1.27 --replicas=3 k scale deployment webapp --replicas=5 k set image deployment/webapp nginx=nginx:1.28 ## SERVICE k expose deployment webapp --port=80 --target-port=8080 k expose deployment webapp --port=80 --target-port=8080 --type=NodePort k port-forward svc/webapp 8080:80 # test local ## RBAC k create sa my-app -n prod k create role pod-reader --verb=get,list,watch --resource=pods -n prod k create rolebinding read-pods --role=pod-reader --serviceaccount=prod:my-app -n prod k auth can-i list pods -n prod --as=system:serviceaccount:prod:my-app ## NODE k cordon node-1 k drain node-1 --ignore-daemonsets --delete-emptydir-data k uncordon node-1 k taint nodes node-1 key=value:NoSchedule ## CONFIGMAP / SECRET k create configmap app-cfg --from-literal=LOG=debug --from-literal=ENV=prod k create configmap nginx-conf --from-file=nginx.conf k create secret generic db-creds --from-literal=user=admin --from-literal=pass=s3cr3t
kubectl Cheat Sheet for CKA
Các lệnh dùng nhiều nhất trong thi — nhóm theo chức năng
# ⚠️ LUÔN chạy trước mỗi câu hỏi! k config use-context <context-name> k config current-context # Đặt namespace mặc định (alias kn) kubectl config set-context --current --namespace=<namespace> # Xem tất cả tài nguyên trong mọi namespace k get pods -A k get pods -o wide
k describe pod <pod> # xem events — quan trọng nhất k logs <pod> k logs <pod> --previous k exec -it <pod> -- /bin/bash k exec <pod> -- curl http://localhost:8080 k get events --sort-by='.lastTimestamp' k top pods -n prod k top nodes k debug node/<node> -it --image=busybox:1.36
# Tạo YAML mà không apply k run nginx --image=nginx:1.27 --dry-run=client -o yaml > pod.yaml k create deployment webapp --image=nginx --dry-run=client -o yaml > deploy.yaml k expose deployment webapp --port=80 --dry-run=client -o yaml > svc.yaml k create job myjob --image=busybox -- sh -c "echo done" --dry-run=client -o yaml > job.yaml k create cronjob mycron --image=busybox --schedule="*/5 * * * *" -- sh -c "echo tick" \ --dry-run=client -o yaml > cron.yaml # Copy YAML từ resource có sẵn k get deployment webapp -o yaml > webapp-backup.yaml
# Xoá nhanh k delete pod <pod> --force --grace-period=0 k delete pods --all -n prod # Patch resource k patch deployment webapp -p '{"spec":{"replicas":5}}' # JSONPath k get pods -o jsonpath='{.items[*].metadata.name}' # Custom columns k get pods -o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[0].image # Copy file từ pod k cp pod-name:/var/log/app.log ./app.log
Môi Trường Thi (PSI Remote Desktop)
Những điều bất ngờ về môi trường thi mà phải biết trước
Ctrl+Shift+C/Vk alias cho kubectl là được pre-configure sẵn trên mọi máy.- Webcam và mic bật suốt — dọn sạch bàn làm việc
- Không có màn hình thứ hai
- Không dùng tai nghe/earphones
- Bình nước trong suốt, không nhãn — được phép
- Nghỉ vệ sinh được phép nhưng đồng hồ không dừng
Chiến Thuật Ngày Thi
Phương pháp two-pass đã giúp tiết kiệm thời gian đáng kể
Phương Pháp Two-Pass
Checklist Ngày Thi
- Kiểm tra CMND/Hộ chiếu — tên khớp với tài khoản CNCF
- Dọn sạch bàn làm việc — chỉ để máy tính
- Kiểm tra PSI Secure Browser hoạt động bình thường
- Có sẵn nước uống (bình trong suốt, không nhãn)
- Đặt notepad ảo — ghi sẵn cert paths etcd
- Đọc kỹ câu hỏi trước khi làm — switch context đúng cluster
- Luyện thành thạo copy/paste Ctrl+Shift+C/V trong terminal
- Biết cách dùng search trên kubernetes.io thay vì navigate
Lỗi Thường Gặp Dẫn Đến Trượt
Học từ sai lầm của người đi trước — tránh những bẫy này
Mỗi câu hỏi chạy trên một cluster khác nhau. Không chạy k config use-context <name> đầu tiên = bạn đang làm sai cluster = mất điểm hoàn toàn dù làm đúng.
PVC sẽ ở trạng thái Pending mãi mãi. Không có error message rõ ràng. Luôn kiểm tra storageClassName ở cả hai phía — kể cả case chữ hoa/thường.
k set image deployment/webapp webapp=nginx:1.27 — "webapp" đầu tiên là tên container trong pod spec, không phải tên deployment. Kiểm tra tên container bằng k describe deployment webapp.
Nếu một câu khó tốn quá 6-7 phút → đánh dấu và bỏ qua. Quay lại sau khi đã làm hết câu dễ. Điểm của câu đó không bù đắp được thời gian mất đi.
k delete pod static-web-node1 sẽ không có tác dụng — kubelet tạo lại ngay. Phải rm /etc/kubernetes/manifests/static-web.yaml trên node tương ứng.
Khi thêm egress NetworkPolicy, nhớ cho phép port 53 UDP/TCP đến CoreDNS namespace. Nếu quên → DNS không resolve → service không kết nối được dù rule port đúng.
Lộ Trình Học 4–5 Tuần
Kế hoạch học được tối ưu từ kinh nghiệm thực tế
Link Docs Dùng Trong Thi
Các trang kubernetes.io thực sự mở trong lúc thi
killer.sh vs Thi Thật
killer.sh khó hơn thi thật — nhưng đó là điều tốt
| Tiêu chí | killer.sh | Thi thật CKA |
|---|---|---|
| Độ khó | Khó hơn — câu hỏi phức tạp hơn | Harder trên thực tế do áp lực thời gian |
| Mục đích | Luyện tốc độ và tự tin | Chứng nhận thực sự |
| Khi làm | 2 lần: 2 tuần trước + 3 ngày trước | Sau khi luyện xong |
| Điểm lần đầu | Thường thấp — bình thường! | Mục tiêu ≥66% |
| Giá trị | Xây dựng muscle memory | Kết quả cuối cùng |
CKA vs CKAD vs CKS — Nên Thi Cái Nào?
So sánh 3 chứng chỉ Kubernetes để chọn đúng hướng đi
| CKA | CKAD | CKS | |
|---|---|---|---|
| Focus | Quản trị Cluster | Phát triển ứng dụng | Bảo mật |
| Dành cho | SRE, Platform Eng, Admin | Developer deploy lên K8s | Security Eng, Senior Admin |
| Độ khó | Khó — etcd và troubleshooting brutal | Trung bình — nếu đã deploy K8s | Khó nhất — Falco/AppArmor khó nhớ |
| Điểm đạt | 66% | 66% | 67% |
| Điều kiện | Không có | Không có | Phải có CKA đang còn hiệu lực |
| Nên học trước? | Bắt đầu ở đây nếu quản lý cluster | Nếu thuần dev | Chỉ khi công việc yêu cầu |
Thay Đổi Trong Kubernetes v1.35
Nếu đang học từ guide cũ (v1.29/v1.30) — một số nội dung đã sai!
--record flag trong rollout — đã deprecated/removed. Kiểm tra ngày viết của mọi tài liệu bạn tham khảo.| Tính năng | Trạng thái v1.35 | Ảnh hưởng đến thi |
|---|---|---|
| Sidecar containers (native) | GA | Init container với restartPolicy: Always chạy như sidecar. CÓ thể gặp trong đề. |
| Gateway API | GA (v1.2+) | Đang thay thế Ingress. Có câu hỏi trong thực tế. Biết tạo Gateway + HTTPRoute. |
| kubectl debug | GA | k debug node/<name> và k debug pod/<name> — hữu ích khi troubleshoot. |
| cgroup v2 | Default | Tất cả nodes dùng cgroup v2. Ảnh hưởng resource monitoring. |
| ValidatingAdmissionPolicy | GA | CEL-based admission không cần webhook. Trong curriculum — luyện 15 phút. |
| CSI migration hoàn tất | Done | In-tree volume plugin đã migrate sang CSI. StorageClass provisioner đều là CSI. |
| In-place pod vertical scaling | Beta | Resize CPU/memory không cần restart. Biết nó tồn tại, không cần học sâu. |
Tài Nguyên Luyện Thi
Môi trường thực hành và công cụ học tập
Môi trường thực hành
Trước Khi Đặt Lịch Thi
- Cài cluster từ đầu bằng kubeadm (ít nhất 2-3 lần)
- etcd backup và restore thành thạo (luyện 10+ lần)
- Thành thạo RBAC — không phải tra cứu cú pháp
- Có thể troubleshoot node NotReady thành thục
- Có cluster thực hành (kind/minikube hoặc online)
- Đã làm killer.sh ít nhất 1 lần
- CMND/Hộ chiếu sẵn sàng, tên khớp CNCF account