Kubernetes: Từ Nền tảng Lý thuyết đến Làm chủ Thực hành
Điều phối tương lai của việc triển khai ứng dụng, một câu chuyện từ Google Borg đến hệ sinh thái Cloud-Native.
Giới thiệu: Điều phối Tương lai
Kubernetes (K8s) là một nền tảng mã nguồn mở, di động, có khả năng mở rộng để quản lý các workload và dịch vụ được container hóa. Về bản chất, nó cung cấp một framework mạnh mẽ để chạy các hệ thống phân tán một cách đáng tin cậy. Khi ứng dụng chuyển đổi sang kiến trúc microservices, số lượng container tăng lên hàng trăm, hàng ngàn, và việc quản lý thủ công trở nên bất khả thi. Kubernetes giải quyết vấn đề này bằng cách tự động hóa việc khám phá dịch vụ, cân bằng tải, tự phục hồi và mở rộng quy mô, cho phép các nhà phát triển tập trung vào việc xây dựng ứng dụng thay vì quản lý cơ sở hạ tầng.
Phần I: Nền tảng Học thuật của Kubernetes
Chương 1: Sự tiến hóa của Cơ sở hạ tầng
Kubernetes là đỉnh cao của một quá trình tiến hóa từ Máy chủ Vật lý (Bare Metal), sang Ảo hóa (Virtualization), và cuối cùng là Container hóa (Containerization). Trong khi Docker giải quyết vấn đề đóng gói và chạy một container, nó không giải quyết được vấn đề quản lý nhiều container trên nhiều máy chủ. Khoảng trống này đã tạo ra nhu cầu cấp thiết về một lớp điều phối, dẫn đến sự ra đời của Kubernetes.
Chương 2: Dòng dõi Google: Borg, Omega và Sự ra đời của Kubernetes
Kubernetes kế thừa hơn một thập kỷ kinh nghiệm vận hành container ở quy mô Google. Nó học hỏi từ các hệ thống tiền nhiệm là Borg và Omega. Các khái niệm cốt lõi như Pods (từ "Allocs" của Borg), Labels và Selectors, và mô hình Controller bất đồng bộ đều được tinh chỉnh từ những bài học thực tế này. Quyết định mở nguồn Kubernetes vào năm 2014 là một bước đi chiến lược nhằm thiết lập một tiêu chuẩn ngành và tạo ra một nền tảng di động có thể chạy ở bất cứ đâu.
Phần II: Phân tích Kiến trúc Kubernetes
Chương 3 & 4: Control Plane - Bộ não của Hoạt động
Control Plane chịu trách nhiệm duy trì trạng thái mong muốn của cụm. Các thành phần cốt lõi của nó bao gồm:
- API Server (kube-apiserver): Giao diện đầu cuối và trung tâm của mọi giao tiếp.
- etcd: Kho lưu trữ key-value, là nguồn chân lý duy nhất cho trạng thái của cụm.
- Scheduler (kube-scheduler): Chọn một node phù hợp để chạy các Pod mới.
- Controller Manager (kube-controller-manager): Chạy các vòng lặp điều khiển cốt lõi để đưa trạng thái hiện tại về trạng thái mong muốn.
Chương 5: Worker Nodes - Nơi các Workload chạy
Đây là các máy chạy ứng dụng container hóa thực tế, bao gồm các thành phần:
- Kubelet: Agent chạy trên mỗi node, đảm bảo các container đang chạy như được mô tả.
- Kube-proxy: Duy trì các quy tắc mạng trên các node, là cốt lõi của khái niệm Service.
- Container Runtime: Phần mềm chịu trách nhiệm chạy container (ví dụ: containerd, CRI-O).
Phần III: Mô hình Đối tượng Kubernetes
Chương 6: Quản lý Workloads
Mọi thứ trong Kubernetes là một "đối tượng" được định nghĩa bằng YAML. Các đối tượng workload cốt lõi bao gồm:
| Đối tượng (Kind) | Mục đích | Dùng cho |
|---|---|---|
| Pod | Đơn vị thực thi nhỏ nhất, chứa một hoặc nhiều container. | Stateless/Stateful |
| Deployment | Quản lý các ứng dụng stateless với cập nhật cuốn chiếu và rollback. | Stateless |
| StatefulSet | Quản lý các ứng dụng stateful yêu cầu định danh và lưu trữ ổn định. | Stateful |
| DaemonSet | Đảm bảo một bản sao của Pod chạy trên mỗi Node. | Tác nhân hệ thống |
| Job / CronJob | Chạy các tác vụ hữu hạn hoặc theo lịch trình. | Batch |
Chương 7, 8 & 9: Networking, Storage, và Security
Kubernetes cung cấp các lớp trừu tượng mạnh mẽ để kết nối, lưu trữ và bảo mật ứng dụng:
- Services (ClusterIP, NodePort, LoadBalancer): Cung cấp một lớp trừu tượng mạng ổn định trên các Pods.
- Ingress: Cung cấp định tuyến Lớp 7 (HTTP/HTTPS) cho các dịch vụ.
- PersistentVolume (PV) & PersistentVolumeClaim (PVC): Tách biệt lưu trữ bền vững khỏi vòng đời của Pods.
- ConfigMaps & Secrets: Tách biệt cấu hình và thông tin nhạy cảm khỏi mã nguồn.
- RBAC & Network Policies: Cung cấp cơ chế ủy quyền và kiểm soát luồng lưu lượng mạng chi tiết.
Phần IV: Kubernetes Thực hành
Lab 1: Thiết lập Môi trường Cục bộ
Sử dụng Minikube hoặc kind (Kubernetes in Docker) để nhanh chóng thiết lập một cụm Kubernetes trên máy của bạn.
# Khởi động cụm với kind
kind create cluster --name my-cluster
# Khởi động cụm với Minikube
minikube start --driver=docker
Lab 2: Triển khai Ứng dụng Stateless
Tạo một Deployment để chạy nhiều bản sao của ứng dụng và một Service loại NodePort để phơi bày nó ra bên ngoài.
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-k8s-deployment
spec:
replicas: 3
selector:
matchLabels:
app: hello-k8s
template:
metadata:
labels:
app: hello-k8s
spec:
containers:
- name: hello-k8s-container
image: hello-k8s:v1
ports:
- containerPort: 8080
Lab 3: Triển khai Cơ sở dữ liệu với StatefulSet
Sử dụng một StatefulSet để triển khai MySQL, đảm bảo định danh mạng và lưu trữ ổn định. Dữ liệu nhạy cảm được quản lý bằng Secret, và lưu trữ được yêu cầu thông qua PersistentVolumeClaim.
Phần V: Hệ sinh thái và các Chủ đề Nâng cao
Chương 11: Tối ưu hóa với Helm
Helm được ví như "trình quản lý gói cho Kubernetes". Nó đơn giản hóa việc triển khai và quản lý ứng dụng bằng cách đóng gói tất cả tài nguyên cần thiết vào một đơn vị có phiên bản gọi là Chart.
Chương 12: Đón nhận GitOps với Argo CD & Flux
GitOps là một framework vận hành sử dụng Git làm nguồn chân lý duy nhất cho trạng thái mong muốn của hệ thống. Các công cụ như Argo CD và Flux tự động đồng bộ hóa trạng thái trong cụm với những gì được định nghĩa trong kho lưu trữ Git.
Chương 13: Khả năng Quan sát: Giám sát và Ghi log
Trong một hệ thống phân tán, khả năng quan sát là rất quan trọng. Bộ công cụ tiêu chuẩn bao gồm:
- Giám sát: Sử dụng Prometheus để thu thập chỉ số và Grafana để trực quan hóa chúng trên các dashboard.
- Ghi log: Sử dụng EFK Stack (Elasticsearch, Fluentd, Kibana) để thu thập, lưu trữ và phân tích log một cách tập trung.