K3s cho HomeLab: Ngừng “trông trẻ” Container và bắt đầu Điều phối chuyên nghiệp

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Cuộc gọi đánh thức lúc 2 giờ sáng: Tại sao Docker Compose là chưa đủ

Tất cả chúng ta đều đã từng trải qua: 2 giờ sáng, bảng điều khiển (dashboard) bị sập, và bạn đang nhìn chằm chằm vào lỗi “Connection Refused”. Cuối cùng bạn tìm ra thủ phạm—một container duy nhất đã chạm giới hạn bộ nhớ (OOM) và cứ thế “chết đứng”. Trong một thiết lập Docker Compose cơ bản, một container bị sập thường sẽ nằm im cho đến khi bạn can thiệp thủ công. Đêm đó, tôi nhận ra Docker Compose là một điểm khởi đầu tuyệt vời, nhưng nó thiếu đi khả năng tự phục hồi cần thiết cho một HomeLab thực sự ổn định.

Và đó là lúc K3s xuất hiện. Đây là một bản phân phối Kubernetes siêu nhẹ, đã được chứng nhận, do Rancher xây dựng dành riêng cho các môi trường tài nguyên thấp. Nó thay thế các thành phần nặng nề như etcd bằng SQLite và loại bỏ các tính năng alpha cũ kỹ. Kết quả là một tệp thực thi duy nhất chỉ 50MB và tiêu tốn chưa đến 512MB RAM khi ở trạng thái nghỉ. Nếu bạn muốn chuyển từ một “người chơi hệ máy chủ” nghiệp dư sang quy trình DevOps chuyên nghiệp trên Raspberry Pi 5 hoặc một chiếc Intel NUC cũ, đây chính là công cụ cần học.

K3s mang khả năng điều phối cấp doanh nghiệp vào ngay tủ đồ của bạn. Nó xử lý việc tự động khởi động lại, cập nhật cuốn chiếu (rolling updates) và cấu hình khai báo (declarative configuration) mà không cần đến một dàn máy chủ ngốn điện. Về cơ bản, nó biến phần cứng dư thừa của bạn thành một trung tâm dữ liệu mini.

Cài đặt: Từ con số không đến một cụm Cluster trong 30 giây

Hầu hết mọi người nghĩ rằng việc khởi tạo Kubernetes mất hàng giờ. Trong khi K8s tiêu chuẩn yêu cầu các công cụ phức tạp như kubeadm, K3s sử dụng một script shell đơn giản để xử lý các công việc nặng nhọc. Tôi khuyên bạn nên chạy script này trên một bản Ubuntu 24.04 LTS sạch để có khả năng tương thích tốt nhất.

Để bắt đầu, hãy cập nhật hệ thống và cài đặt curl:

sudo apt update && sudo apt upgrade -y
sudo apt install curl -y

Tiếp theo, hãy chạy script cài đặt. Chúng ta sẽ vô hiệu hóa trình điều khiển ingress Traefik mặc định tại đây để giữ cho thiết lập ban đầu được tinh gọn, mặc dù K3s có thể quản lý việc này cho bạn nếu bạn thích một giải pháp tất-cả-trong-một:

curl -sfL https://get.k3s.io | sh -s - --disable traefik

Kiểm tra trạng thái của node sau khi script kết thúc. Nó sẽ chuyển sang trạng thái “Ready” trong khoảng 10 đến 15 giây:

sudo kubectl get nodes

Việc quản lý cụm cluster sẽ dễ dàng hơn nếu bạn không phải gõ sudo cho mọi câu lệnh. Hãy sao chép cấu hình vào thư mục người dùng của bạn với các bước sau:

mkdir ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
export KUBECONFIG=~/.kube/config

Cấu hình: Triển khai ứng dụng tự phục hồi đầu tiên

Trong thế giới Kubernetes, chúng ta không chỉ “chạy” một container. Thay vào đó, chúng ta định nghĩa một Deployment để chỉ định số lượng bản sao mong muốn và một Service để xác định cách người dùng truy cập chúng. Hãy cùng triển khai một instance Nginx đơn giản. Đây là ví dụ hoàn hảo để thay thế cho các ứng dụng phức tạp hơn như wiki cá nhân hoặc media server.

1. Tạo Deployment

Tạo một tệp có tên webapp.yaml. Bản manifest này cho K3s biết chính xác ứng dụng nên hoạt động như thế nào. Nếu một pod (vỏ bọc của Kubernetes cho container) bị chết, K3s sẽ nhận thấy sự thiếu hụt và lập tức khởi tạo một bản thay thế.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-server
  template:
    metadata:
      labels:
        app: web-server
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Áp dụng cấu hình bằng lệnh kubectl:

kubectl apply -f webapp.yaml

2. Xử lý lưu trữ dữ liệu (Persistent Storage)

Quản lý dữ liệu thường là trở ngại lớn nhất đối với những người chơi HomeLab. K3s bao gồm sẵn trình cấp phát local-path theo mặc định. Bạn không còn phải tạo thư mục thủ công và ánh xạ chúng như trong Docker nữa. Chỉ cần yêu cầu một PersistentVolumeClaim (PVC), và K3s sẽ tự động cấp phát không gian cần thiết trên đĩa cứng của bạn. Dù sau này bạn có thể chuyển sang Longhorn hoặc NFS cho các thiết lập đa node, nhưng local-path mặc định vẫn cực kỳ ổn định cho các lab chạy đơn node.

Xác minh & Giám sát: Duy trì hệ thống hoạt động

Khi các ứng dụng đã hoạt động, bạn cần theo dõi hiệu suất của chúng. Nếu bạn đang khắc phục sự cố vào lúc 2 giờ sáng, điều cuối cùng bạn muốn làm là grep qua hàng nghìn dòng tệp văn bản thô.

Sức mạnh của K9s

Mặc dù kubectl là công cụ tiêu chuẩn, tôi sử dụng K9s để quản lý hàng ngày. Hãy coi nó như một bảng điều khiển terminal tốc độ cao cho cụm cluster của bạn. Nó cho phép bạn xem log, khởi động lại pod và truy cập shell vào container chỉ với vài phím bấm. Nó nhanh hơn nhiều so với việc gõ các lệnh dài dòng.

# Cài đặt K9s thông qua webi
curl -sS https://webi.sh/k9s | sh

Kiểm tra sức khỏe và Khắc phục sự cố

Nếu bạn thích dòng lệnh hơn, hãy sử dụng hai lệnh sau để theo dõi các dịch vụ của mình:

kubectl get pods
kubectl logs -f [TÊN_POD]

Trạng thái CrashLoopBackOff thường chỉ ra lỗi cấu hình bên trong container của bạn. Nếu một pod ở trạng thái Pending, có khả năng máy chủ của bạn đã hết CPU hoặc RAM.

Giới hạn tài nguyên: Bí quyết của sự ổn định

Để ngăn một ứng dụng bị lỗi làm sập toàn bộ máy chủ, hãy luôn thiết lập giới hạn tài nguyên (resource limits). Đây là dấu ấn của một thiết lập chuyên nghiệp. Hãy thêm khối mã này vào cấu hình container của bạn để kiểm soát mọi thứ:

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

Việc áp dụng các ranh giới này đảm bảo rằng các dịch vụ quan trọng, như DNS hoặc Home Assistant, luôn có đủ tài nguyên cần thiết. Ngay cả khi một dự án thử nghiệm mới bị rò rỉ bộ nhớ, lab cốt lõi của bạn vẫn trực tuyến. Chuyển sang K3s có một lộ trình học tập nhất định, nhưng sự ổn định mà nó mang lại hoàn toàn xứng đáng với công sức bỏ ra. Bạn sẽ ngừng lo lắng về từng container riêng lẻ và bắt đầu tập trung vào các dịch vụ của mình.

Share: