ちょっと話題の記事

汎用プログラミング言語でKubernetesのYAMLを生成するcdk8sが発表されました!

最近めっちゃ盛り上がっているAWSインフラをプログラミング言語で作成するAWS CDKですが、それのKubernetes版といえるcdk8sの紹介記事です。概要掴んで頂いた後、ウェビナーみたりGetting Startedやってもらって、その威力を味わっていただければ。
2020.05.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「TypeScriptでKubernetesのYAMLを生成できるよ!そうcdk8sならね」

というわけで、先日AWSより突然、cdk8sなるものが発表されました。

Introducing the CDK for Kubernetes, a New Software Development Framework and Open Source Project for Defining Kubernetes Applications Using Code

正直最初これを見たときの第一印象は「なんて安易なネーミングなんや…」でしたが、見れば見るほど、KubernetesのYAMLをそのまま管理する辛さに対しての別次元のアプローチとして、すごい斬新で期待感が持てたので、意気揚々とブログを書いております。この記事では、cdk8sの特徴とそれが解決してくれること、および関連リソースをまとめてます。ぜひ、その可能性を感じ取っていただきつつ、Getting Started試していただければ。

我々はYAML地獄から解き放たれるのか…!!

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

はてさて、どうでしょう。

cdk8sとは

公式紹介ブログはこちら。

Introducing CDK for Kubernetes | Containers

cdk8sで出来ることを単純に定義すると、以下の図に集約されます。シンプル!

以下、公式ブログの内容を紐解きながら、自分の理解をざっくり書いていきます。

Kubernetesの運用におけるYAMLの課題

Kubernetesの大きな特徴として、統一的なYAMLによるインフラの管理が挙げられます。Infrastructure as Codeの文脈で語られることも多いですが、YAMLファイルを定義してそれをクラスタにapplyすることで、コードベースでインフラ(Kubernetesクラスタ)全体を統一的に管理できます。

冪等性を持った構造化テキストファイルを元にクラスタ全体を管理することが出来るので、クラスタ運用のパイプライン実装による自動化が容易であったり、開発チームへのインフラ操作権限委譲がやりやすいなど多くのメリットがあります。

ただ、本格的にクラスタを運用していくと多数のYAMLファイルを定義し管理する必要があり、アプリケーションの成長に伴い加速度的にYAMLファイル自体の管理や他者へのスキルトランスファーが難しくなっていくという問題がありました。そもそも、YAMLは優れた構造化フォーマットですが、ロジックや再利用可能な表現をするための機能を持っていません。

cdk8sが解決してくれること

これらの問題について、既にAWSのインフラを構築するためにAWSがリリースし開発している、AWS Cloud Developmnet Kit(AWS CDK)が利用できることに気づきました。

CDK for Kubernetes(cdk8s)は、TypeScriptやPythonなどのプログラミング言語でKubernetesのYAMLを生成できます。

いろんなクラスターで動く

cdk8sの責任範囲はYAMLの生成までなので、AWSが提供しているEKSだけではなく、オンプレミスや他のパブリッククラウドなど、全てのKubernetesクラスターが適用対象となります。汎用的なプログラミング言語をベースとなっているため従来のIDEやツールを利用可能で、YAMLを直接管理〜運用するより、より高次元のレベルでKubernetesクラスタを管理することができます。

命令的言語からの宣言的状態へのアプローチ

cdk8sは命令的言語を使って書かれていますが、出力されるYAMLは宣言的なものです。つまりは、従来からある宣言的アプローチによる堅牢性を維持したまま、命令的表現によるプログラミング言語ならではのアプローチを楽しむことができます。

任意のKubernetes APIのバージョンとCRD(カスタムリソース)を利用可能

cdk8sは、出力するYAMLのKubernetesクラスターバージョンを指定する方法があります。また、カスタムリソース定義をインポートすることも可能です。

複数言語のサポート

TypeScript、JavaScript、Pythonに対応しています。将来的にはGo言語のサポートもロードマップに含まれます。

cdk8s関連各種リソース

その他全体的な特徴は、上で紹介したAWSブログを見てもらえればと思いますが、その他のcdk8s関連リソースをまとめます。

公式ページ

Contributors and maintainers are governed by the CNCF Code of Conduct

cdk8sの公式トップページです。ツールの概要と各種リソースへのリンクがあります。公式ページみてて思ったのは、ページ最下部に以下の記述があったこと。

Contributors and maintainers are governed by the CNCF Code of Conduct

ということで、CNCFのCoCに基づいて運用されるということですね。現在、awslabsに格納されているツール群の中でこれは珍しいと思います。

GitHub

awslabs/cdk8s: Define Kubernetes native apps and abstractions using object-oriented programming

1番メインとなるページ。Getting Startedや、ロードマップなども全てここで管理されてます。

Getting Started

なにはなくとも手で動かさないとわかんないぜ!という方も多いですよね。現在、TypeScriptとPython用のGetting Startedが用意されています。

TypeScriptでちょっと試してみましたが、Kubernetes界隈のリソースをコード補完しながら定義していける感覚は、超新鮮!よござんすな。

Roadmap

Roadmap

ロードマップもGitHub上で公開されています。Import Helm Chartsなんてのもアガってますね。

cdk8s cli

cdk8s/README.md at v0.21.0 · awslabs/cdk8s

Library

cdk8s

とっかかりに良いWebinar

CNCF Member Webinar: End YAML engineering with cdk8s! - Cloud Native Computing Foundation

先日、CNCFのWebinarで、cdk8sが紹介されていました。自分も一通り見てたのですが、cdk8sが解決しようとしていること、実際のライブコーディングによるデモやQ&Aなども全て収録されているので参考になると思います。

cdk8sはKubernetesYAML管理のデファクトスタンダードになるか

もともとKubernetesのマニフェストファイルについては、その管理ツールとして様々な手段が提供されていました(kustomize, jsonnet, jkcfg, kubecfg, kubegen, Pulume)。

cdk8sは、最近AWSインフラの定義において非常に存在感を増しているAWS CDKの思想が元になっているのが大きな特徴と言えます。最近ウチのチームでも、主にサーバーレス周辺のリソースでは、CDKを使ってインフラをコード化し管理することがデフォルトになりつつあります。

まだ、αリリースの段階ではありますが、AWS CDKなみの盛り上がりを見せてくると、次代のKubernetesのYAML管理のデファクトスタンダードになり得る可能性も秘めていると思っています。今後の展開に注目ですな。

それでは、今日はこのへんで。濱田(@hamako9999)でした。