VMware Tanzu Application Platform のOSSを一挙ご紹介！

こんにちわ！TUNA-JPの運営メンバーをしている @hirosat です。
実は、去年も「[TUNA-JP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/tuna-jp)」を行っており、
[1日目](https://qiita.com/hirosat/items/aa1fb8efd9d95251679a)、[12日目](https://qiita.com/hirosat/items/9d2ac85adda9a8eccc6e)、[24日目(カレンダー2)](https://qiita.com/hirosat/items/08e28895098361e0e270)、[25日目](https://qiita.com/hirosat/items/62b8ebeeca5ea02d1e80)、[25日目(カレンダー2)](https://qiita.com/hirosat/items/c6e330212f01f766cc42) を担当させていただきました！

本記事は、「[TUNA-JP Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tuna-jp)」の2日目のエントリです。

# TL;DR (この記事の要約)
- VMware Tanzu Application Platform (以下、TAP) には、いっぱいOSSが使われているよ！のご紹介

# ところで、TAP をご存知ですか？

その名の通り、VMware Tanzu が提供する、Application Platform です。
まず前置きとして、[VMware Tanzu](https://tanzu.vmware.com/jp/tanzu)とは何か？をざっくり表すと、VMware製品の中で、Kubernetesに関する製品群です。
そして、今回ご紹介するTAPは、Kubernetes上で構築するプラットフォームです。

では、そもそもKubernetesって何だっけ？と、[公式ページ](https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/)を見ると、 `宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースのプラットフォーム` とあります。

ここまで聞くと、「え？どういうこと？」と思う人がでてくるのではないでしょうか？
そうなのです。Kubernetesはプラットフォームなのに、その上にプラットフォームを構築します。
何故、そのようなことをするのでしょうか？

ここで、その解をよく表しているツイートをご紹介します。

https://twitter.com/kelseyhightower/status/935252923721793536?s=20&t=TZnAxMbhYdvZX-ehhWCABA

これは、Kubernetesが普及し始めた頃に有名になったツイートなのですが、翻訳すると、このようなことを言っています。
`Kubernetesは、プラットフォームを構築するためのプラットフォームです。最終目的ではなく、より良いスタート地点です。`

これは、本当にKubernetesのことを良く表しています。Kubernetes自体はコンテナを乗せるプラットフォームとしてとても有用なのですが、本番利用に至るまでには、アプリケーションを効率よくビルドしたり展開させるための仕組みを様々なOSSと組み合わせて用意する必要があります。TAPは、その最終目的を目指すためのプラットフォームになります。

# TAPの全体像

[Conponent Documentation](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.3/tap/GUID-components.html) を参考に、全体像をまとめてみました。
注意点として、これはTAP1.3時点の構成です。今後のバージョンアップによって変わる可能性があります。
また、思いつく限り書いてみましたが、完全に全機能を網羅できていないかもしれません。

![Screen Shot 2022-11-26 at 17.11.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18601/9bf2c423-f994-6fef-94fd-e1945cb8d6aa.png)

TAPの中身を、ざっくりと3つのパートに分けてみました。
- Software Supply Chain: いわゆるCI/CDパイプラインであり、TAPの心臓部
- 開発支援ツール： Software Supply Chain を使った開発の時に役立つツール郡
- デプロイ支援ツール： Software Supply Chain でデプロイされたAPPを外部公開するために必要なもの

## Software Supply Chain を構成するOSS
なお、Software Supply Chainの中で、一つのコンポーネントの中に2つのOSSが登場する場合がありますが、同時に使うわけではありません。交換可能なコンポーネントであり、ユーザの方で取捨選択が可能です。交換可能なコンポーネントは、今後のバージョンアップでどんどん増えていくことが期待され、もっと色んなOSSがサポートされることでしょう。

### Cartographer ([Link](https://cartographer.sh/))
TAPのためにVMwareが開発したOSSであり、Software Supply Chainの核となる機能です。予めパイプラインの各パートで前後のパートと連携するための`Input`と`Output`をこのOSSで定義することにより、各処理で各OSSのふるまいを制限することなく、交換可能なパイプラインを実現しました。

### Flux ([Link](https://fluxcd.io/))
Kubernetesの中で`GitOps`をやりたい場合に重宝するOSSです。TAPはこの中の[Flux CD controller](https://github.com/fluxcd/source-controller/tree/main/docs/spec/v1beta1)という機能を利用することにより、ユーザが指定したソースコードをTAPの中に取り込んだり、Gitリポジトリの変更を検知して、APPを自動更新してくれたりします。

### grype ([Link](https://github.com/anchore/grype/))
Anchore社が提供するSBOM(ソフトウェア部品表)を利用した高速なスキャンが売りのOSS。TAPでは、ソースコードとビルドイメージのスキャンに用います。TAPの現在のバージョンでは、ソーススキャン用にサポートされた唯一の選択肢です。

### Tekton ([Link](https://tekton.dev/))
Kubernetes上でCI/CDパイプラインを実現するためのツールです。Tekton自体は幅の広い機能を持っていますが、現在のTAPでサポートされているのは、ソースコードのテスト用に使用します。

### Jenkins ([Link](https://www.jenkins.io/))
言わずもしれた、老舗のCIツール。Tektonと同様、現時点では主にソースコードのテスト用に使用します。Tektonと交換可能であり、使い慣れたツールを選んでお使い下さい。

### kpack( [kpack](https://buildpacks.io/docs/tools/kpack/))
Kubernetes上でCloud Native Buildpackを使用するためのOSSです。Cloud Native Buildpackは、ソースコード内容から利用するミドルウェアを自動判別して、Dockerfile無しでコンテナ化することができます。

### kaniko ([Link](https://github.com/GoogleContainerTools/kaniko))
Kubernetes上でDockerfileを用いたコンテナイメージビルドを行うことができるOSSです。VMwareとしてはkpack(Cloud Native Buildpack)をオススメですが、Dockerfileでコンテナ化したいユーザのために、kanikoも利用可能になっています。

### snyk ([Link](https://snyk.io/))
コンテナイメージをscanするパートでは、snykも選択可能です。デフォルトはgrypeとなっていますが、要件に応じてsnykをお使い下さい。

### Carvel Tools ([Link](https://carvel.dev/))
Kubernetes上でビルドやコンフィグやデプロイを補助するための十得ナイフのようなツール郡OSSです。以前はk14sと呼ばれていましたが、改名しました。各ツールも簡単に紹介します。

- ytt: Yaml Template Toolsなので、yttです。yamlファイルに値を代入(templating)したり、元のyamlファイルをいじらずに特定のデータを書き換える(overlay)ことができます。
- kbld: packageの元となる`Bundle`と呼ばれるOCI準拠のデータの作成をサポートするツールです。イメージの参照情報をダイジェスト形式に変換したり、メタデータにその情報を格納してくれます。
- imgpkg: Bundle情報からレジストリ上へのイメージの配置をサポートします。また、レジストリ間のイメージの再配置にも利用することができます。
- kapp-controller: APP packageのデータをKubernetes上にデプロイ・管理することができます。
- kapp: APP形式のリソースの操作を行うCLIです。
- secretgen-controller: Kubernetes標準のSecretリソースのデータ形式を拡張します。

### knative ([Link](https://knative.dev/docs/))
主に、ServingとEventingの2つの要素を持ちます。
- Serving: 既存のServiceリソースよりも高機能なサービス公開を可能にします。例えば、リクエストを受けるまでPod数0の状態をキープしたり、しばらくアクセスがなかったら、再びPod数を0にすることができます。
- Eventing: Event-drivenなマイクロサービス間連携を可能にします。

## 開発支援ツールで使われるOSS
### Backstage ([Link](https://backstage.io/))
TAP GUIのバックエンドで動いていて、GUIポータル機能を提供します。

### TILT ([Link](https://tilt.dev/))
ローカルのソースコードの変更を、Kubernetes内のAPPにリアルタイム反映させるためのOSS。
TAPでは現在、以下の要件を満たすアプリケーションに、Live updateとデバッグ機能を提供します。
- クライアント: Windows/Mac上のVS Code
- 対応言語: Java / Spring Boot

### Educates ([Link](https://github.com/eduk8s/eduk8s))
Kubernetesを利用した学習サイトを作成するためのOSS。以前はeduk8sという名前でOSSを展開していましたが、Educatesと名称変更となり、さらに現在OSS開発は止まっています。TAPとは独立した学習サイトを作成することが可能です。

## デプロイ支援ツールとして利用されるOSS
### Contour ([Link](https://projectcontour.io/))
Kubernetes内に、L7ロードバランシング機能を提供するOSS。一般的なingressリソースに加え、より高度なカスタマイズが可能なhttpproxyリソースも提供される。

### Cert Manager ([Link](https://cert-manager.io/))
アプリケーションにSSL証明書を付与するのに役立つOSS。

# あとがき
いかがでしたでしょうか？TAPをインストールすると、これだけのOSSが一挙に統合された状態で利用可能になります。
OSS好きな私としては、TAPは非常に興味深い製品となっています。
そして、各OSSの知識がなくてもある程度利用可能ですが、OSSの知識があると、カスタマイズしたい時に役立つので、ぜひ覚えておきましょう！


「[TUNA-JP Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tuna-jp)」の3日目のエントリでは、そんな色々と入ったTAPを使って、果たしてどんなことができるか？を中心に、解説予定です。

ご拝読、ありがとうございました！