Featured image of post Docker vs. Kubernetes: Mô hình tư duy 'Quản lý khách sạn'

Docker vs. Kubernetes: Mô hình tư duy 'Quản lý khách sạn'

Tại sao tôi cần K8s nếu đã có Docker? Hướng dẫn chuyên sâu về Container (Robot) và Orchestration (Ông quản lý).

“Mình có cần dùng Kubernetes không?”

Đây là câu hỏi mình nhận được nhiều nhất từ các CTO startup. Họ đã chạy Docker ngon lành trên máy cá nhân. Họ nghĩ Kubernetes chỉ là “Docker phiên bản mạnh hơn” (Docker on steroids).

Hoàn toàn sai lầm.

So sánh Docker với Kubernetes giống như so sánh một Viên gạch với một Ông cai thầu xây dựng. Một cái là vật liệu; cái kia là một hệ thống phức tạp chuyên đi quát tháo khi có người đi trễ.

Đây là Hướng dẫn chuyên sâu về Hệ sinh thái Container. Chúng ta sẽ bắt đầu từ mô hình tư duy, các lệnh debug, và cái lỗi ám ảnh mang tên “CrashLoopBackOff”.


Phần 1: Nền tảng (Mô hình tư duy)

Kỷ nguyên Nguyên thủy: Ngôi nhà

Ngày xưa, chúng ta xây Nhà (Máy chủ vật lý).

  • Muốn nấu ăn, xây Bếp.
  • Muốn ngủ, xây Phòng ngủ.
  • Vấn đề: Nếu Bếp cháy, Phòng ngủ cũng cháy theo. (App A làm sập App B).

Kỷ nguyên VM: Chung cư

Sau đó có Máy ảo (Virtual Machine). Trên một miếng đất to (Server), ta xây nhiều căn hộ khép kín.

  • Mỗi căn hộ có điện nước, tường bao riêng nhờ Hypervisor.
  • Vấn đề: Nặng nề. Căn nào cũng phải tự lo nồi niêu xoong chảo riêng. (Khởi động cả hệ điều hành mất cả phút).

Kỷ nguyên Docker: Phòng khách sạn (Container)

Docker nhận ra ta không cần cả một căn hộ. Ta chỉ cần một Căn phòng.

  • Container: Phòng tiêu chuẩn. Nội thất giống hệt nhau (Dependencies).
  • Dùng chung: Các phòng dùng chung điện nước của tòa nhà (Host OS Kernel).
  • Lợi ích: Bạn có thể “hô biến” ra 1,000 căn phòng trong vài giây.

Kỷ nguyên Kubernetes: Ông Quản lý khách sạn

Giờ bạn có 1,000 căn phòng. Ai dọn dẹp? Ai xếp phòng cho khách? Toilet hỏng thì ai sửa?

Kubernetes (K8s) chính là Ông Quản lý.

  • Bạn: “Tôi cần 3 phòng View Biển (Front-end) và 2 phòng có Két sắt (Database).”
  • Quản lý (K8s): “Xong.”
  • Thực tế: Một phòng bị ngập nước.
  • Quản lý (K8s): “Tôi thấy phòng 203 bị ’tèo’ rồi. Tôi vừa tạo ngay một phòng y hệt, phòng 405. Khách còn chưa kịp nhận ra.”

Docker chạy cái app. Kubernetes chạy cái Docker.


Phần 2: Điều tra (Debug như chuyên gia)

1. Soi Container (Docker thuần)

Khi container dở chứng trên máy local:

1
2
3
4
5
# "Sao mày chết?"
docker logs my-app

# "Mày thực chất là cái gì?"
docker inspect my-app | grep "IPAddress"

2. Soi Pod (Kubernetes)

Khi một Pod (cái vỏ bọc của K8s cho container) bị chết:

1
2
3
4
5
# "Alo Quản lý, chuyện gì xảy ra với phòng này?"
kubectl describe pod my-app-xyz

# "Cho tôi đọc nhật ký của khách trong phòng"
kubectl logs my-app-xyz --previous

Lệnh “Describe” là bạn thân nhất của bạn. Nó nói cho bạn biết chính xác tại sao Ông Quản lý lại giết cái phòng đó (ví dụ “OOMKilled” - do khách ăn tốn RAM quá).


Phần 3: Chẩn đoán (Giải mã Error Codes)

Lỗi của Kubernetes thường khá khó hiểu. Đây là từ điển giải mã.

Trạng tháiÝ nghĩaÔng Quản lý nói…Cách sửa
PendingHết phòng.“Khách sạn full rồi. Không còn server nào đủ RAM cho anh cả.”Mua thêm server (node) hoặc giảm resource request.
CrashLoopBackOffChết đi sống lại.“Cứ mở cửa phòng là nó nổ tung. Tôi tạm thời không mở nữa.”Check code (kubectl logs). Thường do lỗi config hoặc không kết nối được DB.
OOMKilledHết bộ nhớ (Out of Memory).“Thằng khách này ăn hết cả cái buffet. Tôi đuổi nó rồi.”Tăng resources.limits.memory lên.
ImagePullBackOffKhông tìm thấy Image.“Anh đòi nội thất kiểu ‘V2’, nhưng trong kho không có.”Kiểm tra tên image/tag hoặc quyền truy cập registry.

Phần 4: Giải pháp (Yamls & Dockerfiles)

1. Bản thiết kế (Dockerfile)

Giữ cho nó nhẹ thôi. Đừng mang cả đội thợ xây vào nếu bạn chỉ cần cái búa.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Dở: Cài nguyên cái OS ubuntu nặng trịch
FROM ubuntu:latest

# Tốt: Chỉ cài môi trường Python tối giản
FROM python:3.9-slim

WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

2. Sổ tay hướng dẫn (K8s Deployment)

Ra lệnh cho Ông Quản lý. Ông ấy sẽ tự lo phần còn lại.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3                    # "Tôi muốn 3 phòng y hệt nhau"
  template:
    spec:
      containers:
      - name: my-app
        image: my-app:v1
        resources:
          limits:
            memory: "128Mi"      # "Đừng để nó ăn quá 128Mb RAM"

Mô hình tư duy chốt hạ

1
2
3
4
5
Docker     -> Viên gạch. (Chạy code).
Kubernetes -> Ông Quản lý. (Quản lý các viên gạch).

"Docker Swarm" -> Ông quản lý hiền lành nhưng hơi chậm.
"Kubernetes"   -> Ông quản lý thiên tài nhưng cực kỳ khó tính.

Nếu bạn có 1 server, dùng Docker Compose. Nếu bạn có 100 server, dùng Kubernetes. Đừng thuê một Ông Quản lý khách sạn 5 sao về chỉ để dọn dẹp cái phòng trọ sinh viên của bạn.

Được tạo với sự lười biếng tình yêu 🦥

Subscribe to My Newsletter