Skip to main content

Command Palette

Search for a command to run...

24 ngày học EKS

Updated
11 min readView as Markdown

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ế) 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/warn theo 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.limits hoặ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 apply thủ 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 kubectl và 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í.

Knowledge

Part 1 of 50