Kubernetes là hệ thống điều phối container theo mô hình khai báo: bạn gửi trạng thái mong muốn (manifest YAML) lên API server, các controller liên tục so sánh và kéo trạng thái thực tế về khớp với nó (reconcile loop). Không có lệnh "chạy container X trên node Y", chỉ có "muốn 3 bản sao của image X".
Kiến trúc
flowchart LR K[kubectl] --> API["kube-apiserver (control plane)"] API --> ETCD[(etcd)] SCH[kube-scheduler] --> API CM[kube-controller-manager] --> API KL["kubelet (node)"] --> API KP["kube-proxy (node)"] --> API KL --> CR["containerd (CRI)"]
| Thành phần | Vai trò |
|---|---|
kube-apiserver |
Cửa vào duy nhất, xác thực, RBAC, ghi/đọc etcd. Mọi thành phần khác chỉ nói chuyện với API server |
etcd |
Key-value store lưu toàn bộ trạng thái cluster. Mất etcd là mất cluster, cần backup |
kube-scheduler |
Chọn node cho Pod mới (resource request, taint/toleration, affinity) |
kube-controller-manager |
Chạy các controller: Deployment, ReplicaSet, Node, Job, EndpointSlice... |
kubelet |
Agent trên mỗi node, nhận Pod spec và bảo container runtime chạy; chạy probe |
kube-proxy |
Lập trình iptables/IPVS/nftables để Service IP trỏ tới Pod (một số CNI như Cilium thay thế nó) |
| CNI plugin | Cấp IP cho Pod và nối mạng giữa các node (Calico, Cilium, Flannel) |
Các object hay gặp
| Object | Là gì | Ghi chú |
|---|---|---|
| Pod | Đơn vị nhỏ nhất, 1+ container chung network namespace và volume | Ephemeral: chết là mất, IP đổi. Không tạo Pod trần cho app |
| Deployment | Quản lý ReplicaSet → Pod, rolling update, rollback | Cho app stateless |
| StatefulSet | Pod có tên cố định (db-0, db-1) và PVC riêng từng Pod |
Database, Kafka |
| DaemonSet | Mỗi node một Pod | Agent log, node-exporter, CNI |
| Job / CronJob | Chạy tới khi xong / theo lịch | Backup, migrate |
| Service | IP + DNS ổn định trỏ tới tập Pod theo selector |
ClusterIP (nội bộ), NodePort, LoadBalancer, ExternalName |
| Ingress | Định tuyến HTTP(S) theo host/path vào Service | Cần Ingress controller (ingress-nginx, Traefik). Gateway API là thế hệ kế tiếp |
| ConfigMap | Cấu hình dạng key-value hoặc file | Mount thành file hoặc env |
| Secret | Như ConfigMap nhưng cho dữ liệu nhạy cảm | Chỉ base64, cần bật encryption at rest và RBAC chặt |
| PersistentVolumeClaim | Yêu cầu storage (dung lượng, access mode) | StorageClass cấp PV động |
| Namespace | Phân vùng logic cho tên, quota, RBAC | Không phải ranh giới mạng nếu thiếu NetworkPolicy |
Ví dụ tối thiểu
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 2
selector:
matchLabels: { app: api }
template:
metadata:
labels: { app: api }
spec:
containers:
- name: api
image: registry.example.com/api:1.4.2
ports: [{ containerPort: 8000 }]
envFrom:
- configMapRef: { name: api-config }
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef: { name: api-db, key: password }
resources:
requests: { cpu: 100m, memory: 128Mi }
limits: { memory: 256Mi }
readinessProbe:
httpGet: { path: /healthz, port: 8000 }
---
apiVersion: v1
kind: Service
metadata:
name: api
spec:
selector: { app: api }
ports:
- port: 80
targetPort: 8000Chuỗi liên kết: Service selector khớp labels của Pod template → EndpointSlice chứa IP các Pod Ready → DNS api.<namespace>.svc.cluster.local trả về ClusterIP. Sai label là Service không có endpoint.
Luồng request từ ngoài vào
flowchart LR C[Client] --> LB["LoadBalancer / NodePort"] LB --> IC["Ingress controller"] IC -->|"host/path rule"| S["Service api"] S --> P1["Pod api-1"] S --> P2["Pod api-2"]
Cấu hình Ingress có TLS tự động: ingress-nginx + cert-manager. Đóng gói nhiều manifest: Helm.
Khi nào dùng
- Nên: nhiều service, cần tự phục hồi, rolling update, scale ngang, nhiều team chung hạ tầng, đã có người vận hành cluster (hoặc dùng managed: EKS/GKE/AKS).
- Chưa cần: vài container trên 1-2 máy, Docker Compose + systemd là đủ, xem Docker Compose – pattern hay dùng.
- Khi lỗi: tra Kubernetes – lệnh troubleshooting.