Hướng dẫn triển khai vCluster trên Kubernetes: Cụm ảo tiết kiệm chi phí cho đội ngũ phát triển

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Bối cảnh & Lý do

Vào lúc 2:14 sáng một ngày thứ Năm, PagerDuty réo chuông inh ỏi đánh thức tôi dậy. Hóa đơn Amazon EKS cho môi trường staging đã tăng vọt từ $3.200 lên hơn $9.800 chỉ trong một sprint duy nhất. Tệ hơn nữa, một Helm chart bị lỗi do kỹ sư junior chạy đã xóa sạch CustomResourceDefinition (CRD) của cert-manager dùng chung trên toàn bộ cụm đa người dùng (multi-tenant) của chúng tôi. Ba nhánh tính năng sập ngay lập tức. Pipeline tích hợp bị đình trệ hoàn toàn, và Slack ngập tràn thông báo sự cố.

Các đội ngũ platform phải đối mặt với một sự đánh đổi nghiệt ngã. Việc cấp cho hai mươi lập trình viên các cụm cloud riêng biệt tiêu tốn khoảng $1.500 mỗi tháng chỉ riêng cho control plane của EKS ($73/cụm/tháng), chưa kể đến lãng phí từ tài nguyên node nhàn rỗi. Ngược lại, nếu gò bó họ vào các Kubernetes namespace dùng chung, mọi thứ sẽ đổ vỡ ngay khoảnh khắc ai đó cần tài nguyên ở cấp cluster-scope, custom operator, hoặc admission webhook.

Namespace về bản chất chỉ mang lại sự cô lập mềm (soft tenancy). Chúng phân vùng tên và áp đặt hạn mức tài nguyên (quota), nhưng mọi người vẫn dùng chung một API server, registry CRD và hệ thống RBAC toàn cục. Hãy thử kiểm thử việc nâng cấp Istio service mesh hoặc đánh giá một ArgoCD operator trong một namespace tiêu chuẩn; bạn sẽ va phải rào cản phân quyền ngay tức khắc.

Đó là lúc vCluster của Loft Labs phát huy tác dụng. Cụm ảo (virtual cluster) là một Kubernetes control plane đạt chuẩn chứng chỉ đầy đủ, vận hành ngay bên trong một namespace tiêu chuẩn trên cụm host hiện có của bạn.

Nó tự khởi tạo API server và data store riêng (mặc định là SQLite, hoặc etcd), thường chạy trên nền K3s gọn nhẹ. Khi kỹ sư lập lịch chạy một pod, vCluster chỉ đồng bộ các tài nguyên runtime—như Pod, Service và PVC—xuống các worker node vật lý bên dưới. Còn các CRD tùy biến, namespace và cluster role đều được cô lập an toàn bên trong virtual API server.

Việc áp dụng kiến trúc này thường giúp cắt giảm từ 60% đến 70% chi phí điện toán cho các môi trường non-production, đồng thời triệt tiêu hoàn toàn rủi ro ảnh hưởng lẫn nhau giữa các ứng dụng (noisy-neighbor).

Cài đặt

Các nhà cung cấp đám mây thường mất từ 10 đến 20 phút để khởi tạo một managed control plane. Ngược lại, vCluster chỉ mất khoảng 15 giây để sẵn sàng. Hãy cùng cài đặt CLI và cấu hình môi trường cô lập đầu tiên của bạn.

Tải file nhị phân chính thức trên Linux, hoặc dùng Homebrew trên macOS (brew install loft-sh/tap/vcluster):

# Tải và cài đặt file nhị phân vCluster CLI (Linux amd64)
curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-amd64"
chmod +x vcluster
sudo mv vcluster /usr/local/bin/vcluster

# Xác minh cài đặt nhị phân thành công
vcluster --version

Đảm bảo host context của bạn đang trỏ tới cụm mục tiêu nơi bạn có quyền ở cấp namespace:

# Kiểm tra host context hiện tại và danh sách node
kubectl config current-context
kubectl get nodes

Tiếp theo, khởi tạo một cụm ảo có tên dev-alpha bên trong host namespace team-alpha. CLI sẽ tự động xử lý việc tạo namespace, triển khai control plane và cấu hình định tuyến kubeconfig cục bộ:

# Khởi tạo cụm ảo và chuyển context đang hoạt động
vcluster create dev-alpha -n team-alpha --connect

Bên dưới hậu trường, câu lệnh duy nhất này thực hiện tuần tự bốn bước riêng biệt:

  1. Tạo host namespace mục tiêu (team-alpha) nếu nó chưa tồn tại.
  2. Khởi chạy một StatefulSet gọn nhẹ chứa K3s API server, controller manager và syncer.
  3. Thêm trực tiếp một context mới (vcluster_dev-alpha_team-alpha_...) vào file ~/.kube/config trên máy bạn.
  4. Thiết lập tiến trình port-forward chạy ngầm để định tuyến các lệnh kubectl từ máy cục bộ thẳng vào virtual API server.

Cấu hình

Các thiết lập mặc định rất phù hợp cho thử nghiệm cục bộ. Tuy nhiên, môi trường staging chuẩn production đòi hỏi ranh giới tài nguyên rõ ràng và các quy tắc đồng bộ xác định được khai báo thông qua file values.yaml.

Lưu cấu hình Helm sau để quản lý các quy tắc đồng bộ, dung lượng tài nguyên cho control plane và tự động xuất thông tin xác thực:

# vcluster-values.yaml
sync:
  nodes:
    enabled: false # Giả lập node để tránh lộ thông tin node của cụm host
  persistentvolumes:
    enabled: true
  ingresses:
    enabled: true
  services:
    enabled: true

# Sử dụng K3s gọn nhẹ để tối ưu hóa lượng RAM tiêu thụ
controlPlane:
  distro:
    k3s:
      enabled: true
      image:
        tag: "v1.30.2-k3s1"

# Giữ mức tiêu thụ tài nguyên của control plane ở mức tối thiểu (khoảng 250MB RAM khi rảnh rỗi)
resources:
  limits:
    cpu: "1000m"
    memory: "1024Mi"
  requests:
    cpu: "200m"
    memory: "256Mi"

# Tự động xuất kubeconfig độc lập cho các runner CI/CD
exportKubeConfig:
  declare:
    path: "./kubeconfig-alpha.yaml"

Triển khai hoặc cập nhật cụm ảo bằng các thiết lập mang tính khai báo này:

vcluster create dev-alpha \
  --namespace team-alpha \
  --values vcluster-values.yaml \
  --connect=false

Đối với các quy trình tự động hóa như GitLab CI, GitHub Actions hoặc Argo workflows, bạn có thể xuất thông tin xác thực độc lập mà không cần mở một phiên tương tác:

# Xuất thông tin xác thực client độc lập ra file riêng
vcluster connect dev-alpha -n team-alpha --update-current-context=false --kube-config ./dev-alpha.kubeconfig

# Truy vấn trực tiếp cụm ảo độc lập
kubectl --kubeconfig=./dev-alpha.kubeconfig get namespaces

Các kỹ sư làm việc bên trong phạm vi này có toàn quyền quản trị. Họ có thể cài đặt Knative, thử nghiệm Prometheus operator, hoặc gán cluster role mà không sợ ảnh hưởng đến khối lượng công việc lân cận, đồng thời không cần xin quyền cluster-admin trên cụm máy chủ vật lý.

Xác minh & Giám sát

Để đánh giá cụm ảo, bạn cần hiểu rõ tầng chuyển đổi (translation layer). Bạn cần xác minh cách các thực thể ảo ánh xạ sang tài nguyên tính toán vật lý thực tế.

Kết nối tới virtual context và khởi chạy một deployment thử nghiệm gọn nhẹ:

# Chuyển sang virtual context dev-alpha
vcluster connect dev-alpha -n team-alpha

# Khởi chạy một deployment thử nghiệm trong virtual namespace tùy chỉnh
kubectl create namespace frontend
kubectl create deployment web --image=nginx:alpine -n frontend --replicas=2

# Kiểm tra trạng thái workload ảo
kubectl get pods -n frontend

Bạn sẽ thấy hai pod báo trạng thái healthy trong virtual namespace frontend. Giờ hãy chuyển về host context để kiểm tra trạng thái thực thi thực tế:

# Quay trở lại context của cụm host
kubectl config use-context your-host-cluster-context

# Xem các pod vật lý đã được ánh xạ
kubectl get pods -n team-alpha

Cụm host không hề có namespace frontend. Thay vào đó, bạn sẽ thấy các pod mang tên web-x-frontend-x-dev-alpha đang chạy song song với StatefulSet dev-alpha-0. Bộ syncer tự động chuyển đổi tên và liên kết container vào hạ tầng mạng của host node, đồng thời ngăn chặn mọi xung đột metadata.

Để chẩn đoán các điểm nghẽn chuyển đổi hoặc tài nguyên bị từ chối, bạn có thể xem trực tiếp log từ container syncer:

# Xem log luồng chuyển đổi tài nguyên theo thời gian thực
kubectl logs -n team-alpha dev-alpha-0 -c syncer --tail=50 -f

Hãy theo dõi ba tín hiệu trọng yếu trên dashboard Grafana của bạn:

  • Lỗi Syncer tăng đột biến (Syncer Error Spikes): Số lượng lỗi cao cảnh báo rằng chính sách PodSecurity hoặc admission webhook ở cấp host đang chặn các pod đã được chuyển đổi.
  • Hạn ngạch Namespace trên Host (Host Namespace Quotas): Luôn áp dụng các quy tắc ResourceQuota và LimitRange tiêu chuẩn cho host namespace team-alpha. Điều này giúp ngăn chặn các script test chạy mất kiểm soát làm cạn kiệt CPU hoặc RAM của node.
  • Độ trễ Data Store (Data Store Latency): Theo dõi các chỉ số I/O đĩa trên persistent volume gắn với dev-alpha-0, đặc biệt khi chạy các bộ test gửi dồn dập các thao tác ghi đồng thời vào SQLite.

Khi quá trình xác thực tính năng hoàn tất, việc dọn dẹp chỉ mất đúng một câu lệnh:

vcluster delete dev-alpha -n team-alpha

Host namespace sẽ được dọn sạch ngay lập tức, không để lại CRD rác, và chi phí đám mây ngừng phát sinh ngay khi quá trình kiểm thử kết thúc.

Share: