KubernetesへのKubeVelaデプロイ:Open Application Model(OAM)によるモダンなアプリケーションデリバリー

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

背景と理由 — 私のアプローチを変えた深夜2時のデプロイ悪夢

3ヶ月前の深夜2時、Slackが突然鳴り響いた。本番環境の決済サービスがクラッシュしていたが、ステージング環境はまったく正常だった。環境間のKubernetesマニフェストをdiffしたところ、原因が判明した。ステージングはresources.limits.memory: 256Mi、本番は512Miだったのだ。2週間前に誰かが本番の設定を手動でパッチしており、トラフィックスパイクが来るまで誰も気づかなかった。

このインシデントが、私にKubeVelaの必要性を痛感させた出来事だった。環境ドリフト——ステージング、本番、オンプレクラスターが時間の経過とともに少しずつズレていく現象——は、Kubernetesの障害モードの中でも最も多くの本番インシデントを静かに引き起こしている。地味な問題だが、解決すれば状況が一変する。

KubeVelaはKubernetes上にOpen Application Model(OAM)仕様を実装したCNCFプロジェクトだ。このアーキテクチャは明確な分離線を引く。何をデプロイするかはアプリ開発者の関心事であり、どのようにデプロイするかはプラットフォームチームの領域だ。OAMはこの分離を4つのプリミティブとして定義している:

  • Component — アプリの正体(Webサービス、ワーカー、データベースなど)
  • Trait — アプリが必要とするもの(オートスケーリング、Ingress、サイドカーインジェクション)
  • Policy — デプロイ先と方法(環境固有のオーバーライド、マルチクラスター配置)
  • Workflow — デプロイ手順(カナリア、承認ゲート、プログレッシブロールアウト)

結果として、1つのApplication定義で開発、ステージング、本番、クラウド、オンプレミスへ一貫したデプロイが実現する——環境ごとに別々のYAMLファイルを管理する必要はない。

インストール

前提条件

稼働中のKubernetesクラスター(1.22以降)、設定済みのkubectl、そしてHelm 3.xが必要だ。EKS、GKE、AKS、k3s、ベアメタルなど、どの構成でも動作する。

KubeVela CLIのインストール

curl -fsSl https://kubevela.io/script/install.sh | bash
vela version

再現性のために特定バージョンを固定する場合:

curl -fsSl https://kubevela.io/script/install.sh | bash -s 1.9.0

クラスターへのKubeVela Coreインストール

helm repo add kubevela https://kubevela.github.io/charts
helm repo update
helm install --create-namespace -n vela-system kubevela kubevela/vela-core

しばらく待ってから、すべてが起動していることを確認する:

kubectl wait --for=condition=Ready pods --all -n vela-system --timeout=300s
kubectl get pods -n vela-system

kubevela-vela-coreコントローラーとcluster-gatewayポッドが両方Runningになっていれば成功だ。Web UIも使いたい場合は、VelaUXアドオンを有効化する:

vela addon enable velaux

設定 — 1つのApp仕様、すべての環境に対応

最初のOAMアプリケーションの定義

あの夜、これがあれば助かっていたというものがこれだ。ステージングと本番用に別々のYAMLファイルを管理する代わりに、環境固有のパッチを含む1つのApplicationを定義する:

# 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

本番の設定値(memory: 512Mi、3レプリカ)が唯一の信頼できる情報源だ。ステージングは差分だけをパッチする名前付きポリシーを持つ。ドリフトなし、想定外なし。

デプロイする:

kubectl apply -f payment-service.yaml

マルチクラスターデプロイ

クラウドとオンプレのクラスターを両方運用している場合は、まずKubeVelaのクラスターマネージャーに登録する:

vela cluster join /path/to/prod-kubeconfig --name prod-cluster
vela cluster join /path/to/dr-kubeconfig --name dr-cluster
vela cluster list

次に、Applicationにtopologyポリシーを追加する:

  policies:
    - name: multi-cluster
      type: topology
      properties:
        clusters:
          - prod-cluster
          - dr-cluster
        namespace: production

Workflowによる承認ゲートの追加

このWorkflow機能のおかげで、何度か失敗のプッシュを防げた。ステージングと本番の間に必須の承認ステップを挿入する:

  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

実行はtype: suspendで停止する。ステージングが正常であることを確認したら、再開する:

vela workflow resume payment-service -n production

深夜2時に本番前の必須チェックポイントを設けることは過剰な心配ではない——軽微なインシデントと重大な障害の差がそこにある。

検証とモニタリング

アプリケーションの健全性確認

1つのコマンドで全体像が把握できる:

vela status payment-service -n production

コンポーネントごと、すべてのクラスターにわたって健全性が表示される:

概要:
  名前:      payment-service
  名前空間: production

サービス:
  - 名前: payment-api
    クラスター: prod-cluster  名前空間: production
    タイプ: webservice
    正常 準備完了:3/3
    Traits:
      ✅ scaler
      ✅ gateway

ログとポートフォワーディング

Pod名を探し回ることなく、特定コンポーネントのログをストリーミングする:

vela logs payment-service --component payment-api -n production

インターネットに公開せずにAPIにローカルアクセスしたい場合:

vela port-forward payment-service -n production

Webダッシュボード

VelaUXを有効化済みなら、ダッシュボードを表示する:

vela port-forward -n vela-system addon-velaux 8080:80

http://localhost:8080を開くと、すべてのアプリケーション、ワークフロー状態、クラスター、コンポーネント履歴をビジュアルマップで確認できる。深夜3時にマルチクラスターのインシデントが発生したとき、ダッシュボードはkubectlの出力をスクロールするより断然便利だ。

Prometheusメトリクス

本番環境のオブザーバビリティのために、KubeVelaはコントローラーのメトリクスを公開している。コントローラーにポートフォワードして確認する:

kubectl port-forward -n vela-system deployment/kubevela-vela-core 8080:8080
curl http://localhost:8080/metrics | grep vela_

アラートを設定すべき3つのメトリクス:

  • vela_application_phase — 各アプリの現在フェーズ(running、failed、stopped)
  • vela_reconcile_duration_seconds — 調整レイテンシ(スパイクはクラスターの負荷を示す)
  • vela_reconcile_errors_total — 累積エラー数(増加し続けるカウンターは調査が必要)

これらをGrafanaに連携すれば、手探り状態から脱却できる。Podの健全性だけでなく、コミットからクラスターまでのデリバリーパイプライン全体の完全な可視性が手に入る。

3ヶ月前にこれが整っていれば、メモリの不一致が本番環境に到達することはなかった。トラフィックスパイクが来るずっと前に、設定ドリフトのアラートが発火していたはずだ。それがKubeVelaの真の価値だ——単なるツールではなく、設計によって組み込まれた運用の規律である。

Share: