KubeVela とは? – アーキテクチャのご紹介

こんにちは。サイオステクノロジーの塙です。

今回は、CNCFのincubating projectsであるKubeVelaについて紹介したいと思います。

KubeVelaに興味を持った経緯としては、先日拝見したブログにKubeVelaとChatGPTとの統合が紹介されており、どのように実現しているのか、また、KubeVelaとはどんなソリューションなのか気になったので調べてみようと思いました。

KubeVelaとは?

KubeVelaは、様々なインフラ環境に対応したアプリケーションのデプロイを行うプラットフォームです。

CDツールとしての側面を備えており、アプリケーションのデプロイ、運用を効率化することが出来るみたいです。

JenkinsなどのCIツールとの統合機能も備わっています。

また、docker環境でいうdocker-composeのようなイメージを持つこともでき、k8sのPod, Service, Deploymentなどの複雑なリソースの概念を意識せずに運用することが可能です。

それぞれ以下の利点が考えられます。

  • 開発者:インフラ環境を意識せずにアプリケーション開発に労力を割ける。
  • 運用者:KubeVelaの定義を再利用可能なテンプレートとして登録し、アプリケーションの配信における標準化が見込める。

KubeVela – アーキテクチャ

KubeVelaの基本的なアーキテクチャは以下のとおりです。他に細かい部分はありますが割愛しています。

そして、KubeVelaはコントロールプレーンとしての役割があり、KubeVela API処理、Workflowのオーケストレーション、リビジョン管理などを制御します。

Open Application Model (OAM)

k8sベースを前提とすると、k8sを導入しているユーザでも開発者がk8sの概念を理解し、ワークロードの開発を行っていきます。

そして、その後の管理は運用者が担当するといったケースでは、開発者側のやることがどうしても多くなってしまいがちです。

この負担を軽減するためにOAMというモデルが出てきました。

OAMは、クラウドネイティブなアプリケーションの構成、依存関係などコンポーネントの定義を提供する仕様となっています。

これは、アプリケーションの構成やインフラの選定などを標準化することにより、一貫した運用をしやすいようにする目的と解釈しています。

その特徴として、定義の部品化による拡張性であったり、ベンダーに非依存というものがあります。

OAMの詳細については、以下が参考になります。

https://github.com/oam-dev/spec

 

Application

ここでは、一般的なアプリケーションという用語と差別化するために、KubeVelaで使用されているものは‘Application’の表記にしています。

Applicationは、上記で説明しているアプリケーションの構成、依存関係などをOAMに従って定義したものとなります。

Applicationの定義については、以下のとおりです。

  • Component(s):
    一般的にいうアプリケーション・サービスの種別を指している。
    通常、デプロイするサービス種別に応じて、コンテナイメージ先や後述のTraitsの設定を行う。
  • Traits:
    TraitsはComponentに付随する動作を決定します。
    例えば、ingressの設定や、スケーリングの設定などがあります。
  • Policy:
    デプロイ前に実施するポリシーとなります。
    適用範囲としては、Component単位ではなく、Application全体に掛かるものになっています。
  • Workflow:
    パイプライン形式でデプロイのステップを定義します。
    デプロイ方式を変更したり、承認フェーズを作成したりなどが出来ます。

開発者は用意された定義に従い、リソースを作成する流れとなっています。

 

Addons

すぐに使用出来るコミュニティのアドオンがあります。

メジャーなものとして、UIとなるVelaUXはアドオンとして提供されています。

Kubevela – Community Verified Addons

https://github.com/kubevela/catalog/tree/master/addons

アドオンのカスタマイズも可能です。詳細は、以下が参考になります。

KubeVela – Make Your Own Addon

 

Cluster Gateway

k8s APIトラフィックを複数のk8sクラスターにルーティングするためのゲートウェイ APIサーバーになります。

k8s マルチクラスタに対応しており、アーキテクチャ図のKubeVela→k8s Cluster間のアクセスを受け持ちます。

詳細は、以下が参考になります。

https://github.com/oam-dev/cluster-gateway

Applicationの定義について

Applicationの構成については、上記で説明しました。

では、実際にどのように定義していくのか例を見てみます。

apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: <name>
spec:
  components:
    - name: <component name>
      type: <component type>
      properties:
        <parameter values>
      traits:
        - type: <trait type>
          properties:
            <traits parameter values>
    - name: <component name>
      ...(snip)...
  policies:
    - name: <policy name>
      type: <policy type>
      properties:
        <policy parameter values>
  workflow:
    - name: <step name>
      type: <step type>
      properties:
        <step parameter values> 

(KubeVela – Core Conceptsより引用)

基本的な形式は、k8sのCRDと同じようにyaml形式で記述していきます。

spec以下にcomponents, traits, policies, workflowの記述を行っていきます。Traitsは前述しているようにComponentに付随する動作なのでインデントを下げて定義しています。

各定義についての詳細は、いくつかビルトインのものもあるので、以下が参考になります。

KubeVela – Built-in Component Type

KubeVela – Built-in Trait Type

KubeVela – Built-in Policy Type

VelaUX

VelaUXはKubeVelaのUIを提供している。

また、VelaUXはアドオンとして提供されており、インストール後にユーザ側で有効化することで使用が可能です。

$ vela addon enable velaux

 

VelaUXには、k8sサービスと連携する3つのサービスタイプがあります。

  • ClusterIP:デフォルトの設定
  • LoadBalancer:クラスタのロードバランサーを利用
  • NodePort:k8sノードのIP/ポートにアクセス出来る必要がある

また、VelaUXでは、カスタムドメインや、バックエンドDBの変更、イメージリポジトリの指定などいくつかのカスタマイズも可能です。

詳細については、以下が参考になります。

KubeVela – VelaUX

CUE言語

KubeVelaで定義のカスタマイズをするには、CUE言語をベースに宣言していきます。

■ CUE言語(以下、CUE)

簡単にCUEの特徴は以下のとおりです。

  • json形式で、jsonよりも使い勝手が良いとされてます
  • Go向けのAPIが提供されている
  • json, yaml出力に対応

 

CUEには、CLIが用意されており、作成した.cueファイルにいくつかのコマンドを実施することが可能みたいです。

例えば、スキーマチェック、レンダリングなどでファイルの正当性が確認出来ます。

CUEでのカスタマイズ例は以下のとおりです。

# CUEでのカスタマイズ例
webserver: {
    type: "component"
    attributes: {}
}
template: {
    parameter: {
        name:  string
        image: string
    }
    output: {
        apiVersion: "apps/v1"
        kind:       "Deployment"
        spec: {
            containers: [{
                name:  parameter.name
                image: parameter.image
            }]
        }
    }
}

カスタマイズ

  • type:定義(Component, policy…)の種類
  • parameter:入力の定義
  • output:出力の定義

この例では、webserverというComponentを用意し後のtemplateに使用するパターンです。

outputとして記述した箇所が最終的なCRDとして出力されます。

 

詳細については、以下が参考になります。

KubeVela – CUE Basic

CUE – Document

まとめ

今回は、KubeVelaのアーキテクチャについてまとめてみました。

CDツールとしては、argoCDなどとの差異化があるかどうか気になるところです。

k8sの概念を気にせず、docker-composeのようにアプリケーションのデプロイを行える点は、作業が楽になって良い点と思いました。

本書の記載が読者のお役に立てれば幸いです。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です