Học để thi CKAD trong 25 ngày
Tuần 1: Nền tảng Container và Kubernetes
Ngày 1:
Ôn lại kiến thức Docker: image, container, Dockerfile, registry
Tạo và quản lý container image cơ bản, sử dụng Docker CLI
Tìm hiểu về Kubernetes: các thành phần chính, kiến trúc, lợi ích
Bài tập:
Tạo một Dockerfile đơn giản từ một ứng dụng Node.js
Build và chạy container từ Dockerfile vừa tạo
Push image lên Docker Hub
Cài đặt Minikube hoặc Kind để tạo Kubernetes cluster
Khám phá Kubernetes dashboard và các tài nguyên cơ bản
Ngày 2:
Tìm hiểu về Pod, Deployment, Service, Namespace trong Kubernetes
Thực hành tạo Pod, Deployment và Service đơn giản
Làm quen với kubectl, câu lệnh cơ bản và quản lý tài nguyên
Bài tập:
Tạo một Pod chạy ứng dụng Nginx
Tạo một Deployment để quản lý Pod Nginx
Tạo một Service để expose Pod Nginx
Sử dụng kubectl get, describe, logs để kiểm tra Pod, Deployment, Service
Tạo một Namespace mới và triển khai ứng dụng vào Namespace đó
Ngày 3:
Tìm hiểu về Persistent Volume (PV), Persistent Volume Claim (PVC)
Thực hành sử dụng PV và PVC để lưu trữ dữ liệu
Tìm hiểu ConfigMap và Secret, thực hành tạo và sử dụng
Bài tập:
Tạo một PV sử dụng hostPath
Tạo một PVC để yêu cầu dung lượng lưu trữ
Tạo một Pod sử dụng PVC để mount volume
Tạo một ConfigMap chứa các biến môi trường
Tạo một Secret chứa thông tin nhạy cảm
Ngày 4:
Tìm hiểu về ServiceAccount và RBAC (Role-Based Access Control)
Thực hành phân quyền trong Kubernetes
Tìm hiểu LivenessProbe và ReadinessProbe, thực hành kiểm tra tình trạng Pod
Bài tập:
Tạo một ServiceAccount mới
Tạo một Role và RoleBinding để phân quyền cho ServiceAccount
Tạo một Pod sử dụng ServiceAccount vừa tạo
Thêm LivenessProbe và ReadinessProbe vào Pod Nginx
Kiểm tra hoạt động của LivenessProbe và ReadinessProbe
Ngày 5:
Tìm hiểu về Ingress và Ingress Controller (Nginx, Traefik)
Thực hành cấu hình Ingress để expose ứng dụng
Ôn tập kiến thức tuần 1, làm các bài tập và lab thực hành
Bài tập:
Cài đặt Nginx Ingress Controller
Tạo một Ingress để expose ứng dụng Nginx
Kiểm tra hoạt động của Ingress bằng cách truy cập ứng dụng qua tên miền
Tạo một Ingress với nhiều rule để expose nhiều ứng dụng
Tìm hiểu về các annotation của Ingress và cách sử dụng
Tuần 2: Kubernetes Nâng cao và Mở rộng
Ngày 6:
Tìm hiểu về Custom Resource Definition (CRD) và Operators
Thực hành tạo CRD đơn giản và sử dụng Operator có sẵn
Tìm hiểu về Helm: package manager của Kubernetes
Bài tập:
Tạo một CRD đơn giản để quản lý ứng dụng web
Tìm và cài đặt một Operator có sẵn để quản lý CRD vừa tạo
Tìm hiểu về Helm chart và các thành phần của chart
Cài đặt một ứng dụng sử dụng Helm chart có sẵn
Tạo một Helm chart đơn giản để đóng gói ứng dụng của bạn
Ngày 7:
Thực hành sử dụng Helm để cài đặt và quản lý ứng dụng
Tìm hiểu về NetworkPolicy và cách kiểm soát traffic trong Kubernetes
Thực hành tạo NetworkPolicy để giới hạn truy cập
Bài tập:
Sử dụng Helm để nâng cấp và rollback ứng dụng
Tạo một NetworkPolicy chỉ cho phép traffic từ một namespace cụ thể
Tạo một NetworkPolicy chỉ cho phép traffic đến một port cụ thể
Tạo một NetworkPolicy sử dụng label để chọn Pod
Tìm hiểu về các loại NetworkPolicy khác nhau và cách sử dụng
Ngày 8:
Tìm hiểu các design pattern trong Kubernetes: sidecar, init container, ambassador
Thực hành sử dụng các pattern này để giải quyết các vấn đề cụ thể
Tìm hiểu về Horizontal Pod Autoscaler (HPA)
Bài tập:
Tạo một Pod sử dụng sidecar container để logging
Tạo một Pod sử dụng init container để khởi tạo database
Sử dụng ambassador pattern để định tuyến traffic đến các service khác nhau
Cấu hình HPA để scale Pod Nginx dựa trên CPU usage
Tìm hiểu về các metric khác nhau có thể sử dụng để scale Pod
Ngày 9:
Thực hành sử dụng HPA để scale ứng dụng tự động
Tìm hiểu về các chiến lược deployment: rolling update, blue/green, canary
Thực hành các chiến lược deployment này
Bài tập:
Thực hiện rolling update cho Deployment Nginx
Thực hiện blue/green deployment cho ứng dụng mới
Thực hiện canary deployment cho ứng dụng mới
Tìm hiểu về các công cụ hỗ trợ deployment như Spinnaker, ArgoCD
Tìm hiểu về các khái niệm liên quan đến deployment như rollout, rollback, history
Ngày 10:
Ôn tập kiến thức tuần 2, làm các bài tập và lab thực hành
Đọc thêm tài liệu về Kubernetes architecture và networking
Bài tập:
Tạo một sơ đồ kiến trúc Kubernetes cluster của bạn
Giải thích cách hoạt động của Kubernetes networking
Tìm hiểu về các khái niệm như CNI, kube-proxy, service mesh
Đọc tài liệu về Kubernetes architecture trên website của Kubernetes
Tham gia các diễn đàn và cộng đồng Kubernetes để trao đổi kiến thức
Tuần 3: Kubernetes Chuyên sâu và Luyện tập
Ngày 11: Kubernetes API
Lý thuyết:
Tìm hiểu về Kubernetes API: các nhóm tài nguyên, versioning, RESTful API
Cách tương tác với Kubernetes API bằng
curl
và các thư viện client (Python, Go,...)Các khái niệm quan trọng: API group, resource, verb, request/response format
Bài tập:
Sử dụng
curl
để lấy danh sách Pod trong clusterSử dụng
curl
để tạo một Pod mớiSử dụng
curl
để cập nhật một DeploymentSử dụng thư viện client Python để lấy danh sách Node
Sử dụng thư viện client Go để tạo một Service
Ngày 12: Kubernetes Scheduler
Lý thuyết:
Tìm hiểu về Kubernetes scheduler: vai trò, cách hoạt động, các thành phần
Các thuật toán scheduling:
LeastRequestedPriority
,BalancedResourceAllocation
,PriorityClass
Các yếu tố ảnh hưởng đến scheduling: resource request/limit, nodeSelector, affinity/anti-affinity
Bài tập:
Tìm hiểu về các thuật toán scheduling khác nhau và cách cấu hình
Tạo một Pod với resource request/limit và quan sát quá trình scheduling
Sử dụng
nodeSelector
để chỉ định Pod chạy trên một node cụ thểSử dụng
affinity
để đảm bảo các Pod chạy cùng nhau trên một nodeSử dụng
anti-affinity
để đảm bảo các Pod không chạy cùng nhau trên một node
Ngày 13: Kubernetes Controller Manager
Lý thuyết:
Tìm hiểu về Kubernetes controller manager: vai trò, cách hoạt động, các loại controller
Các controller quan trọng:
ReplicaSetController
,DeploymentController
,StatefulSetController
,JobController
,CronJobController
Cách hoạt động của một controller: reconciliation loop, watch API, update object
Bài tập:
Tìm hiểu về các loại controller khác nhau và vai trò của chúng
Tạo một Deployment và quan sát quá trình hoạt động của
DeploymentController
Tạo một StatefulSet và quan sát quá trình hoạt động của
StatefulSetController
Tạo một Job và quan sát quá trình hoạt động của
JobController
Tạo một CronJob và quan sát quá trình hoạt động của
CronJobController
Ngày 14: Kubernetes Architecture (Tổng quan)
Lý thuyết:
Ôn tập lại kiến trúc tổng quan của Kubernetes: các thành phần chính, cách chúng tương tác với nhau
Tìm hiểu sâu hơn về các thành phần như
etcd
,kube-apiserver
,kube-controller-manager
,kube-scheduler
,kubelet
,kube-proxy
Tìm hiểu về các khái niệm như
control plane
,data plane
,API server
,watch
,informer
Bài tập:
Vẽ sơ đồ kiến trúc Kubernetes và giải thích vai trò của từng thành phần
Tìm hiểu về các cách triển khai Kubernetes khác nhau (kubeadm, kops, Rancher,...)
Đọc tài liệu về Kubernetes architecture trên website của Kubernetes
Tìm hiểu về các công cụ quản lý Kubernetes như Rancher, Kops
Tham gia các dự án mã nguồn mở liên quan đến Kubernetes
Ngày 15: Kubernetes Networking
Lý thuyết:
Tìm hiểu về Kubernetes networking: các khái niệm cơ bản, cách hoạt động
Các thành phần networking quan trọng:
CNI
,kube-proxy
,service
,endpoint
,ingress
Các loại network plugin:
Flannel
,Calico
,Weave Net
,Cilium
Bài tập:
Tìm hiểu về các loại network plugin khác nhau và cách cấu hình
Tạo một Pod và kiểm tra cách nó được gán IP
Tạo một Service và kiểm tra cách nó hoạt động
Tạo một Ingress và kiểm tra cách nó định tuyến traffic
Tìm hiểu về các khái niệm nâng cao như
service mesh
,network policy
Ngày 16: Cài đặt và quản lý Kubernetes cluster
Mục tiêu: Làm quen với các công cụ và quy trình cài đặt, quản lý Kubernetes cluster trên các môi trường khác nhau.
Bài tập:
Cài đặt Kubernetes trên máy local: Sử dụng Minikube hoặc kind để tạo một cluster Kubernetes đơn giản trên máy tính cá nhân.
Cài đặt Kubernetes trên cloud: Sử dụng các dịch vụ Kubernetes được quản lý như Amazon EKS, Google Kubernetes Engine (GKE), hoặc Azure Kubernetes Service (AKS) để tạo một cluster trên cloud.
Quản lý cluster bằng kubectl: Thực hiện các thao tác quản lý cluster cơ bản như xem thông tin node, pod, service, kiểm tra log, thực hiện các câu lệnh nâng cao.
Cài đặt và sử dụng dashboard: Cài đặt Kubernetes dashboard để quản lý cluster bằng giao diện đồ họa.
Tìm hiểu về các công cụ quản lý cluster khác: Nghiên cứu về Rancher, kops hoặc các công cụ khác để quản lý cluster một cách hiệu quả.
Ngày 17: Triển khai ứng dụng phức tạp
Mục tiêu: Thực hành triển khai các ứng dụng đa tầng, sử dụng nhiều loại tài nguyên Kubernetes.
Bài tập:
Triển khai ứng dụng web đơn giản: Triển khai một ứng dụng web cơ bản (ví dụ: ứng dụng Node.js hoặc Python) sử dụng Deployment, Service, Ingress.
Triển khai ứng dụng microservice: Triển khai một ứng dụng microservice gồm nhiều thành phần (ví dụ: frontend, backend, database), sử dụng các tài nguyên Kubernetes như Deployment, StatefulSet, ConfigMap, Secret.
Sử dụng Helm: Sử dụng Helm để đóng gói và triển khai ứng dụng một cách dễ dàng và có thể tái sử dụng.
Triển khai ứng dụng trên nhiều môi trường: Thực hành triển khai ứng dụng trên các môi trường khác nhau (local, cloud) để đảm bảo tính nhất quán.
Tối ưu hóa ứng dụng: Sử dụng các kỹ thuật như resource request/limit, HPA, nodeSelector để tối ưu hóa hiệu suất và tài nguyên của ứng dụng.
Ngày 18: Xử lý lỗi và sự cố
Mục tiêu: Nắm vững các kỹ thuật xử lý lỗi và sự cố thường gặp trong Kubernetes.
Bài tập:
Debug Pod: Sử dụng các công cụ như
kubectl logs
,kubectl describe
,kubectl exec
để kiểm tra và gỡ lỗi các vấn đề của Pod (ví dụ: Pod không khởi động được, Pod bị crash).Debug Service: Kiểm tra và gỡ lỗi các vấn đề liên quan đến Service (ví dụ: không thể truy cập ứng dụng qua Service, Service không load balancing).
Debug Ingress: Kiểm tra và gỡ lỗi các vấn đề liên quan đến Ingress (ví dụ: không thể truy cập ứng dụng qua Ingress, Ingress không định tuyến đúng).
Xử lý node bị down: Thực hành các bước xử lý khi một node trong cluster bị down, đảm bảo ứng dụng vẫn hoạt động bình thường.
Khôi phục dữ liệu: Thực hành các bước khôi phục dữ liệu từ Persistent Volume khi xảy ra sự cố.
Ngày 19: Giám sát và logging
Mục tiêu: Tìm hiểu và sử dụng các công cụ giám sát và logging để theo dõi và quản lý Kubernetes cluster.
Bài tập:
Cài đặt và sử dụng Prometheus: Cài đặt Prometheus và Grafana để thu thập và hiển thị các chỉ số giám sát của cluster và ứng dụng.
Cài đặt và sử dụng Elasticsearch, Fluentd, Kibana (EFK): Cài đặt EFK stack để thu thập, lưu trữ và phân tích log của cluster và ứng dụng.
Tạo dashboard giám sát: Sử dụng Grafana để tạo các dashboard tùy chỉnh để hiển thị các chỉ số quan trọng của cluster và ứng dụng.
Phân tích log: Sử dụng Kibana để tìm kiếm và phân tích log để phát hiện và gỡ lỗi các vấn đề.
Cảnh báo: Cấu hình cảnh báo để nhận thông báo khi có sự cố hoặc các chỉ số vượt ngưỡng.
Ngày 20: Bảo mật Kubernetes
Mục tiêu: Tìm hiểu và áp dụng các biện pháp bảo mật cho Kubernetes cluster.
Bài tập:
Cấu hình RBAC: Thực hành phân quyền bằng RBAC để kiểm soát truy cập vào các tài nguyên Kubernetes.
Sử dụng NetworkPolicy: Tạo NetworkPolicy để kiểm soát lưu lượng mạng giữa các Pod và namespace.
Bảo mật image: Sử dụng các công cụ quét image để phát hiện và loại bỏ các lỗ hổng bảo mật trong image.
Cấu hình Pod Security Policy: Tìm hiểu và cấu hình Pod Security Policy để kiểm soát các hành vi của Pod (ví dụ: chạy với quyền root, sử dụng host network).
Cập nhật Kubernetes: Thường xuyên cập nhật Kubernetes lên phiên bản mới nhất để vá các lỗ hổng bảo mật.
Ngày 21: Container và Pod
Tạo một container image từ Dockerfile và push lên Docker Hub.
Sửa đổi một container image có sẵn và push phiên bản mới lên registry.
Tạo một Pod với hai container sử dụng mẫu init container.
Tạo một Pod với hai container sử dụng mẫu sidecar.
Tạo một Pod với hai container sử dụng mẫu adapter.
Tạo một Pod với hai container sử dụng mẫu ambassador.
Tạo một Job để chạy một tác vụ một lần.
Tạo một CronJob để chạy một tác vụ theo lịch.
Sử dụng Volume để chia sẻ dữ liệu giữa các container trong một Pod.
Sử dụng EmptyDir Volume để lưu trữ dữ liệu tạm thời.
Sử dụng HostPath Volume để truy cập tệp trên node.
Sử dụng PersistentVolume và PersistentVolumeClaim để lưu trữ dữ liệu liên tục.
Khám phá và sử dụng một Custom Resource Definition (CRD).
Tạo và sử dụng một Pod với ServiceAccount.
Đặt Resource Requests và Limits cho một container.
Ngày 22: Deployment và Configuration
Tạo một Deployment và thực hiện cập nhật rolling update.
Thực hiện rollback một Deployment.
Mở rộng (scale) một Deployment.
Sử dụng Blue/Green Deployment để triển khai phiên bản mới.
Sử dụng Canary Deployment để triển khai phiên bản mới.
Tạo và sử dụng một ConfigMap để lưu trữ cấu hình.
Tạo và sử dụng một Secret để lưu trữ thông tin nhạy cảm.
Cấu hình Liveness Probe cho một container.
Cấu hình Readiness Probe cho một container.
Cấu hình Startup Probe cho một container.
Sử dụng Helm để triển khai một ứng dụng có sẵn.
Tạo một Helm Chart để đóng gói ứng dụng của bạn.
Sử dụng Helm để quản lý môi trường (dev, staging, prod).
Cấu hình Resource Quotas cho một namespace.
Cấu hình và sử dụng HorizontalPodAutoscaler (HPA).
Ngày 23: Network và Security
Expose một ứng dụng sử dụng ClusterIP Service.
Expose một ứng dụng sử dụng NodePort Service.
Expose một ứng dụng sử dụng LoadBalancer Service.
Cấu hình Ingress để expose nhiều ứng dụng.
Cấu hình TLS cho Ingress.
Triển khai một ứng dụng với nhiều replica và cân bằng tải sử dụng Service.
Cấu hình NetworkPolicy để hạn chế truy cập giữa các Pod.
Cấu hình NetworkPolicy dựa trên label selector.
Cấu hình NetworkPolicy để cho phép truy cập từ một namespace khác.
Cấu hình và sử dụng PodSecurityPolicy.
Cấu hình và sử dụng SecurityContext cho Pod và Container.
Sử dụng RBAC để phân quyền truy cập tài nguyên.
Tạo một Role và RoleBinding.
Tạo một ClusterRole và ClusterRoleBinding.
Sử dụng ServiceAccount trong Pod để truy cập Kubernetes API.
Ngày 24: Monitoring và Logging
Sử dụng kubectl để xem log của một Pod.
Sử dụng kubectl để xem log của một container cụ thể trong Pod.
Triển khai EFK stack (Elasticsearch, Fluentd, Kibana) để thu thập và phân tích log.
Cấu hình Fluentd để thu thập log từ các container.
Sử dụng Kibana để tìm kiếm và phân tích log.
Cài đặt và cấu hình Prometheus để giám sát các chỉ số của cluster và ứng dụng.
Cấu hình Prometheus để thu thập metrics từ các Pod.
Sử dụng Grafana để trực quan hóa các metrics thu thập bởi Prometheus.
Tạo dashboard Grafana để hiển thị các chỉ số quan trọng.
Cấu hình cảnh báo Prometheus dựa trên các quy tắc.
Sử dụng kubectl để kiểm tra trạng thái và thông tin của các tài nguyên (Pod, Deployment, Service, ...).
Sử dụng kubectl để debug khi có sự cố (kiểm tra log, mô tả tài nguyên, thực thi lệnh trong container).
Sử dụng kubectl để truy cập vào một Pod để debug.
Giám sát việc sử dụng tài nguyên (CPU, memory) của các Pod và Node.
Phân tích và giải quyết các vấn đề phổ biến (Pod pending, Pod crashloopbackoff, Node NotReady, ...).
Ngày 25: Best Practices và Ôn tập
Áp dụng các best practices khi viết Dockerfile (giảm kích thước image, nguyên tắc least privilege, ...).
Áp dụng các best practices về bảo mật (hạn chế sử dụng quyền root, mã hóa secrets, quét lỗ hổng, ...).
Áp dụng các best practices về resource management (đặt requests và limits, sử dụng HPA, ...).
Tạo template cho các tài nguyên Kubernetes (sử dụng Helm, Kustomize, ...).
Tổ chức và cấu trúc các manifest file.
Sử dụng các công cụ để validate (kiểm tra tính hợp lệ) của các manifest.
Sử dụng các công cụ để quản lý và áp dụng các thay đổi trên các tài nguyên Kubernetes.
Phân quyền và quản lý truy cập cho nhiều người dùng và nhóm.
Thiết lập CI/CD pipeline để build, test và deploy ứng dụng lên Kubernetes.
Thực hành các tình huống xử lý sự cố và khắc phục.
Ôn tập các lệnh kubectl thông dụng.
Ôn tập các khái niệm quan trọng (Pod, Deployment, Service, ConfigMap, Secret, Volume, ...).
Thực hành làm một bài thi thử CKAD.
Rà soát và đánh giá kết quả bài thi thử, xác định các điểm cần cải thiện.
Tổng kết và xây dựng kế hoạch ôn tập cho kỳ thi CKAD.
Bài tập thêm
Tạo một Dockerfile để xây dựng một container image cho ứng dụng Node.js.
Tạo một container image và push nó lên Docker Hub.
Tạo một Job để thực hiện một tác vụ và đảm bảo rằng nó chạy thành công.
Tạo một CronJob để chạy một tác vụ vào mỗi giờ.
Tạo một Pod với hai container, một container chạy ứng dụng chính và một container chạy như một sidecar để ghi log.
Tạo một Pod với một init container để thiết lập cấu hình trước khi ứng dụng chính bắt đầu.
Sử dụng một EmptyDir volume để chia sẻ dữ liệu giữa các container trong một Pod.
Sử dụng một PersistentVolume và PersistentVolumeClaim để lưu trữ dữ liệu cho một Pod.
Khám phá và sử dụng một Custom Resource Definition (CRD) có sẵn.
Tạo một ServiceAccount và sử dụng nó trong một Pod.
Cấu hình RBAC để giới hạn quyền truy cập vào một namespace cụ thể.
Định nghĩa resource requests và limits cho một container.
Tạo và sử dụng một ResourceQuota để giới hạn tài nguyên sử dụng trong một namespace.
Tạo và sử dụng một ConfigMap để lưu trữ cấu hình cho một ứng dụng.
Tạo và sử dụng một Secret để lưu trữ thông tin nhạy cảm cho một ứng dụng.
Định nghĩa một SecurityContext cho một Pod hoặc Container.
Sử dụng Deployment để triển khai một ứng dụng với chiến lược blue/green.
Sử dụng Deployment để triển khai một ứng dụng với chiến lược canary.
Thực hiện một bản cập nhật rolling update cho một Deployment.
Sử dụng Helm để triển khai một chart có sẵn.
Tạo một chart Helm để đóng gói một ứng dụng.
Định nghĩa và sử dụng Liveness, Readiness và Startup Probes cho một container.
Sử dụng Prometheus để giám sát một ứng dụng đang chạy trong cluster.
Sử dụng Elasticsearch và Kibana để thu thập và trực quan hóa log từ các container.
Sử dụng kubectl để truy cập và lấy log từ một container cụ thể.
Sử dụng kubectl để debug một Pod bằng cách chạy một container tạm thời và gắn kết với nó.
Tạo một NetworkPolicy để hạn chế quyền truy cập giữa các Pod trong cùng một namespace.
Tạo một Service để expose một ứng dụng trong cluster.
Khắc phục sự cố khi không thể truy cập vào một ứng dụng thông qua Service.
Cấu hình một Ingress để expose một ứng dụng ra bên ngoài cluster.
Sử dụng Init Container để delay việc khởi động một Pod cho đến khi một điều kiện được đáp ứng.
Sử dụng PodAffinity và PodAntiAffinity để đặt ràng buộc trong việc lập lịch Pod.
Sử dụng NodeSelector để đặt ràng buộc một Pod chạy trên một Node cụ thể.
Sử dụng PodDisruptionBudget để đảm bảo tính sẵn sàng của ứng dụng trong quá trình cập nhật hoặc bảo trì.
Sử dụng HorizontalPodAutoscaler để tự động mở rộng số lượng Pod dựa trên mức sử dụng CPU.