9 phút đọc
Insights / CKAD

Kinh nghiệm ôn CKA và đạt 100/100 điểm CKAD của một Developer

Thiên Phan
Thiên Phan Tác giả
Đăng ngày 19/09/2026 Software Developer
Kinh nghiệm ôn CKA và đạt 100/100 điểm CKAD của một Developer

Chào mọi người trong hệ sinh thái DevOps VietNam, mình là Thiên, hiện đang làm Corecard Developer tại SHB.

Mình vừa thi đỗ CKA và CKAD, trong đó may mắn chạm mốc CKAD tuyệt đối 100/100 điểm. Nay mình đúc kết lại toàn bộ kinh nghiệm thực chiến từ lúc ôn luyện đến khi vào phòng thi, hy vọng sẽ tiếp thêm động lực cho những bạn làm developer nhưng cũng thích Ops như mình.

Screenshot_15-9-2026_152712_trainingportal.linuxfoundation.org

1. Vì sao mình quyết định thi?

Xuất phát là một Java Developer, mình tò mò và thích tìm hiểu về DevOps nên có cơ hội tiếp xúc với Kubernetes từ lúc mới vào nghề, đến nay đã hơn hai năm. Trong công việc, mình được tự tay thiết lập CI/CD, cài các add-on và viết Kubernetes manifest cho ứng dụng mình phát triển. Mình cũng thích cloud, thường tận dụng free tier để dựng lab.

Sau khi đọc bản tin về chương trình DevOps VietNam x Linux Foundation Education: đặc quyền kép, mình quyết định xuống tiền mua bundle CKA và CKAD. Tổng ưu đãi lúc đó là 45%. Mọi người có thể canh các chương trình vào tháng 5 hoặc tháng 11, nhớ kiểm tra mức giảm và điều kiện áp dụng lúc mua.

Mình muốn thi để xem năng lực bản thân đến đâu, có thêm chứng chỉ cho CV và tự tin hơn khi phỏng vấn. Biết đâu sau này mình lại chuyển hướng sang DevOps. Với cả, mình cũng thích sưu tầm cert.

2. Mình ôn luyện ra sao?

Một tháng cho CKA

Mình ôn luyện và thi CKA trong khoảng một tháng. Với mỗi đầu mục trong đề cương nội dung thi, mình tạo ít nhất ba bài lab từ dễ đến khó để tập làm.

Lab có AI hỗ trợ tạo, còn môi trường thực hành thì mình tận dụng free tier của các nhà cung cấp cloud. Bạn nào dùng cách này nhớ kiểm tra lại yêu cầu và lời giải với tài liệu chính thức, vì AI vẫn có thể tạo lab sai hoặc chưa sát nội dung cần học.

Hai ngày trước kỳ thi, mình lần lượt làm hai phiên luyện thi trên killer.sh để quen tay và quen nhịp làm bài.

Thêm hai tuần cho CKAD

Sau khi đỗ CKA, mình dùng lại bộ lab đã có và lên lộ trình hai tuần cho CKAD. Mình tập trung vào những nội dung mà quá trình ôn CKA chưa bao quát.

Mình ôn CKAD trong hai tuần sau khi đã làm với Kubernetes hơn hai năm và vừa thi đỗ CKA. Mốc một tháng cho CKA hay hai tuần cho CKAD là thời gian của riêng mình; nếu mới bắt đầu, mọi người nên dành thêm thời gian cho kiến thức nền và thực hành.

3. Phần mình bị mất điểm ở CKA

CKA có phạm vi kiến thức khá rộng. Các bài lab và hai phiên killer.sh mình đã làm chưa có dạng bài cài đặt cluster từ đầu, nên mình ôn chưa kỹ phần này và đã mất điểm khi thi. Những phần mình còn thiếu gồm cài đặt container runtime hỗ trợ CRI, nạp các module kernel br_netfilternf_conntrack bằng modprobe, cài đặt CNI và phân biệt khả năng thực thi NetworkPolicy giữa các CNI.

Mọi người nên rà lại từng mục trong đề cương trước ngày thi. Phần nào chưa tự làm được thì luyện thêm, kể cả khi chưa gặp trong bộ lab hay đề mô phỏng đang dùng.

4. Mẹo thao tác và quản lý thời gian khi thi

Dùng file alias cho những lệnh quen tay

Trong kỳ thi của mình, mỗi câu hỏi có hướng dẫn SSH từ máy trung gian (jump host) vào máy đích để làm bài. Để đỡ gõ lại các lệnh kubectl dài, mình tạo file alias /tmp/cka.sh trên jump host:

~/tmp/cka.sh
alias kg='kubectl get'
alias kgs='kubectl get svc'
alias kgp='kubectl get po'
alias kgd='kubectl get deploy'
alias kd='kubectl describe'
alias kdel='kubectl delete'
alias kaf='kubectl apply -f'
alias kn='kubectl config set-context --current --namespace'
export do='--dry-run=client -oyaml'
export now='--force --grace-period=0'

Trước khi SSH, mình dùng scp để chép file sang máy đích:

scp /tmp/cka.sh 
<ip_server>:~/.aliases

Thay IP_SERVER bằng địa chỉ máy đích theo hướng dẫn câu hỏi. Sau khi SSH vào, mình chạy source với file ~/.aliases để nạp alias vào phiên shell hiện tại. Cách này tiết kiệm cho mình khá nhiều thời gian gõ lệnh. Mọi người nên tập dùng alias từ lúc ôn lab và giữ những lệnh mình dùng thường xuyên.

Các ví dụ bên dưới dùng k làm tên viết tắt của kubectl. Nếu máy lab chưa có, mọi người có thể khai báo alias k=kubectl. Biến $do trong file trên dùng để xuất YAML mà chưa tạo tài nguyên; những lệnh không có $do sẽ thao tác trực tiếp với cluster.

Riêng biến now chứa tùy chọn xóa cưỡng bức (force delete). Khi dùng để xóa Pod, --force --grace-period=0 có thể xóa đối tượng khỏi API trước khi tiến trình trên node thực sự dừng. Chỉ dùng khi hiểu rõ tác động và yêu cầu bài cho phép, không thay cho thao tác xóa thông thường.

File alias ở đây được tạo và chép giữa các máy trong môi trường thi, không phải file mang từ máy cá nhân vào. Trước ngày thi, mọi người cần đọc hướng dẫn CKA/CKADquy định tài nguyên được phép sử dụng, vì môi trường và quy định có thể thay đổi.

Đọc đề, canh giờ và kiểm tra kết quả

Tập thành thói quen ngay từ lúc làm lab:

  • Để ý namespace trong đề. Với tài nguyên thuộc namespace, thêm `-n ` vào các lệnh hoặc đặt mặc định bằng `k config set-context –current –namespace=` (có thể dùng alias kn ở trên). Khi chuyển câu, nhớ kiểm tra lại namespace; tài nguyên cấp cluster thì không dùng namespace.
  • Dành khoảng hai phút đầu để đọc lướt toàn bộ đề, ưu tiên câu dễ hoặc câu nhiều điểm mà mình có thể làm được. Đánh dấu câu khó để quay lại. Nếu mắc ở một câu quá tám phút, tạm chuyển câu khác; mốc này có thể điều chỉnh theo thời gian còn lại.
  • Khi cần tra cấu trúc tài nguyên, thử k explain --recursive kèm loại tài nguyên hoặc trường cần xem trước khi mở tài liệu. Với YAML dài như NetworkPolicy, Ingress, PV/PVC hay Gateway, tra ví dụ trong tài liệu sẽ tiện hơn.
  • Làm xong mỗi câu, kiểm tra bằng k get, k describe và thử truy cập từ Pod tạm bằng curl hoặc wget khi cần. Apply YAML thành công chưa đủ để biết tài nguyên đã đáp ứng đúng yêu cầu.

Ví dụ dưới đây tạo Pod tạm dùng BusyBox để thử gọi Service bằng wget; Pod sẽ được xóa khi phiên chạy kết thúc:

k run tmp --image=busybox --rm -it --restart=Never -- wget -qO- http://svc:80

Nhớ thay tên Service, port và namespace theo bài đang làm.

Những lệnh tạo và sửa tài nguyên nên tập cho quen

Các lệnh imperative giúp tạo nhanh tài nguyên hoặc mẫu YAML để sửa tiếp.

# Pod / Deployment
k run nginx --image=nginx $do > pod.yaml
k run nginx --image=nginx --env=DB=mysql --labels=app=web,tier=fe $do
k create deploy web --image=nginx --replicas=3 --port=80 $do

# Job / CronJob
k create job j1 --image=busybox $do -- /bin/sh -c 'echo hello'
k create cj c1 --image=busybox --schedule="*/5 * * * *" $do -- date
k create job run-now --from=cronjob/c1

# ConfigMap / Secret
k create cm cfg --from-literal=k1=v1 --from-file=app.conf $do
k create secret generic s1 --from-literal=pw=123 $do
k create secret tls web-tls --cert=tls.crt --key=tls.key
k create secret docker-registry regcred --docker-server=... --docker-username=... --docker-password=...

# Service / Ingress
k expose deploy web --port=80 --target-port=8080 $do
k create ingress ing --rule="host.com/path=svc:80" $do

# SA / RBAC
k create sa bot
k create role r1 --verb=get,list --resource=pods
k create rolebinding rb1 --role=r1 --serviceaccount=default:bot
k auth can-i list pods --as=system:serviceaccount:default:bot

# Sửa nhanh không cần mở editor
k set image deploy/web nginx=nginx:1.25
k set env deploy/web DB_HOST=mysql
k set resources deploy/web -c nginx --requests=cpu=100m,memory=128Mi --limits=memory=256Mi
k set sa deploy/web bot
k label pod nginx env=prod ; k annotate pod nginx owner=duc
k scale deploy web --replicas=5
k autoscale deploy web --min=2 --max=8 --cpu-percent=70

Debug nhanh khi tài nguyên chưa chạy đúng

Lưu ý riêng k replace --force -f web.yaml: lệnh này xóa rồi tạo lại tài nguyên, không cập nhật tại chỗ.

k get pods -o wide --show-labels
k describe pod x | tail -20                  # Events nằm cuối
k logs x -c app --previous                   # log lần crash trước
k get events --sort-by=.metadata.creationTimestamp | tail
k exec -it x -c app -- sh
k top pod --containers
k get deploy web -o yaml > web.yaml          # kéo về sửa rồi replace
k replace --force -f web.yaml
k get pod x -o jsonpath='{.spec.containers[*].image}'
k api-resources --namespaced=true | grep '<kind>'

Trong lệnh cuối, thay <kind> bằng tên loại tài nguyên cần tìm. Lệnh xem log lần trước chỉ có dữ liệu khi container đã từng chạy rồi dừng; lệnh xem mức sử dụng tài nguyên cần cluster có Metrics API. Mọi người cũng nên đọc đầy đủ phần Events nếu vài dòng cuối chưa đủ để tìm nguyên nhân.

5. Chia sẻ lab cùng mọi người

Nếu cũng làm developer và thích Ops, mọi người có thể thử sức với CKA hoặc CKAD. Chọn lịch thi vừa sức, dành thêm thời gian cho những phần ít được làm trong công việc.

Bạn nào muốn tham khảo bộ lab mình tự xây dựng hoặc lộ trình ôn CKAD trong 14 ngày thì để lại bình luận hoặc nhắn tin cho mình nhé. Mình sẵn lòng chia sẻ để mọi người có thêm bài thực hành.

Cảm ơn mọi người đã đọc bài. Chúc các bạn ôn tốt và thi đạt kết quả như mong muốn!

Chia sẻ bài viết

Theo dõi
Thông báo của
5 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Đã sao chép liên kết vào bộ nhớ tạm!