Người điều phối container: phần mềm chạy và quản lý NHIỀU container trên NHIỀU máy — tự động.
← / → để chuyển slide · chuyển EN/VI bên dưới
Kubernetes (k8s) = 'người điều phối container' — phần mềm chạy và quản lý NHIỀU container trên NHIỀU máy, tự động.
Bạn nói cho nó biết bạn muốn gì; nó quyết định mỗi container chạy ở đâu và giữ cho nó chạy.
Không phải một app trên một VPS — mà là hàng chục, hàng trăm container trải trên một nhóm máy.
Docker đóng hộp; k8s lái cả đội bay. Nó không thay Docker — nó quản lý các container mà Docker (hoặc tương đương) tạo ra.
Máy chết, container sập, traffic tăng vọt — k8s nhận ra và tự sửa, không cần con người.
Một chiếc hộp so với 'trung tâm kiểm soát không lưu' cho nhiều hộp.
Đóng gói MỘT app cùng mọi thứ nó cần vào một container duy nhất — chiếc hộp di động chạy giống hệt trên laptop lẫn trên server.
Tuyệt cho một app. Nó không trả lời: máy nào chạy nó? sập rồi thì sao? chạy 3 bản sao thế nào?
Chạy và quản lý NHIỀU hộp như vậy trên NHIỀU máy — đặt chỗ, khởi động lại, scale, đổi phiên bản — tự động.
Bạn mô tả đích ('3 bản sao của hello'); k8s giữ cho bầu trời trật tự.
Bạn không ra lệnh từng máy. Bạn khai báo một trạng thái ('3 bản sao của app tôi'), và k8s liên tục làm việc để thực tế khớp với nó.
Quyết định mỗi container đặt lên máy nào (node), trải đều tải trên cả nhóm máy.
Container sập hoặc máy chết → k8s khởi động bản thay thế, thường trên node khác, trong vài giây.
Đổi replicas từ 3 lên 10 — bản sao mới xuất hiện. Hạ xuống thì chúng biến mất. Không cần làm từng máy.
Phiên bản mới? Container được đổi lần lượt mà không downtime. Traffic được chia đều cho các bản đang chạy.
Năm từ: cluster, node, pod, deployment, service.
Đó là toàn bộ từ vựng bạn cần để đọc một file deployment.
Toàn bộ: một nhóm máy làm việc cùng nhau để chạy container của bạn.
Một máy trong cluster (server hoặc VM) chạy các container.
Đơn vị nhỏ nhất: một nhóm 1+ container sống cùng nhau (gần như luôn chỉ một cái).
'Chạy N bản sao của pod này, và giữ cho nó đúng.' Đối tượng bạn sửa nhiều nhất — nó lo restart, phát hành và scale.
Một tên + cổng ổn định cho một nhóm pod. Pod đến rồi đi; địa chỉ của service thì không bao giờ đổi.
3 node, 3 pod — một pod mỗi node. Service cho cả ba pod một cánh cổng chung duy nhất.
🖥 node-1
🖥 node-2
🖥 node-3
↕ service "hello-svc" — một tên + cổng ổn định cho cả ba pod
Nếu node-2 chết, k8s đặt lại pod đó lên node khác — cluster vẫn giữ 3 bản đang chạy.
Một vòng lặp điều khiển, chạy mỗi giây, mãi mãi.
Một file YAML: 'chạy 3 bản sao của image hello, cổng 80'. Bạn `kubectl apply` nó một lần.
Scheduler chọn node cho mỗi pod trong 3 pod — trải chúng ra, tôn trọng sức chứa của từng máy.
Phần điều khiển liên tục kiểm tra: có đúng 3 pod đang chạy không? Image đúng không? Cổng mở chưa?
Pod sập → pod mới. Node chết → pod của nó chuyển đi nơi khác. Tăng tải → thêm bản sao. Bạn không bao giờ làm tay.
Quy tắc: nhiều container × nhiều server → k8s. Một site nhỏ → chưa cần.
Monolith là một app trên một VPS. Một sản phẩm thật lớn lên thành nhiều service, mỗi thứ vài bản sao — phải có thứ gì đó đặt, restart và scale tất cả.
Sập lúc 2 giờ sáng → k8s đã restart từ lâu. Traffic tăng vọt → replicas 3 → 30 → về 3. Không có con người trong vòng lặp.
Một app, một VPS? Docker + nginx là đủ và đơn giản hơn nhiều. k8s chỉ đáng tiền khi đội container vượt quá khả năng quản lý bằng tay.
File này CHÍNH là mục tiêu: 3 replicas, image nginx:1.27, cổng 80.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
replicas: 3
selector:
matchLabels: {app: hello}
template:
spec:
containers:
- name: hello
image: nginx:1.27
containerPort: 80
replicas: 3 là toàn bộ yêu cầu — k8s làm việc không ngừng để luôn đúng 3 bản đang chạy.
Pod có tên mới hoàn toàn mỗi lần được tạo lại — tên và cổng của service thì không bao giờ đổi.
apiVersion: v1
kind: Service
metadata:
name: hello-svc
spec:
selector:
app: hello
ports:
- port: 80
targetPort: 80
selector tìm mọi pod có label app: hello; client chỉ cần nói chuyện với hello-svc:80.
`kubectl` là chiếc remote của cluster — hai lệnh bao quát 80% đời thường.
k8s bản thân là open source; thực tế bạn chạy bản managed của cloud — hoặc bản siêu nhỏ ở nhà.
k8s managed từ Google, Amazon và Azure — cloud lo phần điều khiển, bạn chỉ cần deploy. Lựa chọn mặc định của đa số team.
k8s siêu nhỏ chạy trên laptop hoặc một VPS — lý tưởng để học và cho dự án nhỏ.
Chiếc remote dòng lệnh — cùng một công cụ dùng được với mọi k8s ở trên, managed hay không.
k8s có hộp công cụ rất đồ sộ. Những thứ sau là thật — nhưng không phải bước tiếp theo của bạn.
Các phân vùng logic trong một cluster (staging vs prod). Hữu ích về sau — namespace mặc định dùng tốt lúc đầu.
Internet bên ngoài tiếp cận service của bạn ra sao (URL, TLS, routing). Một chủ đề riêng.
Trình quản lý gói cho k8s — các 'chart' dùng lại được cho app phổ biến. Bạn sẽ gặp nó sau phần cơ bản.
Bộ điều khiển tùy biến tự động hóa cả hệ thống (database, hàng đợi…). Mạnh, nâng cao.
Scheduler chấm điểm và chọn node ra sao. Biết 'nó tự đặt pod cho bạn' là đủ ở đây.
Docker đóng một app vào một chiếc hộp. Kubernetes là trung tâm kiểm soát không lưu đưa NHIỀU hộp như vậy bay trên NHIỀU máy — đặt, khởi động lại và scale chúng, tự động.
Tiếp theo: đặt một deployment YAML lên một cluster nhỏ — k3s trên một VPS là lựa chọn khởi đầu rất tốt.