→ From Coder to Shipper
From Coder to Shipper · DevOps

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.

← / → để chuyển slide · chuyển EN/VI bên dưới

Nền tảng

Kubernetes là gì?

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.

Người điều phối

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.

Nhiều container, nhiều má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.

Nó nằm trên Docker

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.

Tự động

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.

Toàn cảnh

Docker so với Kubernetes

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.

Docker — một 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?

Kubernetes — trung tâm điều hành

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ự.

Nó làm gì

Mô tả đích — nó giữ đúng đích

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ó.

Lên lịch chạy

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.

Tự chữa lành

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.

Scale

Đổ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.

Phát hành + load-balance

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.

01
Phần 1

Khái niệm cốt lõi (bản nhẹ)

Năm từ: cluster, node, pod, deployment, service.

Từ vựng

Năm từ bạn phải biết

Đó là toàn bộ từ vựng bạn cần để đọc một file deployment.

cluster

Toàn bộ: một nhóm máy làm việc cùng nhau để chạy container của bạn.

node

Một máy trong cluster (server hoặc VM) chạy các container.

pod

Đơ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).

deployment

'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.

service

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.

Bức tranh

Một cluster: các node, và các pod trên đó

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.

CLUSTER — toàn bộ

🖥 node-1

📦 pod · hello

🖥 node-2

📦 pod · hello

🖥 node-3

📦 pod · hello

↕ 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.

Vòng lặp

k8s giữ mục tiêu của bạn đúng như thế nào

Một vòng lặp điều khiển, chạy mỗi giây, mãi mãi.

  1. 1

    Bạn khai báo mục tiêu

    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.

  2. 2

    k8s lên lịch cho các pod

    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.

  3. 3

    Nó quan sát mọi thứ

    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?

  4. 4

    Nó sửa chỗ lệch

    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.

Vì sao

Khi nào bạn cần đến k8s

Quy tắc: nhiều container × nhiều server → k8s. Một site nhỏ → chưa cần.

Nhiều container trên nhiều server

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ả.

Tự chữa + scale không cần tay

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.

Nói thật: overkill cho một site nhỏ

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.

Ví dụ 1 · YAML

Một deployment nhỏ: 3 bản sao của app tôi

File này CHÍNH là mục tiêu: 3 replicas, image nginx:1.27, cổng 80.

deploy.yaml
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.

Ví dụ 2 · YAML

Một service: một tên ổn định cho các pod

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.

service.yaml
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.

Trong terminal

kubectl: áp dụng, rồi quan sát

`kubectl` là chiếc remote của cluster — hai lệnh bao quát 80% đời thường.

ops@vps — zsh
$ kubectl apply -f deploy.yaml
deployment.apps/hello created
$ kubectl apply -f service.yaml
service/hello-svc created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-7d4b9c8f5-2xk9p 1/1 Running 0 42s
hello-7d4b9c8f5-8m3qa 1/1 Running 0 42s
hello-7d4b9c8f5-t7w2r 1/1 Running 0 41s
3 pods — exactly what the deployment asked for
Bức tranh

Những tên bạn sẽ thực sự gặp

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à.

GKE / EKS / AKS

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.

k3s / minikube / kind

k8s siêu nhỏ chạy trên laptop hoặc một VPS — lý tưởng để học và cho dự án nhỏ.

kubectl

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.

Ngoài phạm vi

Những gì cố tình bỏ qua

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.

namespaces

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.

ingress

Internet bên ngoài tiếp cận service của bạn ra sao (URL, TLS, routing). Một chủ đề riêng.

Helm

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.

operators

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.

scheduling internals

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.
toàn cảnh

Nhiều hộp, không cần trông chừ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.