Làm sao để đạt CKAD với số điểm cao gần như tuyệt đối!?
Xin chào mọi người, mình là Thịnh.
Mình đã lấy được chứng chỉ CKAD (Certified Kubernetes Application Developer) với số điểm 99%. Mình viết bài này để chia sẻ lại toàn bộ kinh nghiệm của mình cho tất cả mọi người từ quá trình học, luyện đề, và đến lúc thi.
Hy vọng có thể hữu ích đối với mọi người!
Đầu tiên, xin cảm ơn DevOps VietNam đã tạo nên chương trình để hỗ trợ các anh chị em kỹ sư trong ngành có thể tiếp cận với các nền tảng học tập và chứng chỉ hàng đầu. Mình đã may mắn tham gia được chương trình DevOps VietNam x Linux Foundation Education: Đặc quyền kép, giúp cho mình tiết kiệm chi phí gần 50%.
Mọi người có thể tham khảo và làm theo hướng dẫn để có thể tối ưu chi phí nhé!
Một chút về bản thân mình
Mình hiện tại là Software Engineer, đã có thời gian tiếp xúc và sử dụng Kubernetes trong 5 năm.
Thời gian rảnh mình hay tự cài MicroK8s hoặc K3s để làm sao để deploy các web app của mình và làm sao để public ra internet trên con máy tính Intel NUC và Rapsberry Pi 5, nhờ đó có được thêm nhiều bài học từ những lần “vấp ngã thực tế” hơn ngoài khóa học.
Nếu mọi người có mục tiêu đi xa hơn với Kubernetes, mình nghĩ mọi người cũng nên tìm hiểu thêm về cách setup 1 cluster từ đầu như nào, hãy làm thực tế để mọi người có thể học nhanh hơn và hiểu sâu hơn.
Còn giờ thì mình lười rồi =]]]]]]
1. Quá trình học và luyện đề
1.1. Mình học như thế nào?
Mình học khoá Kubernetes Certified Application Developer (CKAD) with Tests của Mumshad Mannambeth trên Udemy.
Tại sao mình chọn khoá học này?
- Đầu tiên nguyên nhân của mình đơn giản thôi, thứ nhất khoá học nằm top đề xuất =]]]]
- Thứ hai là mình đi dạo qua Reddit và cũng thấy được khá nhiều bạn đề xuất đến khoá học này!
Đánh giá một chút về khoá học
- Khoá học bao phủ đầy đủ thậm chí là dư =]]]], trang bị cho mọi người đầy đủ tất cả kiến thức để đạt được kì thi CKAD tốt. Mọi người có thể truy cập đường dẫn trên để xem nội dung các thành phần khoá học.
- Ngoài trang bị các kiến thức lý thuyết, khoá học cũng hỗ trợ cho mọi người 2 bài mock exam và hướng dẫn cách quản lý thời gian khi thi.
1.2. Mình luyện đề ở đâu?
1.2.1. Kodekloud
Đây là nền tảng mà các bạn tiếp xúc khi học khoá học ở trên thường xuyên nhất. Mọi người có thể truy cập để học và làm mock exam từ khoá học trên.
Link: Certified Kubernetes Application Developer – Full Mock Exam Series
1.2.2. Killer Shell – killer.sh
Sau khi mọi người đăng ký thi chứng chỉ, mọi người sẽ có thể truy cập 2 bài mock exam từ Killer Shell để có thể thực hành và luyện đề.
Môi trường làm bài thi ở đây sẽ rất sát với thi thật nên mọi người có thể dùng nó để làm quen. Nên nhớ là 1 bài mock exam chỉ có thể truy cập trong vòng 36h thôi, mọi người luyện bao nhiêu lần cũng được hết, nhưng đã bắt đầu rồi thì sau 36h sẽ không thể truy cập được nữa.
Link: https://killer.sh/
1.2.3. Khác (Các nguồn miễn phí)
Sau khi vọc vạch các nguồn ở trên thì mình thấy chưa đủ tự tin để đặt lịch thi, do chỉ mới có mấy bộ đề thôi à, ít đề để luyện quá. Thế nên là mình lên GitHub tìm kiếm và lên Reddit xem đề xuất.
Cuối cùng mình thấy tìm ra được 2 nguồn mình thấy là siêu xịn ở đây:
- CK-X của Sailor Shell (sailor.sh): https://github.com/sailor-sh/CK-X, ở đây được tổng hợp các mock exam cho các chứng chỉ liên quan đến Kubernetes luôn, gồm CKA, CKAD và CKS (Bảo sao đặt CK-X =]]]]])
Giao diện thi cũng khá là giống thi thật và điểm cộng là được setup bằng Docker, thế nên là mọi người có thể chỉ cần install là chạy được trên máy của mình để mà luyện đề. Tuy nhiên cũng chỉ có 2 mock exam thôi =]]]]] (Ít ra là có thêm đề =]]]]])
À có 1 cái nhược điểm mình nhận ra là chỉ có SSH đến 1 server (khi thi, mỗi câu hỏi gần như là 1 server để mọi người SSH đến server đấy để thao tác giải đề), vậy nên nếu quá quen có thể sẽ bị quên exit server và ssh đến server khác khi chuyển câu.
- CKAD-DOJO của TiPunchLabs: https://github.com/TiPunchLabs/ckad-dojo, thực sự là lúc mình tìm ra được repo này là mình kiểu ơn giời, cái mình cần đây rồi!!!!
Mặc dù là không có giao diện thi xịn sò, nhưng đổi lại mọi người có được 20 bộ đề CKAD. Chỉ việc clone về và tha hồ mà luyện đề trên này!
Sau khi tìm ra được 2 repository xịn ở trên, mình đã nảy ra ý kiến là fork về và gom lại những ưu nhược điểm của 2 repository trên. Và thế là mình fork về, nhờ Claude đi update thêm để cook ra được cái repo này của mình =]]]]]]
Mọi người có thể truy cập ở đây: https://github.com/htthinh1999/CK-X
Hiện tại chỉ đơn giản là gộp 2 repository trên lại để CKAD có nhiều bộ đề, có được giao diện gần giống thi thật và đồng thời tách ra 3 server và mỗi lần làm xong câu hỏi đều cần phải exit và ssh qua server mới. Mọi người có thể clone repo của mình để trải nghiệm!
Nếu mọi người thấy hay thì nhớ để star lại cho 2 repository CK-X và CKAD-DOJO ủng hộ đội ngũ của họ nhé! Của mình không cần đâu, nói thiệt á, do mình đi fork về mà ._.
2. Quá trình thi & chuẩn bị thi
2.1. Chuẩn bị thi
2.1.1. Kiểm tra cấu hình máy
Ban đầu, mình luyện thi trên máy Macbook của mình, tới lúc đăng ký thi chứng chỉ xong, kiểm tra phần cứng và phần mềm thì bị vấn đề là MacOS 27 chưa được hỗ trợ .-. (Ngựa ngựa mới ra mắt nên cập nhật liền cho nóng =]]]]])
Thế là mình lôi con máy Windows cũ của mình ra để kiểm tra và đăng ký thi. Nên là đây cũng là kinh nghiệm cho mọi người, đọc kỹ và kiểm tra kỹ máy của mình đã đạt đủ các yêu cầu trước khi thi chưa nhé!
Đây là đường dẫn để kiểm tra nè: https://syscheck.bridge.psiexams.com/
2.1.2. Cung cấp thông tin
Trước khi thi mọi người cần cung cấp tên của mọi người và hình ảnh CCCD hoặc Passport của mọi người lên nền tảng.
Để nền tảng thi cập nhật thông tin và kiểm tra hình ảnh trên giấy tờ có khớp với hình ảnh chân dung của mọi người khi thi không. (Chắc tránh trường hợp thi hộ á .-.)
2.1.3. Chạy thử trước PSI Remote Testing Tutorial
Sau khi đăng ký thi chứng chỉ xong, trong mục “Prepare for the Exam” sẽ có PSI Remote Testing Tutorial, mọi người sẽ được trải nghiệm thử giả lập môi trường thi trước khi thi thật.
Lưu ý là chỉ được truy cập tối đa 3 lần và trước thời gian thi 2.5 tiếng. Mọi người sẽ được làm quen với môi trường và sẽ biết được các bước kiểm tra, như cần chụp ảnh chân dung, các vật được phép để trên bàn, kiểm tra bàn tay, cổ tay và tai. (Mình in đậm chữ biết nhan, chứ không phải sẽ làm trong lúc trải nghiệm môi trường giả lập đâu, chỉ làm trên thi thật thôi =]]]]]])
Kiểm tra xong thì nhớ gỡ cài đặt nha, để hôm thi cài môi trường thật để thi.
2.2. Quá trình thi
Mọi người có thể bắt đầu trước 30 phút, nguyên nhân là có thể kiểm tra phòng sẽ tốn thời gian, nên là cho phép mình vào sớm (nếu mà vào trễ 30 phút so với giờ đăng ký thi thì coi như là vắng mặt á nha).
Tương tự như chạy thử, mọi người sẽ được kiểm tra mọi thứ, 4 góc phòng, trên, dưới mặt bàn, không được có bất kì giấy tờ hay bút gì xung quanh, và các bước kiểm tra tay / tai ở trên.
À nếu mọi người đeo kính thì tháo kính ra để kiểm tra nữa nhé!
Có mã QR ở trên màn hình, mọi người được phép cầm điện thoại quét QR để dùng camera điện thoại quay thay vì bê cái lap quay vòng vòng =]]]]]]
Mọi thứ đều được trao đổi với giám thị thông qua chat, sau khi kiểm tra xong thì mọi người sẽ được vào môi trường làm bài thi.
Lúc này mọi người sẽ xem được giới thiệu qua môi trường, các nút nhấn như thế nào, làm bài cần chú ý ra làm sao và khi nào hoàn thành thì hãy liên hệ giám thị thông qua “Live chat” (Thực chất bấm đúng thứ tự là “End exam” trước rồi “End session” sau thôi).
2.2.1. Chuẩn bị môi trường
Môi trường thi mình mở sẵn 1 window VSCode và gõ chuẩn bị các biến lẫn alias để tăng tốc độ thao tác trong quá trình giải đề. Dưới đây là bộ mình chuẩn bị sẵn, mọi người có thể custom hoặc tham khảo thêm ở các bạn khác.
alias kns='kubectl config set-context --current --namespace'
alias kgp='kubectl get po'
alias kgd='kubectl get deploy'
alias kgs='kubectl get svc'
alias kd='kubectl describe'
alias kl='kubectl logs'
do='--dry-run=client -oyaml'
export KUBE_EDITOR=nano
Mỗi câu hỏi mình đều mở file ~/.profile sau khi ssh đến server để paste đoạn này vào rồi chạy lệnh sau để cập nhật các biến và alias.
source ~/.profile
Mục đích các lệnh trên
-
Mình sẽ gõ lệnh alias sau để đổi namespace sang tiger:
kns tigerthay vì gõ lệnh đầy đủ bên dưới sẽ dễ bị gõ sai chính tả
kubectl config set-context --current --namespace tiger -
Liệt kê pod, deployments, services:
kgp kgd kgsthay vì
kubectl get po kubectl get deploy kubectl get svc -
Mô tả pod, deploy, services:
kd po pod-0 kd deploy deploy-0 kd svc service-0thay vì
kubectl describe po pod-0 kubectl describe deploy deploy-0 kubectl describe svc service-0 -
Tương tự với logs:
kl pod-0 kl deploy/deploy-0thay vì
kubectl logs pod-0 kubectl logs deploy/deploy-0 -
Biến do ở đây mình sử dụng với mục đích để chạy dry-run (không thực thi trên server) và xuất file yaml, nên là mình có thể tạo yaml file pod, deployment, job, hoặc cronjob nhanh.
k run pod-0 --image=busybox $do -- sleep 3600 > pod-0.yaml k create deployment deploy-0 --image=nginx $do > deploy-0.yaml k create job job-0 --image=busybox $do -- echo 'Hello Kubernetes!' > job-0.yaml k create cronjob cronjob-0 --schedule='*/30 * * * *' --image=busybox $do -- date > cronjob-0.yaml -
Biến KUBE_EDITOR mình override lại thành nano, do mình quen xài nano, không biết xài vim, mọi người thông cảm! Ehe =]]]]]]
Sau khi chuẩn bị xong hết rồi thì bắt đầu làm bài thi thôi.
2.2.2. Vài vấn đề mình gặp phải khi thi
Build Docker image
Mình gặp được câu dễ lấy điểm nhất mà mọi người luôn dễ lấy, nhưng lại gặp trục trặc trong quá trình thi. Đấy chính là câu build Docker image với image & tag được chỉ định, sau đấy lưu Docker image thành file tar.
Yep, cái câu dễ lấy điểm nhất đấy! Mình đọc xong câu là lệnh nhảy sẵn trong đầu rồi =]]]]]]]. Chắc chắn mình sẽ chạy 2 lệnh sau để giải quyết bài toán.
docker build -t IMAGE:TAG .
docker save -o IMAGE-TAG.tar IMAGE:TAG
Nhưng mình không ngờ đó chính là câu lệnh đầu tiên 1 mớ lỗi è ra với báo lỗi liên quan đến overlay volume gì đấy. Mình lúc đó không tin vào mắt mình luôn ấy =]]]]]]]] Thế là mình kiểm tra lại từng ý:
- Trỏ đúng folder chưa?
- Trỏ đúng Dockerfile chưa?
- Có gõ sai lệnh docker build không?
Thế là sau 1 hồi kiểm tra thì mình khá chắc nịch là lỗi setup docker bên phía server đích rồi. May sao thời gian đầu mình có học các lệnh liên quan đến podman, thực chất vì nó giống lệnh docker, chả thay đổi gì ngoài thay chữ docker thành podman. Lúc này mình chuyển qua build bằng podman cli, thế mà lại chạy mình thường .-.
podman build -t IMAGE:TAG .
podman save -o IMAGE-TAG.tar IMAGE:TAG
Nên là mọi người cố thủ sẵn thêm nhé, phòng trường hợp giống mình .-. Thiệt sự là “hỏn lọn” =]]]]]]]
Deployment không rollout được
Yep, yêu cầu cập deployment nâng image version lên version cao hơn và chỉnh max surge & max unavailable, hì hục chạy lệnh edit rồi sửa.
k edit deploy deploy-0
Rồi mọi thứ không có gì xảy ra, pod ở yên đó, describe deployment không có gì, kiểm tra LimitRange có đang chặn không nhưng không có, hay kiểm tra Quota thì cũng không có nốt.
Sau khi kiểm tra thêm rollout status thì thấy đang bị paused, đây là nguyên nhân khiến cho deployment không rollout được nè. Thế là mình chạy lệnh resume và mọi thứ diễn ra bình thường:
k rollout resume deploy/deploy-0
Chỉnh sửa và apply yaml file vào namespace chỉ định
Đề bài yêu cầu rất đơn giản, bảo bạn cập nhật deployment yaml file đã được lưu trên server, sau đấy setup trên namespace chỉ định.
Khi mình vào file yaml edit chán chê mình mới kiểm tra lại và phát hiện ra namespace trong file yaml được set default thay vì namespace chỉ định.
Khá là may mắn mình chú ý được phần đấy, vậy nên là mọi người chú ý khi apply yaml file thì kiểm tra xem đúng là được setup trên namespace chỉ định chưa nhé!
2.3. Lời khuyên
-
Dựa theo đề thi mới nhất của CKAD sẽ phân bổ từ 15 đến 20 câu, đề của mình nhận được là 17 câu, mọi người tính trung bình thời gian trong vòng 2 tiếng thì mỗi câu sẽ làm tối đa là bao nhiêu phút, ở đây mình cho mỗi câu 7 phút. Đương nhiên sẽ có vài câu mọi người chỉ cần tốn chưa đến 1 phút để giải được, nhưng nếu ở câu nào đủ lâu thì hãy tận dụng flag để đánh dấu lại, lát nữa xong hết rồi quay lại tìm hiểu sau.
Mục đích của mình là hoàn thành bài thi với nhiều điểm nhất, chứ không phải giải được câu khó nhất, nhớ nhé! ^^
-
Mỗi câu đều được chỉ định để SSH đến 1 server riêng và namespace riêng, hãy nhớ giải đề trên đúng server đích và namespace mục tiêu, nếu nhầm 1 trong 2 coi như mất điểm câu đó. Mình nhớ được có 2 câu không yêu cầu namespace, 1 là câu build Docker image, 1 câu còn lại là tạo cronjob và tạo job từ cronjob, mình không thấy đề cập namespace nên mình để namespace mặc định (default).
-
Tận dụng imperative commands và biến do (dry-run) nhiều nhất có thể thay vì phải viết file yaml ngay từ đầu.
-
Hãy đọc kỹ và đầy đủ câu hỏi, nếu được hãy đọc 2 lần. Tránh trường hợp delete deployment rồi mới ngỡ ra dòng note đề không cho delete!
-
Luyện đề, đọc hiểu mình sai ở đâu, và luyện đề lại.
3. Lời kết
Trên đây là tất cả kinh nghiệm của mình đúc kết được và chia sẻ của mình trong quá trình học, luyện đề và thi. Cảm ơn tất cả mọi người đã đọc đến đây, cảm ơn rất nhiều! Nếu có gì sai sót, mong mọi người góp ý để xây dựng nên bài viết tốt hơn, và xây dựng cộng đồng phát triển. Cuối cùng thì
