Helm ChartをWebUI（Kubeappsのカタログ）からインストールする


k8s環境にOSSをインストールするのに、最近ではKubernetesパッケージ管理ツールであるHelmを使うことがデファクトになっている。
ただ、Helmは基本的にCLIで使うものであり、CLIのHelmの使い方なんて覚えたくないという人も多いだろう。そもそもCLIという時点で拒絶反応を起こす人もいるとかいないとか。
ここではHelmをCLIを使わずWebUIからインストール・管理する機能を提供するOSS、[kubeapp](https://kubeapps.dev/)を簡単に紹介する。

## Kubeapsとは
[kubeapp](https://kubeapps.dev/)はHelmやTanzu PackageといったKubernetesのパッケージ管理ソフトウェアと連携して、WebUI上からパッケージの管理をするソフトウェアである。
以下のような感じでHelm Chartがカタログとして表示され、マウス操作でデプロイできてしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/42ce6753-b877-7b03-c479-b6707c1273bc.png)


特徴としては以下が公式ページに記載されている。
- Kubernetesパッケージの管理とデプロイ（ロールバックやアップグレードも含む）
- Namespaceや複数クラスタ対応
- RBAC、OAuth2、OIDCへの対応

## 前提条件
'23/4/25時点では以下が前提条件となっている。
- Kubernetes Cluster v1.21以上
- Helm v3.2.0以上（設定やインストール用）
- kubectl （設定やインストール用）

またオフィシャルで動作が確認されているのはAKS、GKE、kind、minikube、Docker for Desktopとのこと。
以前EKSで動かしたことがあるので、今回はあえて書いていないEKSで進める。

## インストール
簡単に動かしたい人は[Getting Started](https://kubeapps.dev/docs/latest/tutorials/getting-started/#step-1-install-kubeapps)を参照するとよい。
ここではIngressを使ってサービス公開する。
一旦HelmのRepositoryを追加し、values.yamlを抜き出す。
```sh
helm repo add bitnami https://charts.bitnami.com/bitnami
kubectl create namespace kubeapps
helm inspect values bitnami/kubeapps > ./kubeapps-helm-values.yaml
```
values.yamlを修正する。最初にingressを有効化しホスト名を設定する。
```yaml
ingress:
   enabled: true
   hostname: kubeapps.app.hogeeee.info
```
EKSでALB ingressコントローラを使う場合、pathに`*`を含む必要があるため、pathを修正する。
```yaml
ingress:
  path: /*
```
annotationにACMのARNを追加する。必要であれば許可IPなども書いておく。
```yaml
ingress:
  annotations:
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:xxxxxx:certificate/ec88392c-0cda-477c-a232-8799d284c288
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/inbound-cidrs: 239.116.130.41/32
```
TLSを有効化する。extraTlsの項目が必須のようなので、こちらもあわせて設定する。
```yaml
ingress:
  tls: true
  extraTls:
  - hosts:
    - kubeapps.app.hogeeee.info
```

IngressClassを設定する。分からない人は`kubectl get ingressclass`で確認すること。
```yaml
ingress:
  ingressClassName: "alb"
```
またALB ingressコントローラは`Service`のtypeで`NodePort`を指定する必要があるため、`Service`の該当箇所を書き換える(`ClusterIP`で検索するとよい)
```yaml
frontend:
  service:
    type: NodePort
```

なお、現時点でサポートされているパッケージは
- Helm
- Carvel (Tanzu Package)
- Flux
の3種類であり、`packaging:`の箇所で有効化するかどうか選択できる。デフォルトではHelmのみとなっているため、他のパッケージ管理ソフトウェアを使いたい人は設定変更が必要となる。
今回は一旦Helmのみ確認するため、変更しない。

設定が終わったので、values.yamlを使ってインストールする。
```
helm install -f ./kubeapps-helm-values.yaml kubeapps -n kubeapps bitnami/kubeapps
```

インストール後、IngressのアドレスをDNSに追加する（ExternalDNS導入済みなら不要）。

## 動作確認
Ingressに設定したURLにアクセスすると、以下の画面が表示される。
![1682419593114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/c20a7551-701f-bcd0-13b2-a319e34b36c7.png)


ここのTokenはServiceAccountのTokenを入力する。
アクセス用Tokenを取得するために、ServiceAccountを作成する。
```sh
kubectl create sa kubeapps-operator -n default
kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator
```
Kubernetes v1.24以降の人はServiceAccontを作っても自動でTokenが生成されなくなっているので、Tokenを手動で作成する。
```sh
kubectl create token -n default kubeapps-operator
```
v1.23以前の人はSecretからTokenを取得する。
```sh
kubectl get -n default secret kubeapps-operator-token -o jsonpath={.data.token} | base64 -d
```
取得したTokenでログインする。
ログイン直後の画面は以下のようになる。
![1682420095050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/5fce847f-01a7-4d87-fca9-f8f66407e063.png)


試しにWordPressをデプロイしてみる。右上の`DEPLOY`をクリックし、WordPressを選択する。
WordPressの説明画面が出てくる。スクロールするとHelmのvaluesの説明も表示される。
更に`DEPLOY`ボタンを押すと、設定画面が表示される。

![1682420308325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/21346eda-415e-5af8-f584-d8a011886740.png)

Nameのところは必須であり、任意の名前を入力する。
パラメータに関しては修正不要のHelm Chartであれば特にいじらずデプロイ出来る。
今回は試しに`wordpressBlogName`だけ`My kubeapps test`と変更してみた。
画面の下にある`DEPLOY 16.0.0`をクリックする。
しばらくすると画面が遷移し、以下のようにデプロイが始まったことが確認できる。

![1682420486318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/8634c47e-b1e8-a2ce-825c-fd5cedab35a0.png)

デプロイ完了後、アクセスしてみるとそれっぽいものが表示される。設定変更したところも確認できた。

![1682420736910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/15c3c354-0173-7107-616a-82b667c8ee36.png)

## リポジトリの追加
リポジトリの追加もWebUIから可能。右上の四角をクリックすると、Package Repositoriesと表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/fd6e0a6b-b974-d038-bdc2-0d1ce028b395.png)

これをクリックし、右上の`ADD PACKAGE REPOSITORY`を選択し、試しにGitLab(https://charts.gitlab.io/）を追加してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/dbab52e9-3b3f-62fb-90fd-5a6ec3023756.png)

Nameは分かりやすいものを、DescriptionはUI上のインフォのアイコンで表示される説明文となる。
`INSTALL REPOSITORY`で追加すると、CatalogのPackageRepositoryに`gitlab`が追加される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/514ebd35-f18f-c5dd-c340-be6cbe8b9bf2.png)


## まとめ
ということで、kubeappsを使うとCLI操作なくHelmのパッケージをデプロイ出来ることが確認できた。
これでもうCLIが苦手な人も自由にパッケージがインストールできるだろう。多分。

## おまけ
VMwareのTanzu Mission Controlという製品にはkubeappsに似た機能が備わっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/a51d7c72-1d54-ac73-6d11-02c20e9d5760.png)

商用サポートが欲しい場合はそちらを確認するとよい。