Thanos Operatorを使ってみる

# tldr

k8sのモニタリング環境をThanos Operatorを使って構築してみました。

# 環境

Kubernetes

```
1.16.10-gke.8
```

Helm

```
version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"}
```

# Thanosとは

[公式ページ](https://thanos.io/)を参照ください。

# Thanos Operatorとは

Thanosのコンポーネント群をシンプルかつより安全に構築・運用するためにのサービスです。
Thanos Helm Chartを公開しているbanzai cloudが開発しています。

https://github.com/banzaicloud/thanos-operator/

# 環境構築

Prometheus + Thanos sidecarはPrometheus Operatorを使って構築します。

Prometheus Operatorやk8sまわりのexporterをどんと用意する方法は

- kube-prometheus
- Prometheus Operator helm chart

がありますが、２つとも目標としていることはk8sのモニタリングの各コンポーネントを簡単に管理することです。雰囲気そんな感じです。
今回はPrometheus Operator helm chartを使用します。

https://github.com/coreos/prometheus-operator

## クラスタ用意

省略。GKEを使います

モニタリング用のNamespaceを作成。

```sh
kubectl create namespace monitoring
```

## Thanosのデプロイ

Thanosがメトリクスを永続化するGCS Bucket作成します。

```sh
gsutil mb -c multi_regional -l Asia gs://${PROJECT_ID}-thanos
```

Thanos用のサービスアカウントを作成してキーをダウンロードします。

```sh
export SERVICE_ACCOUNT_JSON_THANOS="serviceaccount-key-thanos.json"
gcloud iam service-accounts create thanos --display-name "Thanos"
export SERVICE_ACCOUNT_ID_THANOS=thanos@${PROJECT_ID}.iam.gserviceaccount.com

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${SERVICE_ACCOUNT_ID_THANOS} \
  --role 'roles/storage.objectCreator'
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${SERVICE_ACCOUNT_ID_THANOS} \
  --role 'roles/storage.objectViewer'

gcloud iam service-accounts keys create ${SERVICE_ACCOUNT_JSON_THANOS} --iam-account=${SERVICE_ACCOUNT_ID_THANOS}
```

Bucketとサービスアカウントのキーが入ったSecretファイルを用意します。

```yaml
type: GCS
config:
  bucket: "XXXX-thanos"
  service_account: |-
    {
      "type": "service_account",
      "project_id": "XXXX",
      "private_key_id": "XXX",
      "private_key": "-----BEGIN PRIVATE KEY-----\nXXX\n-----END PRIVATE KEY-----\n",
      "client_email": "thanos@XXXX.iam.gserviceaccount.com",
      "client_id": "XXXX",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://oauth2.googleapis.com/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/thanos@XXXX.iam.gserviceaccount.com"
    }
```

シークレットを作成

```sh
kubectl create secret generic thanos -n monitor --from-file=object-store.yaml=./kube/monitor/thanos/objectstore-secret.yaml
```

Thanos Operatorをデプロイ

```sh
helm install thanos-operator --namespace monitor banzaicloud-stable/thanos-operator --set manageCrds=false
```

Thanosクラスタのデプロイ

```sh
kubectl apply -n monitor -f ./kube/monitor/thanos/thanos.yaml
kubectl apply -n monitor -f ./kube/monitor/thanos/objectstore.yaml
kubectl apply -n monitor -f ./kube/monitor/thanos/storeendpoint.yaml
```

## Prometheusのデプロイ


Thanosをサイドカーで追加します。


```yaml
prometheus:
  prometheusSpec:
    thanos:
      image: quay.io/thanos/thanos:v0.12.2
      version: v0.12.2
      objectStorageConfig:
        name: thanos
        key: object-store.yaml
```

```sh
helm install prometheus-operator -n monitor stable/prometheus-operator -f ./kube/monitor/prometheus-operator/values.yaml
```

全部立ち上がったのを確認

```sh
NAME                                                       READY   STATUS    RESTARTS   AGE
alertmanager-prometheus-operator-alertmanager-0            2/2     Running   0          7m12s
objectstore-sample-bucket-855b8bc7fc-snzml                 1/1     Running   0          11m
objectstore-sample-compactor-6ff654c4b5-xgcmf              1/1     Running   0          11m
prometheus-operator-grafana-8589c4455b-rrktb               2/2     Running   0          7m25s
prometheus-operator-kube-state-metrics-66b4c95cd9-wh6s5    1/1     Running   0          7m25s
prometheus-operator-operator-5866d665cb-674q9              2/2     Running   0          7m25s
prometheus-operator-prometheus-node-exporter-gt5qm         1/1     Running   0          7m25s
prometheus-prometheus-operator-prometheus-0                4/4     Running   1          7m2s
thanos-operator-84b5b97494-7f56f                           1/1     Running   0          22m
thanos-sample-query-7b765646c-jpwcq                        1/1     Running   0          10m
thanos-sample-storeendpoint-sample-rule-0                  1/1     Running   0          10m
thanos-sample-storeendpoint-sample-store-9754c664f-tkq2x   1/1     Running   0          10m
```

QueryのUIにアクセスするとprometheusがちゃんと認識されており、クエリもできたました。

# 感想

構築自体は結構簡単でした。これでk8sのモニタリングクラスタを構築するのがだいぶ楽になった気がします。
実際に本番で試してみてどこまでシンプルな状態を保ったまま構築・運用できるか試してみたいです。