Nhập môn Kubernetes: Triển khai ứng dụng đầu tiên chỉ sau 5 phút vọc vạch

Development tutorial - IT technology blog
Development tutorial - IT technology blog

Hồi năm 2018, mình từng thức trắng đến 4 giờ sáng chỉ để SSH vào hơn 20 con server, hì hục kéo code mới rồi restart dịch vụ thủ công. Lúc đó cứ ngỡ mình là ‘siêu nhân’ vận hành, cho đến khi một con node lỗi kéo theo cả hệ thống sập dây chuyền. Đó là khoảnh khắc mình nhận ra: Cần phải tự động hóa ngay lập tức. Và Kubernetes (K8s) chính là lời giải.

K8s nghe có vẻ cao siêu, nhưng bạn hãy tưởng tượng nó như một vị ‘tổng quản’ siêu cấp cho hạ tầng. Bạn chỉ cần ra lệnh: “Tôi muốn chạy đúng 5 bản sao của web này”. Việc còn lại, từ chọn server trống đến việc tự hồi phục khi có lỗi, ông tổng quản này sẽ lo từ A đến Z.

Thực hành ngay: Chạy ứng dụng đầu tiên trong 5 phút

Thay vì nhồi nhét lý thuyết, chúng ta sẽ bắt tay vào làm luôn cho nóng. Bạn hãy cài Minikube (bản K8s thu nhỏ cho laptop) hoặc dùng Play with Kubernetes để thực hành online miễn phí.

Khi đã có công cụ dòng lệnh kubectl trong tay, bạn hãy thử chuỗi lệnh ‘thần thánh’ sau:

# 1. Tạo một Deployment chạy image Nginx
kubectl create deployment hello-k8s --image=nginx

# 2. Kiểm tra xem Pod đã 'lên đèn' chưa
kubectl get pods

# 3. Mở cổng để truy cập từ trình duyệt
kubectl expose deployment hello-k8s --type=NodePort --port=80

# 4. Lấy URL để xem thành quả (chỉ dành cho Minikube)
minikube service hello-k8s --url

Chỉ mất chưa đầy 120 giây, bạn đã triển khai xong một container lên cluster. K8s tự động tìm vị trí tối ưu trên hạ tầng để đặt Nginx vào, đồng thời đảm bảo nó luôn ở trạng thái sẵn sàng phục vụ.

Bóc tách khái niệm: Pod, Deployment và Service

Nếu bạn thấy mấy thuật ngữ trên hơi lùng bùng lỗ tai, hãy để mình giải thích theo cách ‘bình dân’ nhất.

Pod – Đơn vị nhỏ nhất

Trong thế giới Docker, ta nói về Container. Nhưng với K8s, đơn vị nhỏ nhất là Pod. Một Pod giống như một căn hộ chung cư, nơi các container là những người bạn cùng phòng dùng chung điện nước (tài nguyên). Quy tắc vàng: Mỗi Pod thường chỉ nên chứa 1 container chính để quản lý hiệu quả nhất.

Deployment – Người quản lý tận tụy

Đừng bao giờ tạo Pod thủ công. Hãy dùng Deployment. Đây là nơi bạn khai báo trạng thái mong muốn (Desired State). Ví dụ: “Lúc nào cũng phải có 3 Pod chạy ổn định”. Nếu một Pod bỗng dưng ‘đột tử’, Deployment sẽ ngay lập tức khởi tạo Pod mới ở một server khác để bù vào. Hệ thống sẽ tự hồi phục mà không cần bạn phải thức đêm bấm nút.

Service – Số Hotline cố định

Pod trong K8s rất ‘mong manh’. Chúng có thể bị xóa và tạo mới với địa chỉ IP thay đổi liên tục. Vậy làm sao để người dùng tìm thấy app? Service chính là câu trả lời. Nó cung cấp một địa chỉ IP và tên miền cố định, đóng vai trò như một tấm bia đỡ đạn để điều hướng traffic chính xác vào các Pod đang sống.

Nâng tầm: Scaling ứng dụng với file YAML

Sức mạnh thực sự của K8s nằm ở tính khai báo (Declarative). Thay vì gõ lệnh, bạn viết mọi thứ vào file YAML. Hãy xem cách mình nâng cấp hệ thống lên 3 bản sao cực kỳ đơn giản:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3 # Tăng tải tức thì tại đây
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        resources:
          limits:
            memory: "256Mi"
            cpu: "500m"

Chỉ cần chạy lệnh kubectl apply -f deployment.yaml, K8s sẽ tự động ‘soi’ file này với hiện trạng thực tế. Sau đó, nó thực hiện các thay đổi cần thiết để đưa hệ thống về đúng cấu hình bạn vừa yêu cầu.

Vài mẹo nhỏ giúp bạn tránh ‘ăn hành’

Sau nhiều năm lăn lộn với các cluster lớn nhỏ, mình rút ra 4 bài học xương máu cho anh em:

  • Cấm thả rông Resource: Đừng bao giờ quên mục limits. Mình từng bị một con script lỗi rò rỉ bộ nhớ kéo sập cả cái node đang chạy 15 dịch vụ khác chỉ vì quên giới hạn RAM ở mức 256MB.
  • Nói không với tag :latest: Hãy chỉ định phiên bản cụ thể như nginx:1.21. Dùng latest sẽ khiến bạn không biết chắc version nào đang chạy, cực kỳ đau đầu khi cần debug sự cố.
  • Làm bạn với Logs: Lệnh kubectl logs -f [tên-pod] là cứu cánh số một. Khi app không chạy, hãy vào đó nghe nó ‘than phiền’ để biết đường mà sửa.
  • Soi kỹ YAML: File YAML cực kỳ nhạy cảm với khoảng trắng. Hãy cài ngay extension YAML trên VS Code để tránh mất cả tiếng đồng hồ chỉ vì dư một dấu cách.

K8s còn rất nhiều thứ hay ho như Ingress, ConfigMap hay Secret chờ bạn khám phá. Đừng ngại thử sai và xóa đi làm lại, đó là cách nhanh nhất để làm chủ công nghệ này. Nếu vướng chỗ nào, cứ để lại bình luận phía dưới, mình sẽ hỗ trợ hết mình!

Share: