vSphere with TanzuのWorkload Cluster上にPrometheusを立てる

先日の[Harborを立てた記事](https://qiita.com/ipppppei/items/43c2257ded66a8244552)のついでにPrometheusを立てた時のメモ。

[こちら](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-00A2BB49-DBDE-4E2B-B9EE-38C36E261185.html?hWord=N4IghgNiBcIA5gMYGswHMCmIC+Q)によると、’22/10/31時点ではTKG1.6のパッケージを使えば良いことになっているので、リンク先の[こちらの手順](
https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.6/vmware-tanzu-kubernetes-grid-16/GUID-packages-prep-tkgs-kapp.html)に従う。

## 前提条件
以下が前提条件となっている。
  - vSphere7.0u2以上のworkload clusterを構築済み
  - kubectlとtanzu-cli(v1.4以上)をインストール済み
  - [Carvelツール](https://carvel.dev/)が導入済み
  - yqのv4.5以上が導入済み

また、今回は[こちら](https://qiita.com/ipppppei/items/43c2257ded66a8244552)の記事の後に実施した内容となり、kapp-controller、PackageRepository、cert-manager、Contourのインストールは完了済みの状態からスタートした。

## Prometheusのインストール
TKG1.6の[公式ドキュメント](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.6/vmware-tanzu-kubernetes-grid-16/GUID-packages-prometheus.html)に従う。vSphere with Tanzuのドキュメントには記載がない点は注意。

最初に利用可能なPrometheusのPackageのバージョンを取得する。
```
tanzu package available list prometheus.tanzu.vmware.com -A
export PROMETHEUS_VER=2.36.2+vmware.1-tkg.1
```

次にPrometheusの設定を行うために、設定ファイルを抽出する。
```
tanzu package available get prometheus.tanzu.vmware.com/$PROMETHEUS_VER --generate-default-values-file
```

抽出した設定ファイル(prometheus-default-values.yaml)に以下のようにstorageClassを設定する。
```yaml
prometheus:
  pvc:
    storageClassName: xxxxx
alertmanager:
  pvc:
    storageClassName: xxxxx
```
Ingressも有効にする。最終的な変更箇所は以下のようになった。
```diff
@@ -20,7 +20,7 @@
   pvc:
     accessMode: ReadWriteOnce
     storage: 2Gi
-    storageClassName: default
+    storageClassName: xxxxx
   service:
     port: 80
     targetPort: 9093
@@ -28,14 +28,10 @@
 ingress:
   alertmanager_prefix: /alertmanager/
   alertmanagerServicePort: 80
-  enabled: false
+  enabled: true
   prometheus_prefix: /
   prometheusServicePort: 80
-  tlsCertificate:
-    ca.crt: ca
-    tls.crt: crt
-    tls.key: key
-  virtual_host_fqdn: prometheus.system.tanzu
+  virtual_host_fqdn: prometheus.tkg.tanzu
 kube_state_metrics:
   deployment:
     replicas: 1
@@ -694,6 +690,7 @@
   pvc:
     accessMode: ReadWriteOnce
     storage: 150Gi
+    storageClassName: xxxxx
   service:
     port: 80
     targetPort: 9090
```

コメントを削除し、先頭に'---'を挿入する。（'---'がないとpackage install時に上手くファイルを解釈してくれない）
```
yq -i eval '... comments=""' prometheus-default-values.yaml
sed -i '1i ---' prometheus-default-values.yaml
```
作成した設定ファイルを使ってPrometheusをインストールする。
```
export NAMESPACE=my-packages
tanzu package install prometheus \
--package-name prometheus.tanzu.vmware.com \
--version $PROMETHEUS_VER \
--values-file prometheus-default-values.yaml \
--namespace $NAMESPACE
--create-namespace
```

公式ドキュメントによると、vSphere with Tanzuの場合、インストールのコマンドが`Failed to get final advertise address: No private IP address found, and explicit IP not provided.`というエラーメッセージとともにエラーで返ることがある模様。当方が検証した際は発生しなかったが、発生する場合はAlertManagerの引数を書き換えるoverlayを当てる必要がある。（詳細は[こちら](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.6/vmware-tanzu-kubernetes-grid-16/GUID-packages-prometheus.html#deploy-prometheus-with-custom-values-5)参照）


## 動作確認
今回はContourを利用しているため、HTTPProxyリソースが作成されている。
```
$ kubectl get httpproxy -n tanzu-system-monitoring
NAME                   FQDN                   TLS SECRET       STATUS   STATUS DESCRIPTION
prometheus-httpproxy   prometheus.tkg.tanzu   prometheus-tls   valid    Valid HTTPProxy
```
Contourの場合のEndPointはEnvoyとなる。
```
$ kubectl get svc -n tanzu-system-ingress envoy
NAME    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
envoy   LoadBalancer   10.102.115.203   10.220.46.101   80:30763/TCP,443:31909/TCP   15h
```
試しに通信してみると、通信できていることが分かる。
```
$ curl  -H "Host: prometheus.tkg.tanzu" 10.220.46.101 --head
HTTP/1.1 301 Moved Permanently
location: https://prometheus.tkg.tanzu/
vary: Accept-Encoding
date: Tue, 01 Nov 2022 10:15:37 GMT
server: envoy
transfer-encoding: chunked
```

DNSサーバにIPとFQDNを登録してブラウザでアクセスすると、以下のようにPrometheusの画面にもアクセス出来る。

![1667297832334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/d4f4c671-0391-46bf-0302-6c328940fbc1.png)