Kubernetes cho Frontend Developer · Phần 19 — Thời khoá biểu 6 tuần, checklist, đồ án và cheat sheet
Khép series: thời khoá biểu 6 tuần ánh xạ sang các phần đã học kèm sản phẩm cuối tuần, checklist tự đánh giá ba cấp độ, đồ án cuối khoá với bài kiểm tra curl không rớt request, cheat sheet kubectl và tài nguyên học tiếp.
Mười tám phần trước là nội dung. Phần này là cách dùng nội dung đó: một thời khoá biểu sáu tuần để bạn không đọc hết rồi quên hết, một checklist để biết mình đang ở cấp độ nào, một đồ án để chứng minh, và một cheat sheet để dán cạnh màn hình. Nếu bạn đọc series theo kiểu nhảy cóc, đây là bài để quay lại và lấp lỗ hổng.
Cách dùng bài này tuỳ vào bạn đang ở đâu. Chưa bắt đầu: đọc thời khoá biểu, đặt lịch, quay lại Phần 1. Đã đi được nửa đường: đối chiếu checklist, làm phần thực hành của những mục còn trống. Đã đọc hết: làm đồ án; chưa làm đồ án thì chưa gọi là xong.
Thời khoá biểu 6 tuần
Tổng cộng khoảng 58 giờ, tức 2 giờ mỗi ngày làm việc trong 6 tuần, hoặc 10 giờ mỗi cuối tuần. Cột cuối là thứ quyết định một tuần đã xong hay chưa; đọc xong mà chưa có sản phẩm thì tuần đó chưa xong.
| Tuần | Nội dung (phần trong series) | Sản phẩm phải có cuối tuần |
|---|---|---|
| Tuần 1 ~10 giờ | Phần 1–4: định vị, Linux, mạng, YAML, Docker, Dockerfile, registry, Compose | Một app React đã đóng gói thành image dưới 50MB, chạy bằng docker run, F5 ở route con không lỗi 404, image đã push lên ghcr.io |
| Tuần 2 ~10 giờ | Phần 5–6: kiến trúc, kind, kubectl, Pod, ReplicaSet, Deployment, label, namespace | Cluster kind 3 node chạy được. Deploy app bằng Deployment, scale lên 5, rolling update sang version mới rồi rollback thành công |
| Tuần 3 ~10 giờ | Phần 7–9: Service, Ingress, ConfigMap, Secret, probe, resources, storage, vòng đời Pod | App truy cập được qua app.local bằng Ingress. Có readiness/liveness probe. Config đọc từ ConfigMap. Tự debug được endpoints rỗng |
| Tuần 4 ~12 giờ | Phần 10–13: runtime config, deploy SPA, Next.js SSR, nhiều app một domain, cache, zero-downtime, sổ tay debug | Một image duy nhất chạy được ở 2 môi trường khác cấu hình. Deploy thêm một app Next.js SSR. Xử lý được ít nhất 5 lỗi trong sổ tay debug |
| Tuần 5 ~8 giờ | Phần 14–16 (tới hết pipeline GitHub Actions): chiến lược deploy, HPA, Helm, Kustomize, CI/CD | Chart Helm hoặc bộ Kustomize overlay cho staging + production. Pipeline GitHub Actions tự build, push và deploy |
| Tuần 6 ~8 giờ | Phần 16 (ArgoCD)–18 + đồ án: GitOps, TLS, observability, bảo mật, chi phí | Đồ án cuối khoá hoàn chỉnh (mục dưới), có HTTPS thật và tài liệu kiến trúc |
Vài lưu ý khi xếp lịch:
- Tuần 1 là tuần mọi người muốn bỏ qua nhất và cũng là tuần khiến họ mắc kẹt nhất về sau. Nếu bạn đã dùng Docker hằng ngày, làm phần thực hành của Phần 4 trong một buổi rồi đi tiếp; nếu chưa, đừng nén.
- Tuần 4 nặng nhất vì bài toán runtime config (Phần 10) là bài bạn phải hiểu thật, không phải chỉ chạy được. Khoảnh khắc mở console ở hai cổng và thấy hai
window.__APP_CONFIG__khác nhau là mốc quan trọng nhất của cả series. - Tuần 5 và 6 cần một repo GitHub thật; cluster kind vẫn đủ, không cần thuê cloud. Tuỳ chọn 5–10 USD cho một VPS hoặc cluster nhỏ trong tuần 6 để có HTTPS Let’s Encrypt thật; không bắt buộc, issuer tự ký hoặc staging là chấp nhận được.
Nếu bạn chỉ có 2 tuần: học Phần 2–4 (bỏ Docker Compose), Phần 5–8 (kiến trúc, kubectl, Pod, Deployment, Service, Ingress, ConfigMap, probe), và Phần 10–13 (đặc biệt là Phần 10 và Phần 13). Bỏ qua Phần 14–18, quay lại sau khi đã dùng K8s thực tế vài tuần; lúc đó Helm, CI/CD và HPA sẽ có bối cảnh để bám vào.
Checklist tự đánh giá năng lực
Đọc từng dòng và trả lời thật. “Đã đọc” không phải “làm được”. Một dòng chỉ được tick khi bạn làm được mà không nhìn tài liệu, hoặc giải thích được cho đồng nghiệp mà không lúng túng.
Cấp độ 1 — Hiểu biết (biết đọc, biết nói chuyện)
- Giải thích được khác biệt giữa image và container.
- Vẽ được luồng request từ trình duyệt tới Pod: DNS → LoadBalancer → Ingress Controller → Service → Pod.
- Giải thích được Pod, Deployment, Service, Ingress bằng ngôn ngữ của mình, không lặp lại định nghĩa.
- Biết vì sao không nên dùng tag
:latest. - Phân biệt được readiness và liveness probe, và nói được hậu quả khi fail của từng loại.
- Đọc hiểu một file YAML manifest do người khác viết: chỉ được đâu là selector, đâu là template, đâu là probe.
Đạt cấp 1 là bạn tham gia được buổi họp với DevOps mà không phải giả vờ hiểu. Với FE dev, cấp này đã đủ để hết “vùng tối” sau git push.
Cấp độ 2 — Vận hành (làm được việc hằng ngày)
- Viết Dockerfile multi-stage tối ưu cho app FE, image dưới 50MB.
- Viết bộ Deployment + Service + Ingress từ đầu, không copy.
- Dùng kubectl để xem log, exec, port-forward, describe.
- Chẩn đoán được CrashLoopBackOff, ImagePullBackOff, 502, 503 theo quy trình bảy bước của Phần 13.
- Cập nhật version app và rollback khi cần, bằng
set imagelẫn bằng sửa manifest. - Dùng ConfigMap/Secret đúng cách, biết khi nào phải restart Pod và vì sao.
Đạt cấp 2 là bạn tự deploy staging cho QA, tự xử lý sự cố ở tầng của mình mà không phải gọi ai lúc nửa đêm.
Cấp độ 3 — Thành thạo (tự chủ hoàn toàn)
- Triển khai runtime config pattern cho SPA, và giải thích được vì sao
envFrommột mình không đủ. - Thiết lập zero-downtime deploy đầy đủ: probe + preStop + PDB +
maxUnavailable: 0, kiểm chứng bằng vòng lặp curl. - Viết Helm chart hoặc Kustomize overlay cho nhiều môi trường.
- Xây pipeline CI/CD hoàn chỉnh có tự động rollback, hoặc GitOps với ArgoCD.
- Cấu hình HPA và điều chỉnh resources dựa trên số liệu thật từ
kubectl top, không phải đoán. - Thiết lập HTTPS tự động và security header.
- Tư vấn được cho team nên hay không nên dùng K8s cho một dự án cụ thể, kèm con số chi phí.
Đạt cấp 3 là bạn sở hữu được hạ tầng của frontend trong team, và là hồ sơ thật cho vị trí senior/fullstack.
Đồ án cuối khoá
Yêu cầu: xây dựng và vận hành một hệ thống frontend hoàn chỉnh, dùng đúng những gì đã học, trên cluster kind hoặc cluster thật.
Thành phần bắt buộc
- Một React/Vue SPA (dashboard), dùng runtime config pattern.
- Một Next.js SSR (trang marketing), có
startupProbe. - Một backend giả lập:
kennethreitz/httpbinlà đủ, hoặc một API Node đơn giản trả JSON và có/health. - Tất cả nằm sau một Ingress, chia theo path hoặc subdomain.
Internet / máy bạn
│
▼
[ ingress-nginx ] TLS từ cert-manager (staging hoặc selfsigned khi chạy local)
├── app.local/ → marketing (Next.js SSR, startupProbe, HPA 2–10)
├── app.local/app/* → dashboard (React SPA, base /app/, runtime config)
└── app.local/api/* → backend (httpbin hoặc API Node)
Hoặc theo subdomain: www.app.local, dashboard.app.local, api.app.local
(dễ hơn vì không cần base path; thêm cả ba vào /etc/hosts)
Yêu cầu kỹ thuật
- Mỗi app một Deployment, tối thiểu 2 replica.
- Đầy đủ readiness + liveness probe, có endpoint health thật (nginx
/healthz, Next.js/api/health). - Có
requestsvàlimitshợp lý, kiểm chứng bằngkubectl topdưới tải. - ConfigMap cho cấu hình, Secret cho dữ liệu nhạy cảm (ví dụ
SESSION_SECRETcủa Next.js). - HPA cho app SSR (min 2, max 10), có metrics-server chạy.
- PodDisruptionBudget cho mọi app.
preStophook vàterminationGracePeriodSecondscho mọi app.- HTTPS bằng cert-manager (issuer staging hoặc selfsigned nếu chạy local).
- Ba namespace
dev,staging,prodkhác cấu hình (host, replicas, API URL, resources). - Quản lý bằng Helm hoặc Kustomize; không có ba bản copy của cùng một file.
- Pipeline CI/CD tự động build → push → deploy (push, hoặc GitOps qua ArgoCD).
- Deploy version mới không mất một request nào, kiểm chứng bằng vòng lặp curl liên tục trong lúc deploy.
Gợi ý bố cục repo
capstone/
├── apps/
│ ├── dashboard/ # Vite + React Router, base '/app/', config.ts đọc window.__APP_CONFIG__
│ ├── marketing/ # Next.js, output: 'standalone', app/api/health/route.ts
│ └── backend/ # tuỳ chọn: Express trả JSON, hoặc bỏ và dùng httpbin
├── deploy/
│ ├── base/ # Deployment, Service, Ingress, PDB, HPA, NetworkPolicy cho từng app
│ └── overlays/
│ ├── dev/
│ ├── staging/
│ └── prod/
├── .github/workflows/
│ ├── ci.yml # test + build + push cho từng app khi thư mục của nó thay đổi
│ └── deploy.yml # sửa tag trong overlays hoặc kubectl/helm deploy
├── docs/
│ ├── architecture.md # sơ đồ + luồng request + quyết định thiết kế
│ └── postmortem.md # 5 lỗi đã gặp và cách sửa
└── README.md # chạy lại từ đầu trong 10 lệnh
Lịch gợi ý cho tuần 6
| Ngày | Việc |
|---|---|
| 1 | Dựng cluster mới capstone, ingress-nginx, metrics-server, cert-manager. Deploy backend + Ingress /api. Curl được |
| 2 | Dashboard SPA với base path, runtime config, probe, PDB, preStop. F5 ở /app/settings không 404 |
| 3 | Marketing Next.js với startupProbe, HPA, Secret, INTERNAL_API_URL trỏ Service DNS. Tạo tải, thấy HPA scale |
| 4 | Tách base/overlays cho ba namespace. kubectl diff -k từng overlay. cert-manager selfsigned, HTTPS lên |
| 5 | Pipeline: build + push lên ghcr.io, deploy vào dev tự động, prod sau phê duyệt. Chạy bài kiểm tra cuối |
| 6–7 | Viết architecture.md, postmortem.md, README. Xoá cluster, chạy lại README từ đầu để chắc nó đúng |
Sản phẩm nộp
- Repository Git chứa source code và toàn bộ manifest.
- README có sơ đồ kiến trúc và hướng dẫn chạy lại từ đầu (một người khác, máy sạch, làm theo README phải ra cùng kết quả).
- Một tài liệu ngắn ghi lại 5 lỗi đã gặp và cách bạn đã sửa. Đây là phần giá trị nhất của đồ án: nó chứng minh bạn đã gặp lỗi thật, đọc Events, và tự sửa. Mỗi lỗi ghi triệu chứng, lệnh chẩn đoán, nguyên nhân, cách sửa, cách phòng.
Bài kiểm tra cuối
Mở một terminal và chạy vòng lặp:
while true; do
curl -s -o /dev/null -w "%{http_code}\n" -k https://app.local/
sleep 0.2
done
Rồi ở terminal khác deploy version mới (đổi tag, commit, để pipeline hoặc ArgoCD chạy; hoặc kubectl set image). Nhìn terminal đầu suốt quá trình rollout.
Kết quả mong đợi: một cột
200liền mạch từ đầu đến cuối. Nếu không có mã nào khác 200 xuất hiện, bạn đã đạt. Nếu có502hoặc503, quay lại checklist bảy điểm ở Phần 12: thiếu readiness probe, thiếupreStop,maxUnavailablekhác 0, hayreplicas: 1. Lặp lại bài kiểm tra cho cả app SSR, nơistartupProbesai là nguyên nhân hay gặp nhất.
Tự chấm: mỗi mục trong “Yêu cầu kỹ thuật” một điểm, bài kiểm tra cuối hai điểm, tài liệu 5 lỗi hai điểm. Trên 12/16 là đồ án đủ để đưa vào CV kèm link repo.
Cheat sheet lệnh kubectl
Đặt alias k=kubectl và bật completion (Phần 5) rồi dán bảng này cạnh màn hình. Mọi lệnh nhận -n <namespace>; đặt namespace mặc định bằng lệnh ở nhóm “Ngữ cảnh” để khỏi gõ mãi.
# ===== XEM =====
k get po # pods trong namespace hiện tại
k get po -o wide # kèm IP, node
k get po -w # theo dõi realtime
k get all -n web
k get deploy,svc,ing,hpa -n web
k get po --show-labels
k get po -l app=frontend
k get po -A --field-selector=status.phase!=Running # Pod nào không khoẻ trong toàn cluster
k get ep frontend # endpoints -> kiểm tra Service có thấy Pod không
k get events -A --sort-by=.metadata.creationTimestamp
# ===== CHI TIẾT =====
k describe po <pod> # QUAN TRỌNG NHẤT, đọc phần Events ở cuối
k describe svc <svc>
k describe ing <ing>
k get po <pod> -o yaml
k get po <pod> -o jsonpath='{.spec.containers[0].image}'
# ===== LOG =====
k logs <pod>
k logs -f <pod>
k logs --previous <pod> # log lần chết trước, khi CrashLoopBackOff
k logs --tail=100 --timestamps <pod>
k logs -l app=frontend --all-containers -f
k logs deploy/frontend -f
# ===== DEBUG =====
k exec -it <pod> -- sh
k exec <pod> -- env # 90% lỗi "gọi sai API" tìm ra ở đây
k exec <pod> -- cat /etc/nginx/conf.d/default.conf
k port-forward svc/frontend 8080:80
k cp <pod>:/path/file ./file
k run tmp --rm -it --image=nicolaka/netshoot -- bash # Pod tạm để test mạng nội bộ
k debug <pod> -it --image=busybox --target=web # chui vào Pod distroless không có shell
# ===== THAY ĐỔI =====
k apply -f file.yaml
k apply -f ./k8s/
k apply -k overlays/prod
k delete -f file.yaml
k scale deploy/frontend --replicas=5
k set image deploy/frontend web=ghcr.io/org/app:v2
k rollout status deploy/frontend
k rollout history deploy/frontend
k rollout undo deploy/frontend
k rollout restart deploy/frontend
k annotate deploy/frontend kubernetes.io/change-cause="v2: fix bug X"
# ===== TÀI NGUYÊN =====
k top po -n web # cần metrics-server
k top no
k describe no <node> # Allocated resources, Conditions, Events của node
# ===== NGỮ CẢNH =====
k config current-context # KIỂM TRA TRƯỚC MỌI LỆNH NGUY HIỂM
k config get-contexts
k config use-context kind-fe-lab
k config set-context --current --namespace=web
# ===== KIỂM TRA TRƯỚC KHI ÁP DỤNG =====
k apply -f k8s/ --dry-run=server # validate bằng API server thật, không tạo gì
k diff -f k8s/ # cluster sẽ thay đổi thế nào
k auth can-i delete deploy -n web
# ===== GIẢI THÍCH SCHEMA (rất hữu ích khi quên cú pháp) =====
k explain deployment.spec.strategy
k explain ingress.spec.rules --recursive
Ba lệnh trong đó bạn sẽ gõ nhiều nhất khi có sự cố, theo đúng thứ tự: k describe po (Events), k logs --previous (log lần chết trước), k get ep (Service có thấy Pod không). Quy trình bảy bước đầy đủ nằm ở Phần 13.
Tài nguyên học tiếp
Tài liệu chính thức (luôn ưu tiên)
- kubernetes.io/docs — tài liệu gốc; hai mục Concepts và Tasks rất tốt, đọc đúng trang bạn cần thay vì đọc từ đầu.
- kubectl Quick Reference — cheat sheet chính thức, đầy đủ hơn bảng trên.
- docs.docker.com — tham chiếu Dockerfile và best practices.
- ingress-nginx — toàn bộ annotation; mỗi khi cần rewrite, CORS, canary, timeout, tra ở đây.
- cert-manager, Helm, Kustomize, Argo CD.
Công cụ nên cài để làm việc dễ hơn
| Công cụ | Công dụng |
|---|---|
| k9s | Giao diện terminal để duyệt cluster: xem Pod, log, exec, xoá bằng phím tắt. Tăng tốc rõ rệt |
| kubectx / kubens | Chuyển context và namespace nhanh, tránh gõ nhầm vào production |
| stern | Xem log nhiều Pod cùng lúc, có màu phân biệt, lọc regex |
| kube-ps1 | Hiển thị cluster/namespace hiện tại ngay trên dòng nhắc terminal |
| dive | Phân tích từng layer của image, tìm chỗ lãng phí dung lượng |
| trivy | Quét lỗ hổng bảo mật trong image |
| kubeconform (kubeval) | Kiểm tra manifest hợp lệ theo schema trước khi apply, chạy được trong CI không cần cluster |
| Lens (hoặc Headlamp) | IDE đồ hoạ cho Kubernetes, hợp với người thích giao diện |
Trên macOS, một dòng: brew install k9s kubectx stern kube-ps1 dive trivy kubeconform. kubectx cài kèm kubens.
Chứng chỉ (nếu muốn đi sâu)
- KCNA (Kubernetes and Cloud Native Associate): mức nhập môn, trắc nghiệm, phù hợp FE dev muốn có xác nhận cho cấp độ 1–2.
- CKAD (Certified Kubernetes Application Developer): chứng chỉ phù hợp nhất với developer. Thi thực hành trên terminal, tập trung vào triển khai ứng dụng (Deployment, Service, ConfigMap, probe, resources) chứ không phải quản trị cluster. Toàn bộ series này là nền cho nó.
- CKA (Certified Kubernetes Administrator): dành cho người làm hạ tầng; không cần cho FE dev.
Hướng đi tiếp sau series này
- Service Mesh (Istio, Linkerd): traffic management, mTLS giữa Pod, tracing tự động không cần sửa code.
- Gateway API: thế hệ tiếp theo thay thế Ingress, tách vai trò cluster admin và app dev, đã có trong ingress-nginx và các controller lớn.
- OpenTelemetry: chuẩn hoá tracing từ trình duyệt xuyên suốt tới backend; trace ID sinh ở client, thấy ở Grafana Tempo.
- Progressive delivery với Argo Rollouts hoặc Flagger: canary tự động theo metric, tiếp nối Phần 14.
- Platform engineering: Backstage, internal developer portal; khi công ty có hơn mười team, “self-service” thay cho “ticket cho DevOps”.
Trên blog này, Docker Part 14 đến Part 18 đi sâu hơn vào networking, scheduling, storage, security và incident response; đó là chặng tiếp theo tự nhiên khi bạn đã xong đồ án.
Lời kết
Kubernetes trông đồ sộ vì nó được thiết kế để giải quyết bài toán của Google. Nhưng phần mà một frontend developer thực sự cần chỉ gói gọn trong khoảng mười loại tài nguyên và hai mươi lệnh kubectl. Bạn đã đi qua toàn bộ chúng trong series này.
Điều quan trọng nhất không phải là nhớ cú pháp YAML; cái đó luôn tra được, và k explain ở ngay trong terminal. Điều quan trọng là mô hình tư duy: khai báo trạng thái mong muốn, để hệ thống tự hội tụ về đó; mọi thứ kết nối qua label; mọi Pod đều phù du và phải sẵn sàng chết bất cứ lúc nào. Ba câu đó giải thích 90% hành vi bạn thấy trong cluster, từ vì sao xoá Pod thì có Pod mới, tới vì sao đổi ConfigMap mà app không thấy, tới vì sao deploy rớt request khi thiếu preStop.
Hãy bắt đầu từ việc deploy chính app của bạn lên một cluster kind ngay hôm nay. Kiến thức thật chỉ hình thành khi bạn gặp lỗi, đọc Events, và tự sửa được nó.
Tóm tắt
- Sáu tuần, khoảng 58 giờ; mỗi tuần kết thúc bằng một sản phẩm cụ thể, không phải bằng số trang đã đọc. Chỉ có hai tuần thì Phần 2–4, 5–8 và 10–13.
- Ba cấp độ: hiểu biết (nói chuyện được), vận hành (làm việc hằng ngày), thành thạo (tự chủ hạ tầng frontend); tick một dòng chỉ khi làm được không nhìn tài liệu.
- Đồ án: SPA + Next.js SSR + backend sau một Ingress, ba namespace, Helm/Kustomize, CI/CD, HTTPS; đạt khi vòng lặp curl chỉ in
200suốt lúc deploy. - Cheat sheet:
describe(Events),logs --previous,get eplà ba lệnh cứu bạn nhiều nhất;config current-contexttrước mọi lệnh nguy hiểm. - Cài k9s, kubectx, stern; CKAD là chứng chỉ hợp với developer; bước tiếp theo là Gateway API, OpenTelemetry và progressive delivery.