この記事では、 VMware Tanzu Application Platform (TAP) のインストールで語られることの少ない、インストーラの仕組み、およびそれの解剖を行おうと思います。仕組みを理解することで、 TAP がさらに面白く感じるだけでなく、実際のインストール時のトラブル解決に役立つかもしれない情報を届けます。
実は、すごいぞ! TAP のインストール
本来このようなブログでは、インストール手順の流れを紹介するのが一般的かと思います。しかし、常に更新がかかっている内容のため、陳腐化する恐れがあるので、インストールの手順自体の紹介は控えます。公式のインストール手順は以下を参照して下さい。
さて、上の手順で完了し、 ”kubectl get po -A”コマンドを打つと様々なコンテナが起動してきます。以下の TAP 1.0 完了後の結果ですが、壮観ですね。これらすべて TAP のコンポーネントです。
ご覧の通り、TAP のインストールには複数コンポーネントが複雑に絡んで実施されます。またこういったインストーラを提供する側としては、インストールを行う環境が理想的ではないケースを想定しなくてはいけません。一番わかりやすい例がインターネットにつながっていないオフライン環境ですが、環境に合わせてインストール方法をカスタマイズできる柔軟性を兼ね備えなくてはいけないです。
TAP のインストーラでは、これらの問題を解決をするために見えないところで様々な工夫が実施されています。以降はこれについて掘り下げていこうと思います。
TAP のインストーラ = コンテナイメージ?
このブログの中で登場する「 TAP のインストーラ」という単語ですが、その実態はどこにあるのか?と言われると以下のコンテナイメージです。
registry.tanzu.vmware.com/tanzu-application-platform/tap-packages:1.0.0
コンテナイメージ?と思うかもしれません。このコンテナイメージを使い、先ほどの大量のコンテナのデプロイをしています。「コンテナをデプロイするためのコンテナイメージ」です。わかりにくいですね。中身をみてみましょう。
TAPのインストール手順の Add the Tanzu Application Platform package repository にこのコンテナイメージが登場します。実行するコマンドは以下であり`”–url”にさきほどのコンテナイメージが指定されているのがわかります。
tanzu package repository add tanzu-tap-repository \
–url registry.tanzu.vmware.com/tanzu-application-platform/tap-packages:1.0.0 \
–namespace tap-install
tanzu cli によって隠蔽されており、わかりにくくなっていますが、上のコマンド実行後、”kubectl get packagerepository -n tap-install” を実行すると見慣れないリソースがあるかと思います。
さらに、”kubectl get package -n tap-install” また、見慣れないものがリソースが登場します。
この Package Repository と Package ですが、VMware がリードしている OSS である Carvelプロジェクト の元でメンテされている OSS “kapp-controller” によって定義されているリソースです。VMware では、ソフトウェアの配布方法やインストール手段として様々な手法を検討していました。しかし、様々な検討を経て、さらには Kubernetes の父である Joe Beda の支援もあり、独自の OSS をつくるべきと判断されました。それがこの Carvel のツール群であり、今回の TAP のインストールに利用されています。
さて、話を戻して、 TAP では、この Package Repository と Package を以下のように使い分けています。
- Package Repository : Package の親リソースであり、どこにイメージが格納されているか、どのバージョンを使うべきか、インストールのデフォルトの値などの情報をもっています。こうすることで”TAP 1.0″に紐づくコンポーネント一覧を定義します。
- Package : TAP がインストールする個々のパッケージの情報があり、Kubernetes にどのようにデプロイするべきかが設定されています。
図示すると以下のようなイメージです。
ちなみに、なぜコンテナイメージ?と思われるかもしれませんが、以下のメリットがあるからです。
- Docker cli などの OCI の標準 API でパッケージが配布できます。専用の Web ページや仕組みで配布してしまうと、一括ダウンロードや自動化がしにくいデメリットがありますが、この方法であれば認証を含めコンテナを扱う API で標準化ができます。
- コンテナなので、ある程度の巨大なファイルのやり取りが行えます。さらには、コンテナの Layer 技術を用いることで、バージョン間の差分のみの転送が行え、クライアント側での負荷も減らすことができます。
インストーラである”registry.tanzu.vmware.com/tanzu-application-platform/tap-packages:1.0.0″のコンテナイメージを解析してみます。これには専用の CLI である imgpkg を使います。まず imgpkg の install ガイドにしたがってインストールを実施してください。
その後以下のコマンドを実行します。(認証で失敗する場合、”docker login registry.tanzu.vmware.com” を実行し、Tanzu Net のユーザー名/パスワードを指定してください)
imgpkg pull -b registry.tanzu.vmware.com/tanzu-application-platform/tap-packages:1.0.0 -o /tmp/tap-package
コマンド完了後、”/tmp/tap-packege”の中身をみてみましょう。以下のような中身になっているかと思います。みてのとおり、たった2つのファイルがあるだけです。
この中の、packages/packages.yaml ファイルをみると、非常に長いファイルですが、”kind: Package” で検索をかけると、”kubectl get package -n tap-install” の出力と一致することがわかります。
複雑なインストールをシンプルに : TAP Profile
さて、Package Repository について解説しましたが、これだけでは Package の定義のみがされている状態です。まだ Package のインストールは行われていません。
本来 Package のインストールは、”tanzu package install” コマンドを使います。しかし、 TAP によってインストールされる Package の数は非常に膨大です。これら一つ一つを手動でインストールする・・・と非常に複雑になることが予想されます。
ここで工夫されているのが TAP Profile の考えです。 Package の中で、”tap.tanzu.vmware.com” と呼ばれるものがありますが、これが特殊なメタ Package であり、実際のインストールを行わない代わりに、他のパッケージのインストールを管理しています。
TAPのインストールマニュアルでは、About Tanzu Application Platform package profiles というセクションにて “Full” もしくは “Light” を選択するようにガイドされています。この”tap.tanzu.vmware.com” が Full もしくは Light 、さらには追加のパラメータを受け取り、それぞれのパッケージのインストールを行なっています。”Package を Package からインストールする ”という特殊なことをしていますが、 Carvel のツールに備わっている柔軟性によって実現が可能になっています。
ちなみに、メタ Packege を利用せずに個々のパッケージをインストールする手順もあります。ただし非常に手間のかかる手順となっており、このProfileインストールがいかに手順を簡略化しているかが実感できるかと思います。
このメタ Package ですが、同じく中身をみてみたいと思います。 TAP 1.0 の場合以下のコマンドを実施します。
imgpkg pull -b registry.tanzu.vmware.com/tanzu-application-platform/tap-packages@sha256:0e82786cabb59287893827fff05b9cffa496623838406c0660b77f896d65774b -o /tmp/tap-packages-files
コマンド完了後、”/tmp/tap-packeges-files”の中身をみてみると以下のようになっています。
それぞれのファイルが個々のパッケージのデフォルトのインストール方法が記載されています。さらに “values.yml” ファイルなどにはインストールパラメータの上書きができる手段が記載されています。
極限までのカスタマイズ:ytt
さて、インストーラを提供するベンダーとして、悩ませるのがデプロイする環境が我々の想定と異なる可能性がある点です。往々にインストールのシンプルさのトレードオフとしてカスタマイズ力が失われ、特定の環境でのインストールが失敗してしまい、我々からのサポートが得られなくなるリスクがあります。
TAP のインストーラでは、この問題を解決するため、同じく Carvel のツールに含まれる ytt をフル活用して、極限のカスタマイズを可能にしています。
ytt については、弊社の人間が別のブログに詳細にまとめていますので、こちらもご覧ください。
TAP のインストーラは、すべてのコンポーネントをカスタマイズできる ytt のインタフェースを用意しています。ここからそれを使った実験をしてみます。(なお、ここからやる手順は Just for fun である点はご了承ください。)
例えば TAP からデプロイされる特定の Deployment に標準にはないラベルを追加する必要があるとします。ここでは、”cartographer-system” ネームスペースの”cartographer-controller”をターゲットにします。通常の状態では以下のようになっています。
ここにラベルとして “hello=world” という Label を追加したいと思います。以下のようなファイルを用意します。名前は”hello.yaml”にします。
このファイルを以下のコマンドで Secrets として登録します。
kubectl create secret generic just-for-fun –from-file=hello.yaml -n tap-install
TAP のインストールパラメーター ( tap-values.yml ) に以下の行を追加します。(そのほかの箇所は既存インストールのまま残します。)
この状態で、今一度インストールコマンドを仕掛けます。
tanzu package install tap -p tap.tanzu.vmware.com -v 1.0.0 –values-file tap-values.yml -n tap-install
同期間隔は 10 分に設定されているのですこし、待ちます。しばらくすると以下のように新しい Label が追加されるはずです。
これを使えば、実質インストールのカスタマイズし放題です。なお、これを過度にやることはサポートとしてグレーである点はご注意ください。あくまで本ブログでは、 TAP のインストーラの柔軟性をご理解いただく目的で紹介させていただきました。
なお、 TAP 1.0 ではまだサポートがないオフラインインストールについても今後用意される予定です。その際はこの Carvel の機能を使ったカスタマイズ手段を提供する予定になっています。
まとめ
この記事では TAP のインストーラの大解剖を実施しました。インストールの時点で様々な工夫がされており、理解すればするほど、感心したり、驚きが多いものです。VMware ブログでは引き続き TAP の中身についても解剖していく予定ですので、お楽しみください。