Camel K(=Kubernetes × Operator × EIP)の紹介

こんにちはRed Hatの Fuse/AMQ(Apache Camel/ActiveMQ/Kafka) のテクニカルサポート担当の山下です。

今回はCamel Kを紹介する Nicola Ferraro氏のブログの翻訳です。Camel Kというのは、Kubernetes上でネイティブに動作し、サーバレスおよびマイクロサービスアーキテクチャに特化してデザインされた、EIP(エンタープライズインテグレーションパターン)を実現するインテグレーションフレームワークです。Apache Camelのサブプロジェクトとしてその次世代を担うべく開発されています。

Camel Kの実体は、EIPの定義(Camel DSL)を解釈して、各種のKubernetesのリソースを生成するCamel K Operatorというものです。これは運用管理者を自動化するという一般的なオペレーターのコンセプトに比べてよりインテリジェントであり、オペレーターの利用を次のレベルに引き上げようとするものです。

原文はこちら: Introducing Camel K

あんまり翻訳がうまくないのは許してください (^^;


Camel K

ほんの数ヶ月前(訳注:2018/10月時点)に、Apache Camelの一部となる新しいプロジェクトについて議論していました。インテグレーションを扱う方法を変える可能性を秘めたプロジェクト。そのプロジェクトは今ここにあり、それは「Apache Camel K」と呼ばれています。

名前の「K」は、おそらくお気づきのように、Kubernetesからの引用であることは明白です。しかし、それほど明白でないかもしれませんが、サーバーレスアプリケーションのための共通のビルディングブロックのセットを提供することを目標とするコミュニティプロジェクトである、Knativeからの引用でもあります。そう、「サーバーレス」がCamel Kの多くのアーキテクチャ上の決定に影響を与えている基本的な考え方です。

1歩ずつ進めましょう。

「Camel K」とは何か

Apache Camel Kは、Apache Camelフレームワークに基づいた軽量のクラウド統合プラットフォームです。これはKubernetesとOpenshift上でネイティブに動作し、特にサーバーレスアーキテクチャとマイクロサービスアーキテクチャ向けに設計されています。私が「動作する」と言うとき、「それは動作する。今やれる!」という意味です。 Githubのプロジェクトのホームページにアクセスして、手順に従ってみてください:https://github.com/apache/camel-k

これは「オペレーターパターン」に基づいており、OperatorSDK を利用してKubernetesリソース(標準のものに加えてカスタムリソースも定義)に対して操作を実行します。オペレーターはGoで書かれている一方で、ランタイムはJVMベースで、Apache Camelですでに利用可能な200以上のコンポーネントをすべて活用できます。

KubernetesやOpenShiftのように、Knativeも近い将来のターゲットプラットフォームになるでしょう。とりわけ、Knative EventingKnative Servingのビルディングブロックが十分な成熟度に達した時にそれらを完全にサポートするために、その開発を常に把握しています。

Camel Kはインテグレーションを次のレベルに引き上げますが、同時にCamelプロジェクトのルーツであるエンタープライズインテグレーションパターン(EIP)への回帰でもあります。 Camelは、プロジェクト開始以来、エンタープライズインテグレーションパターンを中心に形作られ、そして開発者はパターンと1:1の関係でマッピングされるDSLを作成してきました。

Camel DSLはEIPのランゲージといっても過言ではありません。少なくとも私の意見では、当初のEIPの本に存在していたパターンを表現するだけでなく、コミュニティによって追加されたパターンも表現します。そしてコミュニティは、リリースごとに新しいパターンとコンポーネントを追加し続けています。

Camel Kのアイデアはシンプルに述べられます:「強力なCamel DSLを用いて表現したエンタープライズインテグレーションパターンをネイティブにKubernetes上で利用できる」ようにする。

Camel Kのアーキテクチャの概要を説明すると次の図のようになります:

f:id:tyamashi-oss:20190201181953p:plain

Camel Kは、フレームワークの残りの部分からインテグレーションDSLを蒸留して得られるもので、クラウドプラットフォーム上で直接実行されるインテグレーションコードを書く方法を提供します。それはKubernetesやOpenshiftのような「最新の」クラウドプラットフォームかもしれませんし、あるいはサーバーレスのワークロード用のKnativeのような「未来的なクラウドプラットフォーム(KnativeはOpenShiftとKubernetesの両方で実行でき、Istioが搭載されています)かもしれません。

どのように動くのか

技術的にいえば、出発点は実行したいインテグレーションコードを書くことです。例えば:

File: integrate.groovy

// メッセージをKafkaトピックにルーティングするRestのエンドポイントを公開
rest().post("/resources")
  .route()
    .to("kafka:messages")
    
// Kafkaからのすべてのメッセージを変換してHTTPエンドポイントに投げる
from("kafka:messages")
  .transform()... // 何らかの変換
  .to("http://myendpoint/messages")

インテグレーションは、単純なtimer-to-logダミーの例から、複数の外部システムを接続する複雑なワークフロー処理まで多岐にわたるものの、それらは同じCamel DSLを使用できます。

実のところ、私は「ある1つ」のCamel DSLについて話しましたが、中にはCamel DSLは固有のスタンドアロン言語ではなく、複数のプログラミング言語で使用できるプリミティブのセットであることをすでに知っている人もいるでしょう。これまでのところ以下の言語をサポートしています。

  • Groovy:これはおそらくスクリプト作成に最適な言語であり、現在はCamel Kのインテグレーションコードを書くための推奨言語です
  • Kotlin:Groovyと同様の体験を提供するKotlinもサポートしています
  • Java:あなた方の多くがすでに知っているクラシックなCamel DSLです
  • XML:これもまたクラシックな Camel DSLの適用であり、すでに存在するビジュアル編集ツールを使用する場合には最も良い結果をもたらします
  • JavaScript:はい、同様にサポートしています

あまり複雑にしすぎないように、最も単純なインテグレーションを考えてみましょう。古典的な「Camel Hello World」です:

File: hello.groovy

from("timer:tick?period=3s")
  .setBody().constant("Hello World from Camel K!!!")
  .to("log:message")

クラウドプラットフォーム上でこのインテグレーションを実行したい場合は、Camel K Githubリポジトリのリリースページにある小さなバイナリファイルをダウンロードする必要があります。それはKamelと呼ばれます。

kamelバイナリには、インテグレーションを実行するためにKubernetesクラスタを準備するためのコマンドも含まれています。とにかく動かしましょう:

kamel install

これはCamel K CRDのインストール、Privilegeの設定、そしてカレントネームスペース内へのオペレーターの作成(次を参照)を行います。

重要:一部のクラスタ構成では、CRDをインストールするためにクラスタ管理者になる必要があります(これはクラスタ全体に対して一度だけ実行されるべき操作です)。 kamelバイナリがトラブルシューティングに役立ちます。 MinishiftやMinikubeのような開発クラスターで作業したい場合は、devクラスターセットアップガイドに従ってください。

クラスタが準備され、オペレータが現在のネームスペースにインストールされたら:

kamel run hello.groovy

これで、完了!

これは、水面下で起こっていることです: f:id:tyamashi-oss:20190201181949p:plain

kamelツールは、カレントネームスペース内の(ファイル名の後に)helloという、KindがIntegrationのKubernetesカスタムリソースと、コードを同期します。

Camel K Operatorは、インテグレーションを実行するために必要なすべてのKubernetesリソースを設定して、可能にするコンポーネントです。これについては後で詳しく説明します。

ユーザーがインテグレーションをインクリメンタルに作成し、即座にビルドレスリデプロイを可能にするdev modeもあります。デモのほうが1000倍わかりやすいでしょう。

デモ

次のビデオはCamel Kでできることの例を示しています。これは、Minishift devクラスタへのインストールから始まり、基本的なクイックスタートの実行方法を示しています。そしてより複雑な例へと進みます。

ビデオに表示されている2番目のインテグレーションは、テレグラムボット(携帯電話のテレグラムアプリを通して対話することができる)を、メッセージをバッファリングしそれらを制御するKafkaトピックに接続するものです。メッセージはKafkaから再び受信され、Apache Camelに用意されている基本的なエンタープライズインテグレーションパターンの1つを通してフィルタリングされ、外部のHTTPSエンドポイントに転送されます。

これらは約7分のビデオで行われ、すべてのインテグレーションは段階的に作成されます。Camel Kの背後にある新しいビルドエンジンを利用すると、変更のたびにわずか1秒でインテグレーションを再デプロイします。

見てください:

(訳注:声や音がない動画になっていますが何をしているかは理解できると思います。マウスポインタから意図を伝える能力に感動すらおぼえますw)

「オペレーター」を次のレベルへ

Operator SDKは、「Camel DSLスクリプト」の実行に必要なすべてのKubernetesリソースを作成することを可能にするフレームワークです。

一般に、オペレーターはKubernetesとOpenshiftにアプリケーションやプラットフォームをインストールして設定するために使用されます。これは、かつてアプリケーションをレガシー環境にインストールし、アプリケーションを実行するためのすべてが適切に機能しているかどうかを確認していた「人間による運用」のデジタル版です。

Camel Kでは、この概念を次のレベルに引き上げました。オペレーターは「インテリジェント」で、あなたが実行したいものを知っています。それはCamel DSLを理解できるのです。

したがって、たとえば、Camel REST DSLを使用してRESTエンドポイントを定義する場合、オペレーターはインテグレーションが外部に公開されていることを確認し、それを公開するためのOpenShiftのサービスとルート、あるいはVanilla KubernetesであればIngressを作成します。

将来はより多くの責務を果たすことでしょう。

  • KubernetesでWebhookを公開し、データを受信するために外部プロバイダへのWebhook登録をアクティベートするでしょう
  • インテグレーションで管理する必要があるフィードをサブスクライブするでしょう
  • リソースの利用を最適化するために、「ポーリング」ルートをKubernetes Cronjobsに変換するでしょう
  • ルートがそれをサポートしている場合、水面下で最適化されたCamelのランタイムプラットフォームを使用するでしょう
  • そしてその他、たくさんの役に立つことをするでしょう!

オペレーターは、運用に関する操作を気にせずに、インテグレーションを「Camel DSLスクリプト」で記述するだけで済むようにします。それが私たちの「インテリジェントオペレーター」の意味するところです。

What's next?

たくさんのことが起こるでしょう。githubリポジトリのプロジェクトセクションを更新し続けます。これらには、既に説明したKnativeに関する作業と、Camel KのためのWeb UIも含まれています。本当にロックだ!

コントリビューション(貢献)を歓迎します!プロジェクトに興味があるなら、コントリビューションする多くの方法があります。

詳細については、専用のGitterルームでお会いしましょう。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。