Triển khai KubeVela trên Kubernetes: Phân phối ứng dụng hiện đại với Open Application Model (OAM)

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

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.

Share: