前回に続いて、Kubernetesのエコシステムをまとめていく。

今回は前回までのカテゴリに入らない雑多なものについて書く。 Kubernetesの上で動くものであったり、Kubernetesクラスタに対して働くものだったり。

2021/1/24更新。

セキュリティ

KubernetesクラスタやKubernetesアプリケーションのセキュリティ向上のためのツールたち。

kube-bench

kube-benchはKubernetesクラスタの設定やリソース定義にセキュリティ的な問題が無いかをCIS Kubernetes Benchmarkに沿ってチェックしてくれるコマンドラインツール。

最近話題になったAqua Security社製。

Popeye

PopeyeはKubernetesクラスタに登録されたリソース定義に潜在的な問題が無いかをスキャンしてくれるコマンドラインツール。

使われていないリソースが無いかとか、リソース制限がかかってないPodが無いかとか。

Polaris

PolarisはKubernetesのリソース定義に問題が無いかをチェックするツール。

コマンドラインツールとして実行してPopeye同様にクラスタに登録されたリソースをチェックできるほか、Kubernetesマニフェストをチェックすることもできる。 また、Polaris自身をクラスタにデプロイして、まずいリソースの登録をはじいたり、ダッシュボードでスキャン結果を確認することができる。

チェックできる内容はPopeyeと同様っぽい。

Falco

Falcosysdigを使ってコンテナなどから発行されるシステムコールやパケットをキャプチャして、怪しい挙動を検出してSlackとかFluentdにアラートしてくれるツール。

Open Policy Agent (OPA)

OPAはアクセス制御のためのポリシーエンジン。 汎用的なものなのでKubernetes専用というわけではないけど、公式サイトでKubernetesリソースのアクセス制御に使うユースケースが最初に紹介されている。

ポリシーはRegoという独自言語で柔軟に細かく書けるけど、書くの大変そう…

Kube-scan

Kube-scanOctarine社によるKubernetesクラスタのセキュリティリスクアセスメントをするツール。 クラスタ上でPodとして動作し、全Kubernetesマニフェストをスキャンして、セキュリティチェック結果をWeb GUIでレポートしてくれる。 結果は、同じくOctarine社によるKubernetes Common Configuration Scoring System (KCCSS)というCVSSのKubernetes版によってスコアリングされた0~10の数値として出る。

Kubernetesアプリケーション開発ツール

Kubernetesアプリケーションの開発やテストに役立つツールやフレームワークたち。

Draft

DraftはMicrosoft製のKubernetesアプリケーション開発ツール。

アプリケーションを普通に書いておいて、draft createというコマンドを実行すると、言語を判定して、Draft Packというフォーマットに従って自動でコンテナ化してくれる。 で、draft upを実行するとKubernetesクラスタにアプリをデプロイしてくれて、ソースを監視して、ソースを変更したらコンテナビルドと再デプロイを実行してくれる。

まだ実験的な段階だけど開発は停滞してるっぽい。

Skaffold

SkaffoldはGoogle製のubernetesアプリケーション開発ツールで、Draftとおんなじようなことができる。

コンテナのビルド処理の部分がプラガブルになっていて、Dockerの他、kanikoBazelJibも使えるし、任意のスクリプトも実行できる。 コンテナをビルドしなおさずに、動いているコンテナ内とローカルのファイルを同期することもできる。

こっちはアクティブに開発されている。

Tilt

TiltはSkaffoldのターミナルUI付いた版みたいな感じ。 パイプライン定義がPythonのサブセット(Bazelでも使われているStarlark)なのでいざとなったらスクリプティングできる。

Telepresence

TelepresenceはKubernetesクラスタ上で稼働しているPodをローカルの非コンテナプロセスで置き換えるツール。 コンテナを意識せずに従来の開発手法が使えるようになる。

具体的には、普通のPodをプロキシPodに置き換えて、Podへの通信をローカルプロセスにフォワードし、ローカルプロセスへの通信をプロキシPodにフォワードし、Podの環境変数をローカルプロセスから読めるようにし、Podにマウントされたボリュームにローカルプロセスからアクセスできるようにしてくれる。

monday

mondayはTelepresenceみたいにKubernetes上のサービスとローカルプロセスとの間の通信を双方向にフォワードしてくれるツール。 ローカルプロセスの起動とホットリロードも面倒見てくれる。

ksync

ksyncはPod内のディレクトリとローカルディレクトリを同期してくれるツール。

kube-monkey

kube-monkeyはカオステストのためにPodをランダムに消してくれるツール。 開発止まってるっぽい。

Litmus

Litmusもカオステストのツール。 godogかAnsibleでテストを書けて、テスト実行、ログの収集、レポートの生成までやってくれる。

Kuberhealthy

KuberhealthyはKubernetseクラスタやノードやアプリの健全性テストを実行する合成監視(aka. セマンティック監視)ツール。 Comcast製。

まだテスト項目はそんなになくて以下だけ。

  • ダミーのDaemonSetをデプロイして消す。
  • kubectl get componentstatuses相当の情報を確認。
  • 再起動を繰り返しているPodがいないか確認。
  • クラスタ内のDNSにクエリを投げる。

テスト結果はWeb APIからJSONで取れるほか、Prometheusのメトリクスとしてエクスポートされる。 Grafanaのダッシュボードも用意されている。

Octant

OctantはVMware製のKubernetesアプリケーション開発者向けツール。

octantコマンドを実行するとWebサーバが起動するのでそれにつなぐと、GUIで各種Kubernetesリソースを参照したり、Podへのポートフォワーディングをしたり、Podのログを見たりできる。

プラグインで機能を拡張できるらしいけど、まだプラグインは何もない模様。

Konstellate

KonstellateはOctantみたいなツールで、OctantよりGUIがかっこよくて、Kubernetesリソースの作成や編集機能に力を入れている。

リソース間の関係をネットワークビューで見れて、ドラッグアンドドロップでリソース間の関連付けを作れるところが新しい。

起動するのにClojureが要るのがちょっと難点。

K9s

K9sは各種KubernetesリソースやPodのログをリアルタイムに参照したり、リソースを編集したりできるターミナルUI。 設定ファイルでちょっとカスタマイズ出来て結構使いやすそう。

割と人気あるっぽい。

kubespy

kubespyは各種Kubernetesリソースの変化をリアルタイムで監視できるターミナルUI。 特定のリソースを指定すると、その変化のサマリを表示してくれる感じ。

特にDeployment、Pod、Serviceの監視むけっぽい。

Dapr

DaprはMicrosoft製のイベントドリブンなマイクロサービスアプリケーションのためのフレームワーク。 Kubernetesに特化しているわけではないけど、Kubernetesアプリケーションが主なターゲットのはず。

共通的な機能を備えたサイドカーをマイクロサービスに注入し、このサイドカーがイベントのやり取りとかステート管理とかサービスディスカバリとか分散トレーシングとかを担ってくれる。

サービスメッシュっぽい…

パッケージマネージャ、パッケージャ

Kubernetesアプリケーションをパッケージングしたり管理したりするツール。

Helm

HelmはKubernetesアプリケーションを構成するKubernetesリソースのマニフェスト一式をChartという単位で記述し、クラスタにデプロイしたりバージョン管理したりするツール。

Chartではマニフェストのテンプレートとパラメータを分けて書けるので、環境に合わせたデプロイをしやすい。 デプロイせずにテンプレートからマニフェストをレンダリングすることもできるので、kustomizeの代わりにも使える。

もうすぐ出るv3でアーキテクチャや思想が大きく変わる模様。

Tanka

TankaはGrafanaラボが開発したKubernetesマニフェストのレンダリング・デプロイツール。 Helmみたいなものだけど、テンプレート言語としてJsonnetを使っていて、よりプログラマブルに記述できるのが売り。

Gravity

GravityはKubernetes上のアプリケーションをKubernetesごとパッケージングしてtarファイルにしてくれるツール。 Kubernetesアプライアンスを作るツールとも自称している。

パッケージにはインストーラやコンテナレジストリやクラスタオーケストレータまで含まれ、オフラインでインストールできる。

CNAB、Duffle

CNABはMicrosoftとDocker社が主導して作っている分散(コンテナ)アプリケーションのパッケージング仕様。 DuffleはCNABパッケージマネージャ。

Kubernetes専用というわけではないし、コンテナ必須というわけでもないように見えるけど、Kubernetesもターゲットになっているっぽいのでここに載せた。

Kubernetesオペレータフレームワーク

KubernetesのAPIを拡張できるオペレータを開発するためのフレームワーク。

Kubebuilder

KuberbuilderはもともとCoreOS社が開発していたオペレータフレームワーク。 Goでオペレータを書くためのプロジェクトテンプレートやコードを生成してくれる。

Operator Framework

Operator Frameworkは、Kuberbuilderと同様の役割のOperator SDKでGo、Ansible、Helmでオペレータを書けるほか、Operator Lifecycle Managerでオペレータのデプロイやアップグレード周りを面倒見てくれる。

Operator Lifecycle Managerを使えばOperatorHubから手軽にオペレータを利用できるっぽい。

Kopf

KopfはPythonのデコレータでオペレータを書けるフレームワーク。

KubebuilderやOperator SDKはAPIがプリミティブな感じで、Reconciliation loopのなかでAPIオブジェクトに何が起きたのかを自分で調べないといけないけど、Kopfはもうちょっと洗練されていて、フレームワークが自動で差分を取ってくれたりして楽そう。 オペレータでちくちくいじらないといけないJSONデータも、動的型付けのPythonの方が圧倒的に楽そうだし。

KUDO

KUDOはD2iQ(旧Mesosphere)が開発したKubernetesオペレータ用のパッケージマネージャ。 オペレータを作るためのフレームワークではない。 kubectlにkudoというサブコマンドを提供し、オペレータtarでパッケージングし、インストール、アップグレード、バックアップなどのライフサイクルの面倒を見てくれる。

オペレータリポジトリも作ることができて、公式のリポジトリもある。

java-operator-sdk

java-operator-sdkはOperator FrameworkにインスパイアされたJavaでオペレータを書けるフレームワーク。 Spring Bootのスターター(spring-boot-operator-framework-starter)が提供されている。

CI/CD

KubernetesアプリケーションのCI/CDツールたち。

Weave Flux

Weave FluxGitOpsを提唱したWeaveworksによるCI/CDツール。

GitOpsできる。 つまり、Gitリポジトリに登録されたKubernetesマニフェスト(やそのテンプレート?)とKubernetesにデプロイされているマニフェストを同期してくれる。

Argo CD

Argo CDはArgo ProjectによるCI/CDツール。

GitOpsできるツールとして、Weave Fluxより人気があるような気がする。

Argo Flux

Argo CDとFluxがくっついた。 なんかすごい。

Prow

Prowは、KubernetesコミュニティによるCI/CDツール。 Kubernetesの開発などに使われていて、以下のような機能を持つ。

  • GitHubイベントに応じたジョブをKubernetes上で実行。
  • Jobのステータスなどを確認するGUI。
  • BotによるGitHubオートメーション。

GitHub特化っぽい。

Tekton Pipelines

Tekton PipelinesはCI/CDパイプラインをKubernetesリソースとして定義できるツール。 パイプラインの実行もKubernetes上で。 パイプラインの各ステップがコンテナで実装でき、Kubernetesクラスタで実行される。

パイプライン定義は柔軟になんでもできそうなので、CI/CD以外のパイプラインにも使えそう。

もともとKnative(下記)のコンポーネントとして開発されていた。

JenkinsX

Jenkins Xの本体はjxというコマンドラインツールで、jxはKubernetesアプリケーションの開発とCI/CDのためのツール群を簡単に導入し、CI/CDパイプラインを構築できるツール。 Jenkinsをコンポーネントとして使ってるけど隠蔽されているし、サーバプロセスとして動きすらしないらしい。

Jenkinsのほかに、Helm、Draft、Skaffold、Prow、Tekton Pipelines、NexusDocker RegistryChartMuseumMonocularといったものを使う。

GitOpsにも対応。

Razee

RazeeはIBMが開発しているCI/CDツール。

KapitanというコンポーネントでGitリポジトリやS3などに格納されたKubernetesマニフェストを自動デプロイし、RazeeDashというコンポーネントでKubernetesリソースを可視化してくれる。

KubernetesマニフェストのテンプレートエンジンとしてMustacheを使う。

マルチクラスタに対応。

Brigade

BrigadeはMicrosoft製のCIツール。

Kubernetes上で動き、GitHubとかのイベントを受けてJavaScriptで定義したパイプラインを実行できる。 Kashtiというダッシュボードでパイプラインの状態を確認できる。

ログ

コンテナログ周りを扱うやつ。

stern

sternはPodのログをみるツール。

kubectl logs -fに似てるけど、正規表現で対象のPodを指定できるので、DeploymentなどによってPodが再起動して名前のポストフィックスが変わってもログを追えるところがいい。 Podごとに色付けして出力してくれるのも見やすくていい。

Fluentd

FluentdはTreasure Data(現Arm Treasure Data)製のログ収集ツール。 入力、中間処理、出力のパイプラインを、数百のプラグインを組み合わせて柔軟に組み立ててログの処理系を構築できる。 分散したログの集約もできる。

Kubernetes専用というわけではないけど、Kubernetesの標準ログ収集ツールに採用されているのでここに挙げた。

コミュニティ製だけどKubernetesプラグインもあって、コンテナログにPod名やノード名などのメタ情報を付加できる。

Fluent Bit

Fluent BitもTreasure Data製のログ収集ツール。 FluentdがRuby(とC)でできているのに対し、Fluent BitはCだけでできていて、メモリ使用量が十分の一くらいで動く。 そのため最初はIoTや組み込み向けとされていたが、今はそうでもない模様。

KubernetesプラグインがFluent Bitではビルトインで、Fluentdのそれと同じことができる。

プラグインが60くらいとFluentdよりかなり少ないけど、基本的なものはそろっているので、だいたいのユースケースはFluent Bitでよさそう。 Fluent Bitで集めたデータをFluentdに集約することもできるので、込み入ったユースケースにも使えそう。

ネットワーク

Kubernetesクラスタ内のPodネットワークやServiceネットワークに関するやつ。

CoreDNS

CoreDNSはGo製のDNSサーバ。 プラグインで色々な機能を拡張できるアーキテクチャで、kubernetesプラグインを使うことでKubernetesクラスタのServiceネットワークの名前解決をすることができる。

ほぼKubernetesの標準コンポーネント。

Calico

CalicoはBGPを話す仮想ルータを作り、フラットなIPネットワークを構成してくれるツール。 ネットワークポリシーによる通信制御も設定できる。 CNIをサポートしていて、Podネットワークを構成するのに使える。

パケットをカプセル化してオーバレイネットワークを作ったり、NATしたりすることがないので、シンプルで高速らしく、CNIプラグインとして最も人気がある気がする。

ただ、BGPで経路情報を周辺のルータと交換するので、Kubernetesクラスタ周辺の環境に若干依存したり変更を加えたりするわけで、ちょっと気持ち悪さがある気がする。

Weave Net

Weave NetはVxLANによるオーバレイネットワークを作って、別々のホストで動くコンテナ間をL2フラットにつないでくれるツール。 ネットワークポリシーをサポートしているほか、IPsecによる通信暗号化もできる。

CNIをサポートしていて、Podネットワークを構成するのに使える。 CNIプラグインとして3本の指に入るくらいには人気な気がする。

Cilium

Ciliumは2018年4月にv1.0がリリースされた比較的新しいCNIプラグイン。 CalicoもWeave Netもルーティングや通信制御にiptablesを使っているのに対し、Ciliumはより柔軟でスケーラブルなBPFを使っている。 BPFによって、TCP/IPの層だけでなくL7のネットワークポリシーをサポートできていて、HTTP、gRPC、Kafka、DNSの制御に対応している。

Pod間ネットワークのモードとして、VxLANやGeneveなどによるオーバレイネットワークか、ホストのルーティングテーブルを直接いじるネイティブルーティングを選べる。(後者は前提が多いので基本は前者。)

もともとはバックエンドにKV-Storeとしてetcdかconsulが必要だったけど、2019年8月にリリースされたv1.6でKV-Storeに依存しないモードができて使いやすくなった。 v1.6ではkube-proxyを置き換える機能も備えて、かなりいい感じな気がする。

IPsecによる通信暗号化もサポートしているので最強のCNIプラグインに見えるが、BPFを使うため、Linuxカーネルバージョンが4.8以上じゃないといけないのがネック。

RHEL 7ではカーネルアップグレードしないと使えない…

Submariner

SubmarinerはRancher製のプロダクト。 Kubernetesクラスタ間のPod/Serviceネットワークをつなげられる。 デザスタリカバリとかクラスタの移行とかに使える?

まだpre-alpha。

サービスメッシュ

Kubernetes向けサービスメッシュの実装たち。

Istio

サービスメッシュと言えばIstio

各PodにEnvoyコンテナを挿入し、各Envoyコンテナをコントロールプレーンから管理することでPodネットワークの通信を制御する。(i.e. サイドカーパターン) それによって、ルーティング、ロードバランシング、リトライ、Circuit Breaking、双方向認証、暗号化、メトリクス収集、分散トレーシングといった、マイクロサービスを運用するのに一般的に横断的に必要な機能を提供する。

Istio用CNIプラグインがα版として提供されている。

Linkerd

LinkerdはBuoyant社によるサービスメッシュ実装。 Istioより古くからあり、実績もあったけど、最近はあまり話を聞かない。

Linkerd v1系のときにBuoyant社が後継製品としてConduitというのを作ったけど、これが結局Linkerd v2になったっぽい。 v2では作りが刷新され、Istioと同様のアーキテクチャと機能をもつようになった。

CNIプラグインとして動作する機能が実験的に提供されている。

Maesh

Maeshは、Go製リバースプロキシであるTraefikを開発するContainous社が開発したサービスメッシュ。 2019年9月に発表されたばかりのかなり新しいやつ。

サービス間通信の管理にはTraefikを使ってるけど、サイドカーパターンではなく、各PodにTraefikコンテナが挿入されるわけではない。 代わりに各KubernetesノードでDaemonSetとしてTraefikが動く。 で、クラスタ上で動くユーザのPodは選択的にこのTraefikをプロキシとして使えて、サービスメッシュの機能を享受できる。 (多分Linkerd v1と同様のアーキテクチャ?)

どうもIstioよりシンプルで軽くて簡単にセットアップ・運用できるというのを売りにするっぽい。

サービスメッシュの標準規格であるSMIに対応している。

Kuma

KumaはAPIゲートウェイのKongを開発するKong社によるサービスメッシュ。 Maeshの直後くらいにアナウンスされたかなり新しいやつ。

Kong自身もサービスメッシュ機能をもっているけど、KumaはサイドカーにEnvoyを使う。

Istioとアーキテクチャも機能も似てるけど、Istioなどの従来のサービスメッシュの反省を生かし、セットアップや運用の容易化に力を入れている。 また、Kubernetes上のサービスだけでなく、VMなどの上で動く非コンテナプロセスの通信も制御できるため、従来型のアプリケーションからサービスメッシュを活用したマイクロサービスアプリケーションへの移行を可能にする。

GUI

Kubernetes上で動き、Kubernetes上の構成情報を参照したり、アプリのデプロイをするためのGUIアプリ。

Kubernetes Dashboard

Kubernetes DashboardはKubernetes公式のGUIアプリ。 各種Kubernetesリソースのリストや詳細の参照、DeploymentやServiceの作成、ノードやPodのメトリックの参照、コンテナログの参照などができる。

EOLなHeapsterに依存しているところが微妙。

K8Dash

K8DashはKubernetes Dashboardの発展形な感じ。 各種KubernetesリソースのCRUDがGUIでできて、メトリックもダッシュボードで見れる。 リアルタイムにKubernetesから情報を取って表示更新するので、リロードしなくていい。 Heapsterの代わりに現標準のmetrics-serverを使う。

ついでにOpenId Connectに対応している。

Weave Scope

Weave ScopeはWeaveworksによるGUIアプリ。

ノードやPodやコンテナやプロセスやServiceをネットワークビューで見れる。 コンテナログを見たり、kubectl execしたりもできる。

Kubeapps

KubeappsはBitnamiによるKubernetesダッシュボードアプリ。

Helmチャートリポジトリを閲覧してアプリをデプロイしたり、デプロイしたアプリのライフサイクル管理したり、Service Catalogからサービスをデプロイしたりできる。

Kubernetes Web View

Kubernetes Web Viewは比較的新しいGUIアプリ。

見た目も機能もシンプル目で、各種Kubernetesリソースの参照ができるけど、変更はできない。 マルチクラスタに対応していたり、パーマリンクがあったりするあたりがこだわり。 検索や表示のカスタマイズにもこだわっていて、ラベルでの検索とか表示する属性とかを指定できる。

ざっくりkubectl getのGUIを作りたいらしい。

アプリ

Knative

KnativeはKubernetes上にイベントドリブンなサーバレスアプリケーションを構築できるフレームワーク。

Fission

Fissionは、Kubernetes上にサーバレスファンクションをデプロイしてHTTPのAPIとかで実行できるようにしてくれるフレームワーク。

Kubernetes上でFissionのコンポーネントが色々動き、ファンクションの管理、ファンクションのビルド、HTTPリクエストの受付、ファンクションの実行をする。 HTTPリクエスト以外にも、Kafkaとかのメッセージキューと連携してファンクションを実行したりもできる。 ファンクションはJavaScriptとかのスクリプト言語で書けるだけでなく、Goとかのコンパイル言語もいける。

KubeFlow

KubeflowはKubernetes上で動く、機械学習システムの開発・デプロイ・運用のためのプラットフォーム。

Ambassador

AmbassadorはEnvoyベースのKubernetesネイティブなAPIゲートウェイ。

Argo Workflow

Argo WorkflowはArgo ProjectによるKubernetesネイティブなワークフローエンジン。

タスクを表現するパイプラインを定義するためのCRDが提供されていて、KubernetesのAPIでパイプラインを定義できる。 パイプラインからは任意のKubernetesリソースを作成できる。

Zeebe

ZeebeはKafkaなどのメッセージキューを使ってワークフローを実行するプロダクションレディなワークフローエンジン。 主にKubernetesで動かすことが想定されている。

BPMN 2.0でワークフローを定義するのと、それ用のビジュアルエディタが提供されているのが特徴。

Rook

RookはKubernetesネイティブな分散ストレージシステム。 Ceph、Minio、Cassandra、NFSとかのサーバをデプロイして管理でき、それらが提供するストレージを統一的なインターフェースで利用できる。

KubeVirt

KubeVirtはVMを表現するCRDを提供し、KubernetesのAPIで(QEMUの)VMの作成・起動、停止、削除とかの操作を可能にする。

Velero

Veleroは先日VMwareに買収されたHeptioによるバックアップツール。

バックアップの定義をするためのCRDが提供され、KubernetesのリソースとPersistentVolumeのデータのバックアップ、リストアを実行できる。

対象とする環境はAWSなどのクラウド上のKubernetesで、PersistentVolumeのバックアップはAWS EBSとかのスナップショット機能を使い、バックアップの保管先はAWS S3とかをサポートしている。 PersistentVolumeも保管先もサポート範囲が狭く、まだまだ発展途上な印象。

Kanister

Kanisterはアプリケーションレベルのデータ管理フレームワーク。 Kastenというデータ管理製品のベース。

Kanisterの主なユースケースはVeleroと同じくバックアップ、リストアだけど、VeleroがPersistentVolume(i.e. インフラ層)を見るのに対して、Kanisterはアプリケーション層をみて、アプリケーション毎に特有の操作をしてくれる。

アプリケーション毎の操作はBrueprintというCRで定義できて、ビルトインではCassandra、Elasticsearch、MongoDB、etcd、PostgreSQLなどに対応している。