24 ngày học EKS
TUẦN 1: Nền tảng Kubernetes & EKS
Ngày 1: Kubernetes là gì?
Sáng: Khái niệm, lợi ích, Pod/Service/Deployment/ReplicaSet.
Chiều: Kiến trúc (Control plane, Worker node, etcd, kube-apiserver).
Bài tập: Cài Minikube, deploy "Hello World", scale thử, khám phá dashboard.
Ngày 2: Amazon EKS Tổng quan
Sáng: EKS khác gì Kubernetes tự quản lý; control plane managed, node group, networking.
Chiều: Ngoài eksctl, giới thiệu Terraform module terraform-aws-modules/eks/aws - vì production không tạo cluster bằng CLI thủ công.
Bài tập: Tạo cluster bằng eksctl (để hiểu cơ chế) và viết lại bằng Terraform (để hiểu cách làm thật); kết nối kubectl, deploy app đơn giản.
Production Notes: eksctl phù hợp học/demo, nhưng cluster production cần Terraform/CDK để version control, code review, và tái tạo được (disaster recovery ở mức hạ tầng).
Ngày 3: Cấu hình Cluster & Helm
Sáng: Managed vs self-managed node group; EBS/EFS/FSx, PV/PVC.
Chiều: Helm - package manager cho Kubernetes: Chart, Release, Values, templating. Vì sao production không viết YAML tay cho từng service mà dùng Helm chart để chuẩn hóa & tái sử dụng.
Bài tập: Tạo managed node group; deploy app cần storage bền vững; viết 1 Helm chart cơ bản cho app "Hello World" thay vì manifest YAML thuần.
TUẦN 2: Mạng, IAM cho Pod & Autoscaling
Ngày 4: Mạng EKS-
Sáng: VPC CNI, IP-per-pod, ALB/NLB.
Chiều: Prefix Delegation (tăng mật độ IP/node để giảm IP exhaustion), Custom Networking (tách IP pod khỏi CIDR node), Security Groups for Pods (gán SG riêng theo pod thay vì theo node).
Bài tập: Bật Prefix Delegation trên node group; cấu hình Security Group riêng cho 1 pod nhạy cảm (ví dụ pod truy cập RDS).
Production Notes: IP exhaustion là lỗi phổ biến nhất khi cluster scale - không phải do thiếu compute mà do subnet hết IP vì mỗi pod cần 1 IP VPC (trừ khi dùng custom networking).
Ngày 5: IAM cho Pod - IRSA & EKS Pod Identity
Sáng
Vấn đề của "IAM role gắn vào node": mọi pod trên node đó đều có chung quyền → vi phạm least-privilege nghiêm trọng.
IRSA (IAM Roles for Service Accounts): OIDC provider, ServiceAccount annotation, trust policy - cấp quyền IAM riêng cho từng pod.
EKS Pod Identity: cơ chế thay thế IRSA từ 2023+, đơn giản hóa (không cần OIDC per-cluster, không cần trust policy phức tạp) - khuyến nghị dùng cho cluster mới.
Chiều
- Bài tập: Cấu hình IRSA cho 1 pod truy cập S3 với quyền tối thiểu; làm lại bằng EKS Pod Identity và so sánh độ phức tạp.
Production Notes: Đây là lỗ hổng bảo mật phổ biến nhất trong EKS thực tế - dùng chung node IAM role cho mọi workload. Mọi pod truy cập AWS resource phải qua IRSA/Pod Identity, không ngoại lệ.
Ngày 6: Autoscaling - Karpenter
Sáng
Giới hạn của Cluster Autoscaler truyền thống (phụ thuộc Auto Scaling Group, chậm, không tối ưu instance type).
Karpenter: provisioning node theo pod pending trực tiếp, chọn instance type/AZ tối ưu tự động, consolidation (gộp node để tiết kiệm chi phí), hỗ trợ Spot tự động thay thế khi bị reclaim.
NodePool và EC2NodeClass (cấu hình Karpenter thế hệ mới).
Chiều
- Bài tập: Cài Karpenter, viết NodePool cho phép chọn cả On-Demand và Spot; tạo tải để quan sát Karpenter tự provision node; bật consolidation và quan sát node bị gộp khi tải giảm.
Production Notes: Karpenter hiện là khuyến nghị chính thức của AWS thay Cluster Autoscaler cho cluster mới - tiết kiệm chi phí đáng kể nhờ chọn đúng instance type theo nhu cầu thực tế thay vì cố định theo node group.
Ngày 7: EKS Auto Mode & Lựa chọn mô hình vận hành
Sáng: EKS Auto Mode - AWS tự quản lý luôn cả node, networking, storage add-on (giảm gánh vận hành, đánh đổi bằng ít tùy biến hơn). So sánh ma trận: Managed Node Group vs Self-managed vs Fargate vs Karpenter vs Auto Mode - khi nào dùng gì.
Chiều: Bài tập: Tạo thử 1 cluster ở chế độ Auto Mode, so sánh trải nghiệm vận hành với cluster Karpenter đã làm ở Ngày 6.
TUẦN 3: Bảo mật, Policy Enforcement & Add-ons
Ngày 8: Bảo mật EKS nền tảng
Sáng: IAM roles/policies (ôn lại trong bối cảnh IRSA), Network Policy.
Chiều: Add-on EKS: CoreDNS, kube-proxy, VPC CNI, metrics-server - quản lý qua EKS Add-ons API thay vì cài tay.
Bài tập: Áp dụng Network Policy giới hạn traffic giữa namespace; cập nhật add-on qua eksctl/Terraform thay vì Helm thủ công.
Ngày 9: Pod Security Standards & Policy Engine
Sáng
Pod Security Policy (PSP) đã bị loại bỏ khỏi Kubernetes - thay bằng Pod Security Standards (PSA): namespace label
enforce/audit/warntheo mức Privileged/Baseline/Restricted.Policy Engine: OPA/Gatekeeper hoặc Kyverno (đang phổ biến hơn vì viết bằng YAML thay Rego) để enforce quy tắc tùy chỉnh (ví dụ: bắt buộc resource limit, cấm image từ registry không tin cậy).
Chiều
- Bài tập: Gắn PSA "restricted" cho namespace production; viết Kyverno policy chặn deploy pod không có
resources.limitshoặc dùng image:latest.
Production Notes: Không có policy engine, không gì ngăn được developer deploy pod chạy privileged hoặc pull image từ Docker Hub public không kiểm soát - đây là yêu cầu bắt buộc cho compliance (SOC2/PCI).
Ngày 10: Quản lý Secrets
Sáng: Kubernetes Secret mặc định chỉ base64 (không mã hóa thật) - rủi ro nếu etcd bị lộ. Giải pháp: bật envelope encryption với KMS cho EKS secrets.
Chiều: External Secrets Operator - đồng bộ secret từ AWS Secrets Manager/Parameter Store vào Kubernetes tự động, tránh secret nằm trong Git.
Bài tập: Bật KMS envelope encryption cho cluster; cài External Secrets Operator, đồng bộ 1 secret từ Secrets Manager vào pod.
Ngày 11: Observability & Fargate
Sáng: CloudWatch Logs/Metrics + giới hạn của CloudWatch Container Insights ở scale lớn - giới thiệu Prometheus + Grafana (qua Amazon Managed Prometheus/Grafana) làm chuẩn observability thực sự cho production, và OpenTelemetry cho distributed tracing.
Chiều: EKS Fargate - trường hợp sử dụng, giới hạn (không hỗ trợ DaemonSet, privileged pod).
Bài tập: Triển khai Amazon Managed Prometheus + Grafana, tạo dashboard theo dõi latency/error rate; deploy 1 app lên Fargate profile.
TUẦN 4: GitOps, Ingress & Service Mesh
Ngày 12: GitOps với ArgoCD
Sáng
Vì sao
kubectl applythủ công không phù hợp production: không audit trail, dễ config drift.GitOps: Git là nguồn chân lý duy nhất; ArgoCD tự động đồng bộ cluster theo state trong Git, phát hiện và cảnh báo drift.
App of Apps pattern để quản lý nhiều microservices qua 1 ArgoCD instance.
Chiều
- Bài tập: Cài ArgoCD, kết nối 1 Git repo chứa Helm chart app đã làm Ngày 3; thử sửa trực tiếp trên cluster bằng
kubectlvà quan sát ArgoCD tự động revert (self-healing).
Production Notes: GitOps là chuẩn bắt buộc cho mọi tổ chức vận hành nhiều cluster/nhiều môi trường - không có nó, không thể trả lời câu hỏi "cluster đang chạy config gì" một cách đáng tin cậy.
Ngày 13: Ingress & AWS Load Balancer Controller
Sáng: So với Ingress cũ, AWS Load Balancer Controller (ALB/NLB provisioning tự động qua annotation); giới thiệu Gateway API - chuẩn thế hệ mới thay thế Ingress, tách biệt vai trò platform team (Gateway) và app team (HTTPRoute).
Chiều: Bài tập: Cài AWS Load Balancer Controller, expose app qua ALB Ingress; làm lại bằng Gateway API (HTTPRoute) để so sánh.
Ngày 14: Service Mesh - Istio/App Mesh
Sáng
Bài toán: mTLS giữa service, traffic splitting (canary), retry/circuit breaker tự động - Kubernetes Service không giải quyết được các nhu cầu này.
Kiến trúc Service Mesh (sidecar proxy - Envoy), so sánh Istio vs AWS App Mesh (đã deprecated, khuyến nghị Istio hoặc Cilium Service Mesh) vs không dùng mesh (dùng VPC Lattice ở tầng VPC nếu đủ).
Chiều
- Bài tập: Cài Istio, bật sidecar injection cho 1 namespace, cấu hình mTLS strict, thực hiện canary deployment 90/10 giữa 2 version của cùng 1 service.
Production Notes: Không phải mọi cluster cần Service Mesh - chỉ cân nhắc khi có nhiều microservice cần mTLS/traffic shaping tinh vi; nếu chỉ cần kết nối cross-VPC đơn giản, VPC Lattice (tầng hạ tầng) nhẹ hơn nhiều so với việc vận hành Istio.
Ngày 15: Multi-tenancy & Namespace Isolation
Sáng: Chiến lược multi-tenant: namespace-per-team, ResourceQuota, LimitRange, RBAC theo namespace.
Chiều: Bài tập: Thiết lập RBAC cho 2 team chỉ được thao tác trong namespace riêng; áp ResourceQuota giới hạn CPU/memory theo namespace.
TUẦN 5: Vận hành, Chi phí & Khắc phục Sự cố
Ngày 16: Nâng cấp Cluster An toàn
Sáng: Nâng cấp phiên bản Kubernetes, rolling update; chiến lược Blue/Green Cluster Upgrade cho hệ thống critical (dựng cluster mới, di chuyển traffic dần thay vì upgrade tại chỗ).
Chiều: Bài tập: Thực hiện rolling update ứng dụng; mô phỏng kịch bản blue/green cluster migration ở quy mô nhỏ.
Ngày 17: Tối ưu chi phí EKS
Sáng: Spot instance, Cost Explorer, cost allocation tag (như bản gốc) + Karpenter consolidation, Vertical Pod Autoscaler (VPA) để right-size request/limit dựa trên usage thật (tránh over-provisioning phổ biến).
Chiều: Bài tập: Bật VPA ở chế độ recommendation, so sánh request hiện tại với đề xuất; tính toán tiết kiệm chi phí khi áp dụng Karpenter consolidation + Spot.
Ngày 18: Backup & Disaster Recovery
Sáng: Etcd/control plane do AWS quản lý (không cần backup thủ công), nhưng application state và cluster resources thì có - Velero để backup namespace/PV, restore sang cluster khác hoặc region khác.
Chiều: Bài tập: Cài Velero với S3 backend, backup 1 namespace có PVC, xóa namespace, restore lại từ backup và kiểm tra dữ liệu.
Production Notes: "EKS managed control plane" không đồng nghĩa "không cần backup" - dữ liệu ứng dụng, cấu hình RBAC, Secret, ConfigMap vẫn có thể mất nếu không có chiến lược backup riêng.
Ngày 19: Khắc phục sự cố
Sáng: Kỹ thuật debug (kubectl describe/logs/events, kubectl debug), các lỗi thường gặp: CrashLoopBackOff, ImagePullBackOff, OOMKilled, pod Pending do thiếu IP/resource.
Chiều: Bài tập: Debug 3 kịch bản lỗi cấy sẵn (thiếu IRSA permission gây API call fail; ResourceQuota chặn deploy; Karpenter không provision do NodePool constraint sai).
TUẦN 6: Dự án
Ngày 20: Thiết kế & Chuẩn bị
Sáng: Chọn ứng dụng microservices (ví dụ: cửa hàng trực tuyến - user/product/cart service); chia nhỏ service, chọn công nghệ.
Chiều: Thiết kế kiến trúc tổng thể; tạo IAM/IRSA plan cho từng service; khởi tạo Git repo theo mô hình GitOps (source repo + config repo riêng).
Ngày 21: Xây dựng, Đóng gói & Helm Chart
Sáng: Viết từng microservice, API endpoint, unit/integration test.
Chiều: Đóng gói Docker image, đẩy lên ECR; viết Helm chart chuẩn hóa cho từng service (không viết YAML rời rạc).
Ngày 22: Triển khai
Sáng: Cấu hình cluster: Karpenter NodePool, PSA restricted, Kyverno policy, External Secrets.
Chiều: Triển khai qua ArgoCD (không kubectl apply tay); cấu hình IRSA/Pod Identity riêng cho từng service; expose qua AWS Load Balancer Controller/Gateway API.
Ngày 23: Observability, Resilience & Kiểm thử
Sáng: Tích hợp Prometheus/Grafana dashboard, OpenTelemetry tracing; cấu hình HPA + Karpenter cho autoscale 2 tầng (pod + node).
Chiều: Load test (k6/Locust); tuỳ chọn: cấu hình canary deployment qua Istio nếu dự án có ≥3 service gọi lẫn nhau.
Ngày 24: Hoàn thiện, Backup & Đánh giá
Sáng: Cấu hình Velero backup; viết runbook vận hành (upgrade, rollback, incident response).
Chiều: Trình bày dự án; đánh giá theo rubric: bảo mật (IRSA/PSA/Kyverno), khả năng mở rộng (Karpenter/HPA), chi phí (Spot/consolidation), khả năng phục hồi (Velero/multi-AZ), mức độ GitOps hóa.
Sản phẩm: Toàn bộ cluster config + Helm chart + ArgoCD Application trong Git repo (có CI pipeline build/push image); tài liệu kiến trúc; dashboard Grafana; báo cáo chi phí.