Bối cảnh & Lý do — Sự cố triển khai lúc 2 giờ sáng thay đổi cách tôi làm việc
Ba tháng trước, lúc 2 giờ sáng, Slack rộ lên. Dịch vụ thanh toán vừa crash trên production, trong khi staging vẫn chạy ngon lành. Tôi so sánh Kubernetes manifest giữa hai môi trường và tìm ra nguyên nhân: staging có resources.limits.memory: 256Mi, còn production là 512Mi. Ai đó đã chỉnh tay config production hai tuần trước và không ai phát hiện ra cho đến khi traffic tăng đột biến.
Sự cố đó là lúc tôi thực sự để ý đến KubeVela. Environment drift — khi staging, production và các on-prem cluster dần dần khác nhau theo thời gian — âm thầm gây ra nhiều sự cố production hơn hầu hết các lỗi Kubernetes khác. Không ai để ý đến nó. Nhưng khi giải quyết được thì mọi thứ thay đổi hoàn toàn.
KubeVela là một dự án CNCF triển khai đặc tả Open Application Model (OAM) trên nền Kubernetes. Kiến trúc này vạch ra ranh giới rõ ràng: triển khai cái gì là việc của developer, triển khai như thế nào là việc của platform team. OAM xây dựng sự phân tách này thành bốn thành phần cơ bản:
- Component — ứng dụng của bạn là gì (web service, worker, database)
- Trait — ứng dụng của bạn cần gì (autoscaling, ingress, sidecar injection)
- Policy — triển khai ở đâu và như thế nào (override theo môi trường, phân phối đa cluster)
- Workflow — các bước triển khai (canary, approval gate, progressive rollout)
Kết quả: một định nghĩa Application duy nhất, triển khai nhất quán trên dev, staging, production, cloud và on-prem — không cần file YAML riêng cho từng môi trường.
Cài đặt
Yêu cầu trước
Bạn cần có một Kubernetes cluster đang chạy (1.22+), kubectl đã được cấu hình, và Helm 3.x. Bất kỳ phiên bản nào cũng được — EKS, GKE, AKS, k3s, hay cài đặt bare-metal.
Cài đặt KubeVela CLI
curl -fsSl https://kubevela.io/script/install.sh | bash
vela version
Để cố định một phiên bản cụ thể nhằm đảm bảo tính nhất quán:
curl -fsSl https://kubevela.io/script/install.sh | bash -s 1.9.0
Cài đặt KubeVela Core lên Cluster
helm repo add kubevela https://kubevela.github.io/charts
helm repo update
helm install --create-namespace -n vela-system kubevela kubevela/vela-core
Đợi một chút, sau đó kiểm tra xem mọi thứ đã khởi động chưa:
kubectl wait --for=condition=Ready pods --all -n vela-system --timeout=300s
kubectl get pods -n vela-system
Bạn sẽ thấy controller kubevela-vela-core và pod cluster-gateway đều đang chạy. Muốn có giao diện web? Bật addon VelaUX:
vela addon enable velaux
Cấu hình — Một App Spec duy nhất cho mọi môi trường
Định nghĩa OAM Application đầu tiên
Đây chính xác là thứ có thể cứu tôi khỏi sự cố đêm đó. Thay vì tạo file YAML riêng cho staging và production, hãy định nghĩa một Application với các patch theo từng môi trường:
# payment-service.yaml
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: payment-service
namespace: production
spec:
components:
- name: payment-api
type: webservice
properties:
image: myregistry/payment-api:v1.2.3
port: 8080
cpu: "0.5"
memory: "512Mi"
traits:
- type: scaler
properties:
replicas: 3
- type: gateway
properties:
domain: payment.myapp.com
http:
"/": 8080
policies:
- name: staging-override
type: override
properties:
selector:
- payment-api
components:
- name: payment-api
type: webservice
properties:
cpu: "0.2"
memory: "256Mi"
traits:
- type: scaler
properties:
replicas: 1
Các giá trị production (memory: 512Mi, 3 replicas) là nguồn sự thật duy nhất. Staging có một policy riêng chỉ patch những gì khác biệt. Không còn drift, không còn bất ngờ.
Triển khai:
kubectl apply -f payment-service.yaml
Triển khai đa Cluster
Đang chạy cả cloud lẫn on-prem cluster? Đăng ký chúng với cluster manager của KubeVela trước:
vela cluster join /path/to/prod-kubeconfig --name prod-cluster
vela cluster join /path/to/dr-kubeconfig --name dr-cluster
vela cluster list
Sau đó thêm topology policy vào Application:
policies:
- name: multi-cluster
type: topology
properties:
clusters:
- prod-cluster
- dr-cluster
namespace: production
Thêm Approval Gate bằng Workflow
Tính năng workflow đã cứu tôi khỏi nhiều lần push ẩu. Thêm một bước phê duyệt bắt buộc giữa staging và production:
workflow:
steps:
- name: deploy-staging
type: deploy
properties:
policies:
- staging-override
- name: human-approval
type: suspend
- name: deploy-production
type: deploy
properties:
policies:
- multi-cluster
Quá trình sẽ dừng lại tại type: suspend. Khi staging trông ổn, tiếp tục:
vela workflow resume payment-service -n production
Lúc 2 giờ sáng, một checkpoint bắt buộc trước production không phải là hoang mang — đó là ranh giới giữa sự cố nhỏ và thảm họa lớn.
Kiểm tra & Giám sát
Kiểm tra tình trạng Application
Một lệnh duy nhất cho toàn bộ bức tranh:
vela status payment-service -n production
Lệnh này hiển thị trạng thái theo từng component, trên mọi cluster:
About:
Name: payment-service
Namespace: production
Services:
- Name: payment-api
Cluster: prod-cluster Namespace: production
Type: webservice
Healthy Ready:3/3
Traits:
✅ scaler
✅ gateway
Xem Log và Port-Forwarding
Stream log từ một component cụ thể mà không cần mò tên pod:
vela logs payment-service --component payment-api -n production
Cần gọi API nội bộ mà không muốn expose ra internet?
vela port-forward payment-service -n production
Giao diện Web Dashboard
Đã bật VelaUX rồi? Mở dashboard lên:
vela port-forward -n vela-system addon-velaux 8080:80
Truy cập http://localhost:8080 để xem bản đồ trực quan của mọi ứng dụng, trạng thái workflow, cluster và lịch sử component. Khi xảy ra sự cố đa cluster lúc 3 giờ sáng, dashboard còn hữu ích hơn nhiều so với việc cuộn qua đầu ra kubectl.
Prometheus Metrics
Để giám sát production, KubeVela expose các metrics của controller. Port-forward đến controller để xem:
kubectl port-forward -n vela-system deployment/kubevela-vela-core 8080:8080
curl http://localhost:8080/metrics | grep vela_
Ba metrics đáng cấu hình cảnh báo:
vela_application_phase— trạng thái hiện tại của mỗi ứng dụng (đang chạy, lỗi, đã dừng)vela_reconcile_duration_seconds— độ trễ reconciliation (tăng đột biến cho thấy cluster đang quá tải)vela_reconcile_errors_total— tổng số lỗi tích lũy (counter tăng liên tục cần điều tra ngay)
Kết nối các metrics này vào Grafana và bạn sẽ không còn mù quáng nữa. Toàn bộ visibility vào pipeline phân phối — không chỉ là sức khỏe pod, mà cả vòng đời từ commit đến cluster.
Nếu có thiết lập này ba tháng trước, sự chênh lệch về memory đã không bao giờ lọt được vào production. Một cảnh báo config-drift sẽ kích hoạt từ sớm trước khi traffic tăng đột biến. Đó mới là giá trị thực sự của KubeVela — không chỉ là công cụ, mà là kỷ luật vận hành được đưa vào thiết kế từ đầu.

