Tanzu Mission Controlを使ってArgoCDをWebUIだけで構築する

Tanzu Mission Control(TMC)にはHelmを管理する機能があり、WebUI上からHelm Packageをデプロイすることが出来る。
今回はこれを使ってArgoCDをCLIを使わずブラウザのみでインストールしてみる。
ただ、状態確認等で少しCLIを使っている点があるのはご了承を。

## 前提条件
以下を既に実施済みのものとする。
- Tanzu Mission ControlにTanzu Kubernetes Clusterを登録済み


## 事前準備
### Helm Serviceの有効化
クラスタを選択し、`Add-ons`タブから`Helm release`を選択し、`ENABLE HELM SERVICE`をクリックする。
![1682931689454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/3fc9231c-8d36-9335-43c3-c6af7b6df4d5.png)
しばらく待つと`AVAILABLE HELM CHART`が表示されて準備完了となる。

### Cert-Managerのインストール
ArgoCDでIngressを利用するためにContourを入れる。Contourの前提パッケージとしてcert-managerがあるので、先にcert-managerをインストールする。

`Add-ons`タブから`Installed Tanzu Packages`を選択し、`BROWSE PACKAGES`を選択する。
`Tanzu packages`タブをクリックし`Available packages for cluster:`がデプロイ対象のクラスタになっていることを確認し、cert-managerを選択する。
![1682933148482.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/7b688542-2987-a791-4d2b-56f1e382dd99.png)
右上の`INSTALL PACKAGE`をクリックし、`Package name`にcert-managerと入力して`INSTALL PACKAGE`をクリックする。
しばらく待ってリロードしなおすと、ステータスが緑で表示される。
![1682933502688.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/f8502878-1084-6df7-fad3-2fe133440b22.png)

### Contourのインストール
`Add-ons`タブから`Installed Tanzu Packages`を選択し、`BROWSE PACKAGES`を選択する。
`Tanzu packages`タブをクリックし`Available packages for cluster:`がデプロイ対象のクラスタになっていることを確認し、contourを選択する。
右上の`INSTALL PACKAGE`をクリックし、`Package name`にcontourと入力し、Overlay YAMLをクリックしてenvoyを`type: LoadBalancer`に変更して`INSTALL PACKAGE`をクリックする。
![1682933754952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/12aebd78-1e41-c00e-6c7b-bf5adf38295f.png)
状態が緑になったら、念の為Envoyの設定が`type: LoadBalancer`に変わっていることを確認する。
```
$ kubectl get svc -n tanzu-system-ingress
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
contour   ClusterIP      10.103.89.77    <none>        8001/TCP                     101s
envoy     LoadBalancer   10.107.172.88   10.220.48.6   80:30387/TCP,443:30877/TCP   101s
```
この後、ドメインは[sslip.io](https://sslip.io)を利用して進めるが、自前のドメインを使う人はArgoCDに割当予定のドメインの転送先にEnvoyのIPを指定しておくこと。

### ArgoCDのインストール
ArgoCDをインストールする前に、vSphere with Tanzuの環境の場合はRBACを調整してPodが作成できるようにしておく。
デフォルト設定だと、以下のようにPodが1つしか作成できずインストールに失敗する。
```
$ kubectl get pod
NAME                                                READY   STATUS     RESTARTS   AGE
my-release-argo-cd-app-controller-9f4cd7b6b-jwwsd   0/1     Init:0/1   0          76s
```
ここでは便宜上、全開放で進める。
```
kubectl create clusterrolebinding default-tkg-admin-privileged-binding --clusterrole=psp:vmware-system-privileged --group=system:authenticated
```


左サイドバーの`Catalog`から`Helm charts`タブを選ぶとHelmでインストール可能なパッケージ一覧が表示されるのでargo-cdの`CREATE HELM CHART`をクリックする。
![1682932505110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/897452c8-0c43-01aa-1d9c-7aeaefeb39d9.png)
`Release name`、`Cluster`、`Target namespace`を入力する。なお、Namespaceはなければ自動生成してくれる。
![1682932608056.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/33a40ada-8022-c938-ec0c-4946730c2e70.png)

次にvalues.yamlを編集する。
ArgoCDはgRPCを使うためIngressに少し癖があって、Contourを利用する場合は[こちら](https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#contour)の設定をしてあげる必要がある。
ここではgRPCと本体のドメインを分けて、以下のような設定でデプロイすることにする。
```yaml
global:
  storageClass: "vc01cl01-t0compute"
server:
  insecure: true
  service:
    annotations:
      projectcontour.io/upstream-protocol.h2c: https,443 
  ingress:
    enabled: true
    hostname: argocd.10-220-48-6.sslip.io
    tls: false
    selfSigned: true
    extraTls:
    - hosts:
      - argocd.10-220-48-6.sslip.io
      secretName: argocd.10-220-48-6.sslip.io-tls
  ingressGrpc:
    enabled: true
    hostname: grpc.argocd.10-220-48-6.sslip.io
    tls: true
    selfSigned: true
config:
  secret:
    argocdServerAdminPassword: "VMware1!"
```
`YAML`タブを選択し、元々の記述を全て削除して上記を自環境向けにカスタマイズしたyamlを貼り付けて`CREATE HELM RELEASE`をクリックする。（元々の記述はデフォルト値なので消しても問題ない）
デプロイ後、最初はステータスが赤だが、しばらく待ってリロードすると以下のようにステータスが緑で表示される。
![1682990638918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/91769f43-df26-939b-5d52-c48480048ed7.png)

ログインしてみる。
![1682991349734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/211421e2-43af-fd74-f950-ce23392834e0.png)
バージョン表示がv99.99.99+unknownとおかしいが、[Issueチケットがあった](https://github.com/bitnami/containers/issues/12224)ので今回の手順とは関係ない模様。
コマンドでもログインしてみる。
```
$ argocd login grpc.argocd.10-220-48-6.sslip.io
WARNING: server certificate had error: x509: “grpc.argocd.10-220-48-6.sslip.io” certificate is not trusted. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context 'grpc.argocd.10-220-48-6.sslip.io' updated
```
ここも問題ない模様。

## ArgoCDのアンインストール
WebUIのDeleteボタンで削除できる。
この時、`helm delete`と同じでNamespaceとPVCは残るので注意。
```
$ kubectl get pvc -n argo-cd-demo
NAME                                                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS         AGE
redis-data-argo-cd-demo-argo-cd-demo-redis-master-0   Bound    pvc-a1a89c13-9e61-42ef-a860-1b73e2199c5f   8Gi        RWO            vc01cl01-t0compute   5m43s
```

## まとめ
TMCを使うとブラウザからポチポチやるだけでArgoCDの構築が簡単にできた。
Helmのvalues.yamlをどう書くかの問題は残るが、インフラ管理者やアプリケーション運用者的なポジションな人が作って、アプリケーション開発者に渡すようにすれば、アプリケーション開発者はKubernetesの仕組みを知らずにKubernetesのエコシステムに含まれるアプリケーション・パッケージを利用できるようになり、より開発に専念することが出来そうだ。