TCE で OSS を始めよう！

こんにちわ！[TUNA-JP](https://tuna-jp.tech/) の運営をしております、佐藤寛貴と申します。

TUNA-JP を改めて簡単に紹介すると、[VMware Tanzu](https://tanzu.vmware.com/jp/) と呼ばれる Kubernetes のプラットフォームと、そこで使われる OSS 郡を活用するための、**日本のユーザーのためのコミュニティ** として、この度立ち上げました。

VMwareと聞くと、「エンタープライズ向け製品の会社でしょ？興味ないなぁ・・」と思った方もいるかもしれません。でも本日ご紹介する [Tanzu Community Edition](https://tanzucommunityedition.io/) (以下、**TCE**) は、なんと無料で使えちゃうんです！そして、そこで利用可能になる OSS エコシステムの機能は、vSphere ユーザ以外の方でも、魅力的な選択肢となるのではないかなと、思っております。

そう、今、**TCE で Kubernetes** がとても熱いんです！

# TL;DR (この記事の要約)

- TCE のことをざっくり学ぶ
- `tanzu package` コマンドが凄い！

# 速習！TCEの予備知識
いきなりTCEの話を始めても「？？？」となってしまうかと思うので、まずは、いくつかの予備知識をインプットさせていただきます。(既に知っている人は読み飛ばして下さい)

### 質問1. そもそも Tanzu って何？
**答え:** Tanzu とは、日本語の **タンス**(コンテナを表現)と、スワヒリ語の **枝**(可能性の分岐を表現)をかけ合わせた**造語**です。それ以上に深い意味は無いはずなので、とりあえずは、**VMware が提供している、 Kubernetes に関するエンタープライズ向けのなんか凄そうな製品群** と思えておいて下さい。
<img width="200" src="https://blogs.vmware.com/cloudprovider/files/2021/09/logo-vmware-tanzu-square-Header.png">

### 質問2. Tanzu のコミュニティ版 (TCE)って、どういうこと？
**答え:** まず前提として、Tanzuの製品群の中核にあたる、[Tanzu Kubernetes Grid](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/index.html) (以下、**TKG**) と呼ばれる **マネージドKubernetesを実現するための製品** があるのですが、その TKG のコミュニティ版(無償利用可)として、[TCE が最近発表](https://tanzu.vmware.com/content/blog/vmware-tanzu-community-edition-announcement) されました。

TKG と TCE の主な違いは、[Redhat Enterprise Linux](https://www.redhat.com/ja/technologies/linux-platforms/enterprise-linux) (=TKG) と [Fedora](https://getfedora.org/ja/) (=TCE) の関係に似ています。つまり、どんどん TCE で新しい試みが行われ、TKG に安定版としてフィードバックされる予定です。また、TKG のみが VMware からサポートを受けられる形となります。

(ただし今のところ、フォークされたばかりなので、主要な機能は全て使えちゃいます！つまり、使うなら今がチャンス！ｗ)
<img width="480" src="https://content.cdntwrk.com/files/aHViPTYzOTc1JmNtZD1pdGVtZWRpdG9yaW1hZ2UmZmlsZW5hbWU9aXRlbWVkaXRvcmltYWdlXzYxNWUxNjA4YTFhYjIucG5nJnZlcnNpb249MDAwMCZzaWc9MzFkMThmYjY3ZmU2YmQ2YTk5YjU4ZDIzZWM1MjVmYmE%253D">

### 質問3. どうやったらTCEが使えるの？
**答え:** 基本的には、[Getting Started](https://tanzucommunityedition.io/docs/latest/getting-started/) の指示に沿って進めるだけで、割と簡単に導入出来ちゃいます。

- 最低限、TCE を操作するためのクライアントマシンが必要 : Windows/Mac/LinuxいずれもOK。
- Kubernetesを入れるためのインフラも必要 : 現バージョンでは、vSphere/AWS/Azure に加え、クライアントの Docker に直接インストールする方法もサポートされており、かなり幅が広いです。

### 質問4. TCEのことをもっと知りたい！
**答え:** そんなあなたに朗報です！つい先日、TUNA-JP のオープニングイベントを開催した際の録画を公開いたします。そこで、TCE に関する説明とデモ(21分40秒〜)を行いましたので、参考になるかと思います。

- [TUNA-JP オープニングイベント](https://vmware.zoom.us/rec/share/1KEH6HTrKDJfEXZLUzcGQ5RZvyFaPZ6DXh1cGCdNjyTf9JvU4DN-QZXomF4u_tuX.SQmhJU9C4RJIknXu) ( Passcode: Ag=kPV58
)
- [TCEデモで利用したMiro](https://miro.com/app/board/o9J_liNDf7w=/?invite_link_id=727136119197)

TUNA-JP では、上記のようなイベントや、他にも様々なイベントを定期的に企画したいと思いますので、良ければみんなでワイワイやりましょう！ 
(参加方法: https://tuna-jp.tech から、Slack に Join して下さい！)

# TCE の OSS 周りの機能を少し紹介！
さてお待たせしました、本題です。
TCE(TKG) は、AKS/EKS/GKE といった各クラウドのマネージド K8s に比べ、最後発ということもあり、あまり知られていないと思うのですが、実は **OSS との統合周りがかなり凄い**んです！本日は、そんな TCE の特徴を少しだけ紹介させていただきます。

> ※ 以下、「TCEは〜」 という主語になっているところは、TKG でも同等の機能を有しております

### Tanzu の Kubernetes クラスタには、最低限必要な OSS が予め組み込まれている！
まずは、導入した Tanzu Kubernetes Cluster (以下、TKC) に、以下のコマンドを叩いてみましょう。

``` shell
# 現在クラスタにインストールされている OSS パッケージの一覧を表示
% tanzu package installed list -A
/ Retrieving installed packages...
  NAME            PACKAGE-NAME                     PACKAGE-VERSION  STATUS               NAMESPACE
  antrea          antrea.tanzu.vmware.com                           Reconcile succeeded  tkg-system
  metrics-server  metrics-server.tanzu.vmware.com                   Reconcile succeeded  tkg-system

# 利用可能な OSS パッケージの一覧を表示
% tanzu package available list -A
(以下省略)
```

> ※ 上記コマンドの対象となる Kubernetes クラスタは、現在のコンテキストが対象。よって、別クラスタを確認したい場合、`kubectl config use-context (コンテキスト名)` で切り替えることで、確認可能。

なお上記の結果は、Docker環境で作ったTKCのため、本当に最小限しか入っていません。それでも最初から Antrea という CNI と metrics-server (kubectl top が使える) が入ってくるのが、通常の Kubernetes にはない、便利ポイントです。
以下は、Core パッケージと呼ばれる、導入時に Kubernetes に統合されるパッケージの一覧です。

OSS パッケージ名 | 説明
---------|----------
[tanzu-addons-manager](https://github.com/vmware-tanzu/tanzu-framework/tree/main/addons) | Managementクラスタにインストールされ、各 TKC インストール時に必要なアドオンを管理
[ako-operator](https://github.com/vmware/load-balancer-and-ingress-services-for-kubernetes/blob/master/docs/README.md) | NSX Advanced Load Balancer (以下、ALB)を利用する設定を行った場合、こちらがインストールされて連携される
[antrea](https://github.com/antrea-io/antrea) | CNI (TKC デフォルト)。VMware が中心となって開発し、[Open vSwitch](https://www.openvswitch.org/) のKubernetes実装を実現。
[calico](https://github.com/projectcalico/calico) | CNI。世界で最も実績のある CNI の一つ。TKCインストール時にこちらを選択することも可能。
[kapp-controller](https://github.com/vmware-tanzu/carvel-kapp-controller) | K8s内で"app"という単位で複数のリソース状態をまとめて管理してくれる便利ツール。kubectl get app で参照可能。(最初から入っているように見えるので、tanzu package installed に何故か入ってないのが謎。誰か教えて・・・)
[load-balancer-and-ingress-service](https://github.com/vmware/load-balancer-and-ingress-services-for-kubernetes) | ALBのコンポーネント。vSphere環境にL4+L7ロードバランシング提供。
[metrics-server](https://github.com/kubernetes-sigs/metrics-server) | kubectl top で Pod のCPU/Mem 利用状況を把握可能に！地味に便利。
[pinniped](https://github.com/vmware-tanzu/pinniped) | 導入時に設定を行うと、K8sで認証機能が利用可能になる。OIDCとLDAPに対応。
[vsphere-cpi](https://github.com/kubernetes/cloud-provider-vsphere) | vSphereインフラと統合するためのCloud Provider Interface
[vsphere-csi](https://github.com/kubernetes-sigs/vsphere-csi-driver) | vSphereのストレージと統合するためのCloud Storage Interface


### TCEは、使える OSS パッケージをどんどん増やせちゃう！
実は Core パッケージだけじゃありません。必要に応じて、**TCE が独自に用意したパッケージ郡**を追加することができちゃうんです。

``` shell
# 現在利用可能なリポジトリの一覧を表示
% tanzu package repository list -A
/ Retrieving repositories...
  NAME        REPOSITORY                                                                  STATUS               DETAILS  NAMESPACE
  tanzu-core  projects.registry.vmware.com/tkg/packages/core/repo:v1.21.2_vmware.1-tkg.1  Reconcile succeeded           tkg-system

# Tanzu Community Edition package repository を追加
% tanzu package repository add tce-repo --url projects.registry.vmware.com/tce/main:0.9.1
/ Adding package repository 'tce-repo'...
 Added package repository 'tce-repo'

# 上記のリポジトリが追加されているのが分かる
% tanzu package repository list -A
/ Retrieving repositories...
  NAME        REPOSITORY                                                                  STATUS               DETAILS  NAMESPACE
  tce-repo    projects.registry.vmware.com/tce/main:0.9.1                                 Reconciling                   default
  tanzu-core  projects.registry.vmware.com/tkg/packages/core/repo:v1.21.2_vmware.1-tkg.1  Reconcile succeeded           tkg-system
```
> ※ 最後のコマンド実行時の、`Reconciling` という表示は、パッケージがインストール中である状態を示します。数分待つと、`Reconcile succeeded` に変わり、パッケージが利用可能な状態に変わります。

これで準備が完了です。新たなレポジトリが追加されたため、`tanzu package available list`を叩くと、インストール可能なパッケージが増えていることが分かるはずです。以下は、TCEが用意したパッケージの一覧です。

OSS パッケージ名 | Advent Calendar | 説明
---------|----------|---------
[cert-manager](https://github.com/jetstack/cert-manager) | [9 日目 @hondy444](https://qiita.com/hondy444/items/a22f3764ee79b1916895) | 様々な発行元からの TLS 証明書の管理と発行を、自動化するためのKubernetesアドオン
[Contour](https://github.com/projectcontour/contour) | [2 日目 @hichtakk](https://qiita.com/hichtakk/items/b0cac4b766a58755062a) | EnvoyベースのIngressコントローラ。通常のIngressの他に、より高度なルーティングを実現するHTTPProxyリソースが利用可能。
[external-dns](https://github.com/kubernetes-sigs/external-dns) | [7 日目 @vkbaba](https://qiita.com/vkbaba/items/8bcc8da56ee121384dc6) | DNSサーバと連携して、K8s の Service/Ingress リソースにDNSレコードを動的に提供できる
[fluent-bit](https://github.com/fluent/fluent-bit) | [8 日目 @yama-s](https://qiita.com/yama-s/items/cd5cf9621907ac387d6c) | K8s のログやメトリクスを収集し、K8s 外部のサービスに配信
[gatekeeper](https://github.com/open-policy-agent/gatekeeper) | [12 日目 @hirosat](https://qiita.com/hirosat/items/9d2ac85adda9a8eccc6e) | OPA (Open Policy Agent) の K8s CRD 実装。ポリシー制御に用いる
[grafana](https://github.com/grafana/grafana) | -- | メトリクスを可視化し、ダッシュボードを提供。Prometheus とセットで用いられることが多い。
[Harbor](https://github.com/goharbor/harbor) | [カレンダー2 10日目 @making](https://ik.am/entries/674) | プライベート用コンテナレジストリ
[knative-serving](https://github.com/knative/serving) | [5 日目 @ipppppei](https://qiita.com/ipppppei/items/d1c53d1e272a08496a05) | K8s を用いたサーバーレス・コンテナのデプロイを提供
[local-path-storage](https://github.com/rancher/local-path-provisioner) | -- | ローカルストレージ(hostPath)を利用して、Persistent Volume 機能を提供
[multus-cni](https://github.com/k8snetworkplumbingwg/multus-cni) | 16 日目 @tarowork64 | CNI。K8s Pod に複数のネットワーク・インターフェースを提供
[prometheus](https://github.com/prometheus/prometheus) | -- | K8s で利用可能なモニタリングツールとして、最も有名
[velero](https://github.com/vmware-tanzu/velero) | -- | K8s リソースのバックアップツール
> ※ 上記の `Advent Calendar` 列は、12/12 時点にエントリしてくれた人の情報を反映しています。後日、該当する記事が増え、更新が可能であれば、アップデートしておきます。

個人的な感想としては、K8s を運用していく上で便利なツールが良く選定されていて、いいラインナップなんじゃないかなと、思います。
さらにこの機能が意味するところは、お作法に沿ったレポジトリを用意して、お作法に沿ったパッケージをそこに置けば、あなたのパッケージを追加することができちゃいます！上級者な方は、是非独自パッケージの公開にチャレンジしてみては如何でしょうか？！

### TCE なら、OSS の追加も、コマンド一発でお手軽導入！
さて、導入可能なパッケージが増えたところで、実際に Contour のインストール例を見てみましょう。

``` shell
# 事前準備として、設定ファイルを用意。(設定ファイル自体は任意だが、今回のDocker環境では、ClusterIPの指定が必須)
cat <<EOF >contour-values.yaml
envoy:
  service:
    type: ClusterIP
EOF

# 利用可能なパッケージ一覧を表示して、パッケージ名を探す
% tanzu package available list
/ Retrieving available packages...
  NAME                                           DISPLAY-NAME        SHORT-DESCRIPTION
  cert-manager.community.tanzu.vmware.com        cert-manager        Certificate management
  contour.community.tanzu.vmware.com             Contour             An ingress controller
(以下、省略)

# 次に、そのパッケージ名を指定すると、利用可能なバージョンの情報が出てくる。
% tanzu package available list contour.community.tanzu.vmware.com
/ Retrieving package versions for contour.community.tanzu.vmware.com...
  NAME                                VERSION  RELEASED-AT
  contour.community.tanzu.vmware.com  1.17.1   2021-07-23T18:00:00Z
  contour.community.tanzu.vmware.com  1.17.2   2021-07-23T18:00:00Z
  contour.community.tanzu.vmware.com  1.18.1   2021-07-23T18:00:00Z

# 上記の情報を用いてインストール。("my-contour" の箇所は、任意の名前で良い)
% tanzu package install my-contour --package-name contour.community.tanzu.vmware.com --version 1.18.1 --values-file contour-values.yaml
/ Installing package 'contour.community.tanzu.vmware.com'
| Getting namespace 'default'
| Getting package metadata for 'contour.community.tanzu.vmware.com'
| Creating service account 'my-contour-default-sa'
| Creating cluster admin role 'my-contour-default-cluster-role'
| Creating cluster role binding 'my-contour-default-cluster-rolebinding'
| Creating secret 'my-contour-default-values'
/ Creating package resource
| Package install status: Reconciling

 Added installed package 'my-contour' in namespace 'default'

# 対象のクラスタに、Contourがインストールされたことを確認
% tanzu package installed list
- Retrieving installed packages...
  NAME        PACKAGE-NAME                        PACKAGE-VERSION  STATUS
  my-contour  contour.community.tanzu.vmware.com  1.18.1           Reconcile succeeded
```

このように、簡単にインストールが出来てしまいます！
似たような仕組みとして、[helm](https://helm.sh/) も上記のような流れでインストールできますが、helm はクライアント側に情報がキャッシュされるため、複数のクライアントで情報を共有するのが難しかったりします。
これに対し、 `tanzu package` は、**自身のクラスタ内のリソースとして、インストールされている情報を管理** します。これは、どのクラスタに何がインストールされているかについて、非常に直感的に扱えることが、大きなメリットとなります。

# まとめ
今まで Kubernetes や OSS を躊躇していた人にとって、TCE はきっと敷居を下げるものとなってくれるはずです。また、OSS を今までバリバリやってきた人にとっても、TCE は有力なKubernetesプラットフォームの一つとなることでしょう。

そんな訳で、TCE を使って、みんなで Kubernetes と OSS の世界を楽しみましょう！