Cluster Essentials for VMware Tanzuってなんなのさ

この記事は、[TUNA-JP Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tuna-jp) の6日目のエントリーとして、最近の VMware Tanzu の製品群を扱うにあたってしばしば目にする [Cluster Essentials for VMware Tanzu](https://docs.vmware.com/en/Cluster-Essentials-for-VMware-Tanzu/index.html) に対し、何なんや一体！とお感じになられたことがあるだろう皆さまに向け、少しでも慰めになればいいのになあとの想いを込め、解説を試みるものです。
最初に断っておきますが、地味な記事です。きらびやかさは一切ありませんので、何とぞご了承ください。

# で、[Cluster Essentials for VMware Tanzu](https://docs.vmware.com/en/Cluster-Essentials-for-VMware-Tanzu/index.html) って何や

ざっくり言えば、以下の3点セットです。

- [kapp-controller](https://carvel.dev/kapp-controller/)
- [secretgen-controller](https://github.com/vmware-tanzu/carvel-secretgen-controller)
- [Carvel](https://carvel.dev/) のうち、[ytt](https://carvel.dev/ytt/)、[imgpkg](https://carvel.dev/imgpkg/)、[kbld](https://carvel.dev/kbld/)、[kapp](https://carvel.dev/kapp/) の各コマンド

上記はいずれも、[Cloud Native Computing Foundation の Sandbox project のひとつである Carvel](https://carvel.dev/blog/carvel-cncf-sandbox/) に含まれるオープンソースソフトウェアであり、[ソースコードやドキュメント類は全て GitHub で公開](https://github.com/orgs/vmware-tanzu/repositories?q=carvel)されています。
ytt、imgpkg、kbld、kapp の各コマンドは、kubectl コマンドをインストールして Kubernetes クラスタを操作するマシンにインストールして使います。kapp-controller と secretgen-controller は、Kubernetes クラスタにデプロイし常駐させて使います。

# ほう、で、 [kapp-controller](https://carvel.dev/kapp-controller/) って何なんや

昨年の[TUNA-JP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/tuna-jp)の記事のひとつ『 [Carvelでパッケージを作って公開する](https://qiita.com/masanara/items/220eacf08e3e7f52f545)』においても触れられていますが、Kubernetes クラスタ上にデプロイするソフトウェアがパッケージとして提供されている VMware Tanzu の製品群において、そのパッケージを Kubernetes クラスタに持ち込んできて設定してデプロイする一連の処理を担う、 Kubernetes クラスタ上の常駐プログラムです。

[Cluster Essentials for VMware Tanzu](https://docs.vmware.com/en/Cluster-Essentials-for-VMware-Tanzu/index.html) のドキュメントにおける説明文を、日々愛用させていただいております [DeepL翻訳](https://www.deepl.com/ja/translator) にてさくっと日本語訳いたしますと、以下の通りです。

> kapp-controllerは、Kubernetesアプリケーションとパッケージをカスタマイズ、インストール、更新するための宣言型APIを提供します。パッケージのインストールとアップデートのためにTanzu CLIパッケージプラグインによって利用されるPackage、PackageInstall、PackageRepository、およびApp CRDを提供します。また、これらのCRDは、GitOpsのプラクティスに従ってワークロードの管理を自動化するために使用することができます。

kapp-controller 自体を包括的に説明した日本語のブログ記事はまだ無いようですが、今年9月に開催された [Cloud Operators Days Tokyo 2022](https://cloudopsdays.com/) にて、私の同僚の槙さんがプレゼンした動画が公開されています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/mRAKLIZ4bqs" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

ちなみに英語の記事だと、[このへん](https://tanzu.vmware.com/developer/guides/kapp-controller-gs/)が Carvel との関係性も含めて包括的に書いてあって、よさそうです。

kapp-controller については、パッケージによる Kubernetes クラスタへのソフトウェアのデプロイに止まらず、 GitOps に基づく Continuous Delivery (CD) にも使えたり、値が暗号化されたYAMLの復号化ができたり、ytt overlay によってデプロイ対象の細かいカスタマイズができたりと、 Kubernetes 運用の自動化にとても有用な機能群を備えており、非常に奥の深いものとなっています。

# ふむ、で、 [secretgen-controller](https://github.com/vmware-tanzu/carvel-secretgen-controller) ってのも何なんや

こちらも [Cluster Essentials for VMware Tanzu](https://docs.vmware.com/en/Cluster-Essentials-for-VMware-Tanzu/index.html) のドキュメントにおける説明文を、日々愛用させていただいております [DeepL翻訳](https://www.deepl.com/ja/translator) にてさくっと日本語訳いたしますと、以下の通りです。

> secretgen-controller はクラスタ上で必要な秘密を指定するための宣言的な API を提供します。証明書、パスワード、RSAキー、SSHキーを生成することができ、他のツールで生成された秘密も使用することができます。Tanzu CLI secret plugin が利用する SecretImport および SecretExport CRD を提供し、プライベートレジストリからのパッケージのインストールを可能にするために、適切なネームスペースにプライベートレジストリの秘密をコピーするために利用されます。

secretgen-controller の詳細については、すでに私の同僚の @ipppppei さんがQiita記事にてしっかりまとめてくれています。

https://qiita.com/ipppppei/items/70e075bc72d8749b5643

なお、上記記事では触れられていませんが、secretgen-controller には以下のような、使わなさそうで案外結構使えそうな機能もあります。

- [ランダムなパスワードを生成して kubernetes.io/basic-auth タイプの Secret リソースに格納する](https://github.com/vmware-tanzu/carvel-secretgen-controller/blob/develop/docs/password.md)
- [RSA 鍵ペアを生成して Opaque タイプの Secret リソースに格納する](https://github.com/vmware-tanzu/carvel-secretgen-controller/blob/develop/docs/rsa_key.md)
- [SSH 鍵ペアを生成して kubernetes.io/ssh-auth タイプの Secret リソースに格納する](https://github.com/vmware-tanzu/carvel-secretgen-controller/blob/develop/docs/ssh_key.md)
- [ルートCA証明書、中間CA証明書、リーフ証明書を生成して kubernetes.io/tls タイプの Secret リソースに格納する](https://github.com/vmware-tanzu/carvel-secretgen-controller/blob/develop/docs/certificate.md)
- [SecretTemplate カスタムリソースのプレースホルダに、既存の Secret リソースの値や自動生成した値を詰めることにより、新たな Secret リソースを生成する](https://github.com/vmware-tanzu/carvel-secretgen-controller/blob/develop/docs/secret-template.md)

ああ、思い出します。 [bosh interporate](https://bosh.io/docs/cli-v2/#interpolate) コマンドのことを。 [BOSH manifest の variables ブロック](https://bosh.io/docs/manifest-v2/#variables)のことを。 Kubernetes の YAML 地獄以前に、Cloud Foundry で YAML 地獄に苦しんでいたあの頃が脳裏に蘇ります。
[Cloud Foundry BOSH](https://bosh.io/docs/) と Carvel との間には、浅からぬ関係があります。このお話については、 [TUNA-JP Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tuna-jp) の24日目くらいで改めて語りたいと思っています。

# [Carvel](https://carvel.dev/) のうち、何で [ytt](https://carvel.dev/ytt/)、[imgpkg](https://carvel.dev/imgpkg/)、[kbld](https://carvel.dev/kbld/)、[kapp](https://carvel.dev/kapp/) のコマンドだけ含まれてるのや？

[VMware Tanzu Network](https://network.tanzu.vmware.com/products/tanzu-cluster-essentials/) から Cluster Essentials for VMware Tanzu の TarBall をダウンロードして解凍すると、 install.sh と uninstall.sh というシェルスクリプトに加えて、確かに [ytt](https://carvel.dev/ytt/)、[imgpkg](https://carvel.dev/imgpkg/)、[kbld](https://carvel.dev/kbld/)、[kapp](https://carvel.dev/kapp/) の各コマンドのバイナリが含まれています。
これらのコマンドは、kapp-controller と secretgen-controller を初めとする VMware Tanzu 製品をインターネット非接続な Kubernetes クラスタにインストールできるよう、予め VMware Tanzu Network から Harbor などのプライベートコンテナレジストリへ必要なコンテナイメージを持ち込んでおき、さらにそれを使って、必要な設定も加えつつ、実際に Kubernetes クラスタにインストールするために使われます。
なお、インターネットに HTTP Proxy など無しで直接接続可能な環境では、インストールに kapp-controller や secretgen-controller の助けが必要になる VMware Tanzu 製品であっても、Tanzu CLI だけでインストールすることができます。
とは言え、 Carvel の各コマンドは、使い慣れればとても便利で手放せなくなります。上記の4コマンドに [vendir](https://carvel.dev/vendir/)、[kwt](https://github.com/vmware-tanzu/carvel-kwt)、[kctrl](https://carvel.dev/kapp-controller/docs/latest/management-command/) も加えた [Carvel のコマンドを一括で簡単にインストールする方法も提供されている](https://carvel.dev/#install)ので、 Kubernetes クラスタを操作する端末にはデフォルトで入れとくといいと思います。

# [Cluster Essentials for VMware Tanzu](https://docs.vmware.com/en/Cluster-Essentials-for-VMware-Tanzu/index.html) は必ずインストールせんといかんのか？

実は、以下の場合においては、 Kubernetes クラスタに kapp-controller と secretgen-controller が最初からインストールされた状態になります。

- [Tanzu Kubernetes Grid](https://tanzu.vmware.com/jp/kubernetes-grid) によって生成・管理されている Kubernetes クラスタ
- [Tanzu Mission Control](https://tanzu.vmware.com/jp/mission-control) によって管理されている Kubernetes クラスタ
    - TMC のクラスタライフサイクル管理機能を用いて生成されたクラスタはもちろん、別途生成のうえ TMC にアタッチされ管理下に置かれたクラスタにも、 TMC のエージェントのインストールの延長で kapp-controller と secretgen-controller も勝手にインストールされます。

従って、 Kubernetes クラスタ運用者が Cluster Essentials for VMware Tanzu を意識してインストールしなければならないケースは、以下のような場合となります。

- [Tanzu Application Platform](https://tanzu.vmware.com/jp/application-platform)、[Tanzu SQL with Postgres for Kubernetes](https://docs.vmware.com/en/VMware-Tanzu-SQL-with-Postgres-for-Kubernetes/index.html) 、 [Tanzu SQL with MySQL for Kubernetes](https://docs.vmware.com/en/VMware-Tanzu-SQL-with-MySQL-for-Kubernetes/index.html)、[Tanzu RabbitMQ for Kubernetes](https://docs.vmware.com/en/VMware-Tanzu-RabbitMQ-for-Kubernetes/index.html) を、TKGではない EKS、AKS、GKE、OpenShift、minikube などの Kubernetes クラスタにインストールする場合

# VMware Tanzu の製品で [Cluster Essentials for VMware Tanzu](https://docs.vmware.com/en/Cluster-Essentials-for-VMware-Tanzu/index.html) はどう使われてるのか？

例えば [Tanzu Application Platform](https://tanzu.vmware.com/jp/application-platform) の場合だと、インストール手順ののっけから以下のように使われまくっています。

- [VMware Tanzu Network から インストール対象の Kubernetes クラスタの最寄りのコンテナレジストリへ、インストールに必要なコンテナイメージを持ち込む](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.3/tap/GUID-install.html#relocate-images-to-a-registry-0)
    - [imgpkg](https://carvel.dev/imgpkg/)コマンドを使います。
- [インストールに必要なコンテナレジストリのホスト名とクレデンシャルを Secret リソースに格納し、全 namespace でその Secret の値を利用可能にする](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.3/tap/GUID-install.html#add-the-tanzu-application-platform-package-repository-1)
    - `tanzu secret registry add` コマンドの `--export-to-all-namespaces` オプションにより [SecretExport リソース](https://github.com/vmware-tanzu/carvel-secretgen-controller/blob/develop/docs/secret-export.md)が Secret に併せて生成されます。secretgen-controller が SecretExport を解釈して全ての namespace にてその Secret を利用可能にします。これにより、TAP にバンドルされる数多くのソフトウェアを多数の namespace に分散してインストールする際に、各 namespace に個別に Secret を設定せずに済むようにします。
- [TAPにバンドルされるパッケージの詰め合わせとして設定された PackageRepository を使って、実際にTAPをインストールする](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.3/tap/GUID-install.html#install-your-tanzu-application-platform-package-6)
    - `tanzu package install` コマンドを実行すると、内部的には [PackageInstall リソース](https://carvel.dev/kapp-controller/docs/latest/packaging/#package-install)が定義され、 kapp-controller がそれを解釈してインストールが開始されます。

# おわりに

字ばっかりでつまらない記事になってしまったかもしれないですね・・・
しかし、すでにクロアチア戦の前半が終わろうとしています。前田が先制ゴールを決めたのです。Kubernetes どころではありません。ごめんなさい。がんばれ日本！
それでは、ごきげんようさよなら！

# おしまい