zaki work log

作業ログやら生活ログやらなんやら

Helmチャートを使ったPrometheusのデプロイ (Prometheus Operator編)

(11/14 追記) 記事作成時よくわかってなかったけど、本記事では「Helmを使ってPrometheus Operatorをデプロイ、デプロイされたPrometheus OperatorがPrometheusやGrafanaをデプロイしている」という構成でした。
これを踏まえてタイトル含め少し加筆修正。

非Operator構成の場合は下記参照。

zaki-hmkc.hatenablog.com


Prometheus Operatorを使ったデプロイはマニフェストファイル使って簡単にできるけど、Helmチャート版もあるので試してみた。

github.com

環境

Helmはちょっと古い…
(現在の最新は3.3.4。な阪)

[zaki@cloud-dev ~]$ helm version --short
v3.2.4+g0ad800e

クラスターはkindを使って作ったばかりでまっさらなものを用意。

[zaki@cloud-dev ~]$ kubectl version --short
Client Version: v1.19.2
Server Version: v1.18.2
[zaki@cloud-dev ~]$ helm ls -A
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION

リポジトリ追加

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

before

[zaki@cloud-dev ~]$ helm repo list
NAME    URL                                              
stable  https://kubernetes-charts.storage.googleapis.com/

追加

[zaki@cloud-dev ~]$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories
[zaki@cloud-dev ~]$ helm repo list
NAME                    URL                                               
stable                  https://kubernetes-charts.storage.googleapis.com/ 
prometheus-community    https://prometheus-community.github.io/helm-charts

チャートを検索

[zaki@cloud-dev ~]$ helm search repo prometheus-community
NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
prometheus-community/alertmanager                       0.1.1           v0.21.0         The Alertmanager handles alerts sent by client ...
prometheus-community/kube-prometheus-stack              10.1.0          0.42.1          kube-prometheus-stack collects Kubernetes manif...
prometheus-community/prometheus                         11.16.2         2.21.0          Prometheus is a monitoring system and time seri...
prometheus-community/prometheus-adapter                 2.7.0           v0.7.0          A Helm chart for k8s prometheus adapter           
prometheus-community/prometheus-blackbox-exporter       4.7.0           0.17.0          Prometheus Blackbox Exporter                      
prometheus-community/prometheus-cloudwatch-expo...      0.9.0           0.8.0           A Helm chart for prometheus cloudwatch-exporter   
prometheus-community/prometheus-consul-exporter         0.2.0           0.4.0           A Helm chart for the Prometheus Consul Exporter   
prometheus-community/prometheus-couchdb-exporter        0.1.2           1.0             A Helm chart to export the metrics from couchdb...
prometheus-community/prometheus-druid-exporter          0.8.0           v0.8.0          Druid exporter to monitor druid metrics with Pr...
prometheus-community/prometheus-mongodb-exporter        2.8.1           v0.10.0         A Prometheus exporter for MongoDB metrics         
prometheus-community/prometheus-mysql-exporter          1.0.0           v0.12.1         A Helm chart for prometheus mysql exporter with...
prometheus-community/prometheus-nats-exporter           2.5.1           0.6.2           A Helm chart for prometheus-nats-exporter         
prometheus-community/prometheus-node-exporter           1.11.2          1.0.1           A Helm chart for prometheus node-exporter         
prometheus-community/prometheus-operator                9.3.2           0.38.1          DEPRECATED - This chart will be renamed. See ht...
prometheus-community/prometheus-postgres-exporter       1.3.3           0.8.0           A Helm chart for prometheus postgres-exporter     
prometheus-community/prometheus-pushgateway             1.4.2           1.2.0           A Helm chart for prometheus pushgateway           
prometheus-community/prometheus-rabbitmq-exporter       0.5.6           v0.29.0         Rabbitmq metrics exporter for prometheus          
prometheus-community/prometheus-redis-exporter          3.6.0           1.11.1          Prometheus exporter for Redis metrics             
prometheus-community/prometheus-snmp-exporter           0.0.6           0.14.0          Prometheus SNMP Exporter                          
prometheus-community/prometheus-to-sd                   0.3.1           0.5.2           Scrape metrics stored in prometheus format and ...

なるほど、色々ありますね。

で、ここからどれをインストールすればいいかは特に載ってないけど、prometheus-community/prometheus-operatorってあるからこれを入れれば楽なんだろ?と思ったんだけど、descriptionのとこ見たら思いっきり"DEPRECATED"と書いてあるのでスルー。

名前の感じからすると、prometheus-community/kube-prometheus-stackが良い感じに入りそう。
(11/14追記。このチャートをインストールすると、Prometheus Operatorがデプロイされる。prometheus-community/prometheusはPrometheus単体(依存でnode exporterなども入る)がインストールされる)

kube-prometheus-stack

github.com

Installs the kube-prometheus stack, a collection of Kubernetes manifests, Grafana dashboards, and Prometheus rules combined with documentation and scripts to provide easy to operate end-to-end Kubernetes cluster monitoring with Prometheus using the Prometheus Operator.

うん、オールインワンで入るって感じ。
というかこれの前身がprometheus-operatorとのこと。

リポジトリ追加

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add stable https://kubernetes-charts.storage.googleapis.com/

ドキュメントにはこの通り記載はあるけど、どちらもすでに実行済みなので省略。(stableはHelmインストール時のチュートリアルで100人中120人くらいはやってるはず)

helm repo update

あとはリポジトリをアップデートしておく。

[zaki@cloud-dev ~]$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "prometheus-community" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈ 

チャートのインストール

ドキュメントには特にネームスペースの指定はないが、Operatorを使ったインストール時の構成に倣ってmonitoringネームスペースを作ってそこにデプロイしてみる。

[zaki@cloud-dev ~]$ kubectl create ns monitoring
namespace/monitoring created
[zaki@cloud-dev ~]$ helm install prometheus-stack prometheus-community/kube-prometheus-stack -n monitoring
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"

こんな感じでインストールが始まる。(そこそこ時間かかった)
別ターミナルでpodの状態を見るとこんな感じ。

[zaki@cloud-dev prometheus]$ kc get pod -n monitoring
NAME                                                     READY   STATUS              RESTARTS   AGE
alertmanager-prometheus-stack-kube-prom-alertmanager-0   0/2     ContainerCreating   0          70s
prometheus-prometheus-stack-kube-prom-prometheus-0       0/3     ContainerCreating   0          65s
prometheus-stack-grafana-67d44fddcd-l5cvz                0/2     PodInitializing     0          88s
prometheus-stack-kube-prom-admission-patch-vbnb4         0/1     Completed           0          83s
prometheus-stack-kube-prom-operator-88b8c6745-8ntq8      2/2     Running             0          88s
prometheus-stack-kube-state-metrics-bbdb95c45-vmh2s      1/1     Running             0          88s
prometheus-stack-prometheus-node-exporter-6rw25          1/1     Running             0          88s
prometheus-stack-prometheus-node-exporter-7jkb6          1/1     Running             0          88s
prometheus-stack-prometheus-node-exporter-nlgf2          1/1     Running             0          88s

もうしばらく待つと完了。
("skipping unknown hook"と出てるのは、、、なんだろう?)

[zaki@cloud-dev ~]$ helm install prometheus-stack prometheus-community/kube-prometheus-stack -n monitoring
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
NAME: prometheus-stack
LAST DEPLOYED: Thu Oct 15 23:36:19 2020
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace monitoring get pods -l "release=prometheus-stack"

Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
[zaki@cloud-dev ~]$ helm ls -n monitoring
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
prometheus-stack        monitoring      1               2020-10-15 23:36:19.899109278 +0900 JST deployed        kube-prometheus-stack-10.1.0    0.42.1     
[zaki@cloud-dev ~]$ kc get pod,svc -n monitoring 
NAME                                                         READY   STATUS    RESTARTS   AGE
pod/alertmanager-prometheus-stack-kube-prom-alertmanager-0   2/2     Running   0          3m46s
pod/prometheus-prometheus-stack-kube-prom-prometheus-0       3/3     Running   1          3m41s
pod/prometheus-stack-grafana-67d44fddcd-l5cvz                2/2     Running   0          4m4s
pod/prometheus-stack-kube-prom-operator-88b8c6745-8ntq8      2/2     Running   0          4m4s
pod/prometheus-stack-kube-state-metrics-bbdb95c45-vmh2s      1/1     Running   0          4m4s
pod/prometheus-stack-prometheus-node-exporter-6rw25          1/1     Running   0          4m4s
pod/prometheus-stack-prometheus-node-exporter-7jkb6          1/1     Running   0          4m4s
pod/prometheus-stack-prometheus-node-exporter-nlgf2          1/1     Running   0          4m4s

NAME                                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/alertmanager-operated                       ClusterIP   None             <none>        9093/TCP,9094/TCP,9094/UDP   3m48s
service/prometheus-operated                         ClusterIP   None             <none>        9090/TCP                     3m41s
service/prometheus-stack-grafana                    ClusterIP   10.109.142.166   <none>        80/TCP                       4m4s
service/prometheus-stack-kube-prom-alertmanager     ClusterIP   10.108.73.186    <none>        9093/TCP                     4m5s
service/prometheus-stack-kube-prom-operator         ClusterIP   10.96.43.230     <none>        8080/TCP,443/TCP             4m4s
service/prometheus-stack-kube-prom-prometheus       ClusterIP   10.97.2.124      <none>        9090/TCP                     4m5s
service/prometheus-stack-kube-state-metrics         ClusterIP   10.99.165.64     <none>        8080/TCP                     4m5s
service/prometheus-stack-prometheus-node-exporter   ClusterIP   10.100.97.230    <none>        9100/TCP                     4m4s

デプロイが完了した。

webアクセス

Serviceの名前とポート番号から判断して、Prometheusのwebダッシュボードにアクセスするのはservice/prometheus-stack-kube-prom-prometheusぽいので、今回はNodePortに設定してアクセスしてみる。

[zaki@cloud-dev ~]$ kubectl patch svc -n monitoring prometheus-stack-kube-prom-prometheus -p '{"spec": {"type": "NodePort"}}'
service/prometheus-stack-kube-prom-prometheus patched
[zaki@cloud-dev ~]$ kc get svc -n monitoring prometheus-stack-kube-prom-prometheus 
NAME                                    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
prometheus-stack-kube-prom-prometheus   NodePort   10.105.115.194   <none>        9090:32563/TCP   8m20s
[zaki@cloud-dev ~]$ kc get node -o wide
NAME                         STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION                CONTAINER-RUNTIME
helm-cluster-control-plane   Ready    master   80m   v1.18.2   172.20.0.10   <none>        Ubuntu 19.10   3.10.0-1127.19.1.el7.x86_64   containerd://1.3.3-14-g449e9269
helm-cluster-worker          Ready    <none>   79m   v1.18.2   172.20.0.8    <none>        Ubuntu 19.10   3.10.0-1127.19.1.el7.x86_64   containerd://1.3.3-14-g449e9269
helm-cluster-worker2         Ready    <none>   79m   v1.18.2   172.20.0.9    <none>        Ubuntu 19.10   3.10.0-1127.19.1.el7.x86_64   containerd://1.3.3-14-g449e9269
[zaki@cloud-dev ~]$ curl 172.20.0.8:32563
<a href="/graph">Found</a>.

こんな感じ。

ブラウザでアクセスしてTargetsを確認するとこの通り。(***-stack-kube-***と見えてる)

f:id:zaki-hmkc:20201016000318p:plain

node_load1のグラフを出すとこんな感じ。

f:id:zaki-hmkc:20201016000541p:plain

Grafana

Prometheus本体と同じ要領でprometheus-stack-grafanaというServiceがあるので、これもNodePortでアクセスできるようにする。

[zaki@cloud-dev ~]$ kubectl patch svc -n monitoring prometheus-stack-grafana -p '{"spec": {"type": "NodePort"}}'
service/prometheus-stack-grafana patched
[zaki@cloud-dev ~]$ kc get svc -n monitoring prometheus-stack-grafana
NAME                       TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
prometheus-stack-grafana   NodePort   10.104.100.245   <none>        80:31929/TCP   18m

f:id:zaki-hmkc:20201016000923p:plain

Operatorでインストールした時と同じく、username: admin / password: admin で初期ログインできると思いきや、Invalid username or passwordに!!

secretにパスワードが入ってるのでそこからチェックすると

[zaki@cloud-dev ~]$ kc get secret -n monitoring prometheus-stack-grafana -o jsonpath='{.data.admin-password}' | base64 -d; echo
prom-operator
[zaki@cloud-dev ~]$ kc get secret -n monitoring prometheus-stack-grafana -o jsonpath='{.data.admin-user}' | base64 -d; echo
admin

という感じでログインできる。
どこでこれ定義しているかというと、ユーザー名については依存で入るGrafana本体のHelmチャートのvalues.yamlで、パスワードについてはkube-prometheus-stackのHelmチャートのvalues.yamlになっている。多分。

f:id:zaki-hmkc:20201016002409p:plain

metrics server

この時点ではまだメトリクスサーバーとして認識されていない

[zaki@cloud-dev ~]$ kubectl describe apiservice v1beta1.metrics.k8s.io
Error from server (NotFound): apiservices.apiregistration.k8s.io "v1beta1.metrics.k8s.io" not found

ので、topも使えない

[zaki@cloud-dev ~]$ kc top node
error: Metrics API not available

こちらはちょっと課題かな。

(残件?) unhealthyの項目

実はTargetsの一覧を見ると、一部のメトリクス取得に失敗しており、Healthyになっていない。
なんだろうな、これ。
未調査。(力尽きた)

f:id:zaki-hmkc:20201016003328p:plain