zaki work log

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

Helmチャートを使ったPrometheus + Grafanaデプロイ (非Operator構成編)

Helmチャートを使ってPrometheusをインストールする、その2

前回のはあまり前提を把握できてなく勢いでデプロイしたけど、「Helmを使ってPrometheus Operatorをデプロイ」していたので、今回はOperator無しのPrometheusをデプロイする。

zaki-hmkc.hatenablog.com

[zaki@cloud-dev ~]$ helm search repo prometheus-community
NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
prometheus-community/kube-prometheus-stack              11.1.1          0.43.2          kube-prometheus-stack collects Kubernetes manif...
prometheus-community/prometheus                         11.16.8         2.21.0          Prometheus is a monitoring system and time seri...

[...]

[zaki@cloud-dev ~]$ 

要は、前回はこのprometheus-community/kube-prometheus-stackを使ってOperatorインストール→OperatorによるPrometheusデプロイ、という手順になっていたけど、今回はprometheus-community/prometheusを入れてみよう、という話。

環境

[zaki@cloud-dev helm-prometheus]$ kubectl version --short
Client Version: v1.19.3
Server Version: v1.19.1
[zaki@cloud-dev helm-prometheus]$ helm version --short
v3.4.1+gc4e7485

kindで作った1.19クラスターにHelmは最新です。

そういやHelmリポジトリhttps://kubernetes-charts.storage.googleapis.com はサービス終了したみたいですね。
Helm 3.4.1でkubernetes-charts.storage.googleapis.comリポジトリ設定されている状態でコマンド実行すると警告が表示されます。
(Helm CLIバージョンが3.3.4以下だと出ません)

[zaki@cloud-dev ~]$ helm repo list
WARNING: "kubernetes-charts.storage.googleapis.com" is deprecated for "stable" and will be deleted Nov. 13, 2020.
WARNING: You should switch to "https://charts.helm.sh/stable" via:
WARNING: helm repo add "stable" "https://charts.helm.sh/stable" --force-update
NAME    URL                                             
stable  https://kubernetes-charts.storage.googleapis.com

違い

Helm用のカスタマイズYAMLの内容がだいぶ違う

[zaki@cloud-dev ~]$ helm show values prometheus-community/kube-prometheus-stack  | wc -l
2194
[zaki@cloud-dev ~]$ helm show values prometheus-community/prometheus  | wc -l
1610

設定内容

全部を見たわけではないけれど、Operatorを使用しないバージョンでも、AlertManagerやNodeExporter、configmapReloadなど最小限のスタック構成でデプロイされる。

$ helm show values prometheus-community/prometheus | grep ^[a-z]
rbac:
podSecurityPolicy:
imagePullSecrets:
serviceAccounts:
alertmanager:
configmapReload:
kubeStateMetrics:
nodeExporter:
server:
pushgateway:
alertmanagerFiles:
serverFiles:
extraScrapeConfigs:
alertRelabelConfigs:
networkPolicy:
forceNamespace: null

alertmanagernodeExporterなど、まとめてデプロイできるものもある。

とりあえずデフォルトでデプロイ

[zaki@cloud-dev helm-prometheus]$ helm install prometheus -n monitoring --create-namespace prometheus-community/prometheus
W1112 23:47:36.178461 3044310 warnings.go:67] rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
W1112 23:47:36.181509 3044310 warnings.go:67] rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
W1112 23:47:36.243036 3044310 warnings.go:67] rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
W1112 23:47:36.246129 3044310 warnings.go:67] rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
NAME: prometheus
LAST DEPLOYED: Thu Nov 12 23:47:36 2020
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-server.monitoring.svc.cluster.local


Get the Prometheus server URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace monitoring -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace monitoring port-forward $POD_NAME 9090


The Prometheus alertmanager can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-alertmanager.monitoring.svc.cluster.local


Get the Alertmanager URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace monitoring -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace monitoring port-forward $POD_NAME 9093
#################################################################################
######   WARNING: Pod Security Policy has been moved to a global property.  #####
######            use .Values.podSecurityPolicy.enabled with pod-based      #####
######            annotations                                               #####
######            (e.g. .Values.nodeExporter.podSecurityPolicy.annotations) #####
#################################################################################


The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:
prometheus-pushgateway.monitoring.svc.cluster.local


Get the PushGateway URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace monitoring -l "app=prometheus,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace monitoring port-forward $POD_NAME 9091

For more information on running Prometheus, visit:
https://prometheus.io/
[zaki@cloud-dev helm-prometheus]$ helm ls -n monitoring 
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
prometheus      monitoring      1               2020-11-12 23:47:36.030874185 +0900 JST deployed        prometheus-11.16.8      2.21.0     
[zaki@cloud-dev helm-prometheus]$ kubectl get pod -n monitoring 
NAME                                            READY   STATUS              RESTARTS   AGE
prometheus-alertmanager-57cdddd49-zwmts         0/2     ContainerCreating   0          17s
prometheus-kube-state-metrics-95d956569-mmdqd   1/1     Running             0          17s
prometheus-node-exporter-6nw7c                  1/1     Running             0          17s
prometheus-node-exporter-kkswf                  1/1     Running             0          17s
prometheus-pushgateway-5b7f66965c-n97gz         1/1     Running             0          17s
prometheus-server-585959fdd4-npr2t              0/2     ContainerCreating   0          17s

このとおりデプロイされた

[zaki@cloud-dev helm-prometheus]$ kubectl get pod -n monitoring 
NAME                                            READY   STATUS    RESTARTS   AGE
prometheus-alertmanager-57cdddd49-zwmts         1/2     Running   0          20s
prometheus-kube-state-metrics-95d956569-mmdqd   1/1     Running   0          20s
prometheus-node-exporter-6nw7c                  1/1     Running   0          20s
prometheus-node-exporter-kkswf                  1/1     Running   0          20s
prometheus-pushgateway-5b7f66965c-n97gz         1/1     Running   0          20s
prometheus-server-585959fdd4-npr2t              1/2     Running   0          20s

ストレージはAlertManagerPrometheus本体がデフォルトで使用するようになっている。
(falseにすればemptyDirが使用される。未確認)

[zaki@cloud-dev helm-prometheus]$ kc get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                STORAGECLASS   REASON   AGE
pvc-570a78aa-2548-4ba0-8138-574ca4e57988   8Gi        RWO            Delete           Bound    monitoring/prometheus-server         standard                57s
pvc-b96f1560-ff51-45f5-8d13-b4638d0eeb1c   2Gi        RWO            Delete           Bound    monitoring/prometheus-alertmanager   standard                56s

Service一覧

[zaki@cloud-dev helm-prometheus]$ kc get svc -n monitoring 
NAME                            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
prometheus-alertmanager         ClusterIP   10.96.8.183    <none>        80/TCP     72s
prometheus-kube-state-metrics   ClusterIP   10.96.230.26   <none>        8080/TCP   72s
prometheus-node-exporter        ClusterIP   None           <none>        9100/TCP   72s
prometheus-pushgateway          ClusterIP   10.96.8.65     <none>        9091/TCP   72s
prometheus-server               ClusterIP   10.96.21.3     <none>        80/TCP     72s

デプロイされるコンポーネントのon/off

runningなpod再掲

[zaki@cloud-dev helm-prometheus]$ kubectl get pod -n monitoring 
NAME                                            READY   STATUS    RESTARTS   AGE
prometheus-alertmanager-57cdddd49-zwmts         1/2     Running   0          20s
prometheus-kube-state-metrics-95d956569-mmdqd   1/1     Running   0          20s
prometheus-node-exporter-6nw7c                  1/1     Running   0          20s
prometheus-node-exporter-kkswf                  1/1     Running   0          20s
prometheus-pushgateway-5b7f66965c-n97gz         1/1     Running   0          20s
prometheus-server-585959fdd4-npr2t              1/2     Running   0          20s

Prometheus本体(prometheus-server)以外に、以下のものが動いている。

それぞれのコンポーネントは、チャートのカスタマイズYAMLでデプロイするかどうかが設定可能で、デフォルトで4項目ともenabled: trueになっている。

不要な場合はfalseにする。

例えば、こんなcommunity-prometheus-component.yamlを用意すれば、

alertmanager:
  enabled: true

kubeStateMetrics:
  ## If false, kube-state-metrics sub-chart will not be installed
  ##
  enabled: true

nodeExporter:
  ## If false, node-exporter will not be installed
  ##
  enabled: true

server:
  ## Prometheus server container name
  ##
  enabled: true

pushgateway:
  ## If false, pushgateway will not be installed
  ##
  enabled: true
$ helm upgrade prometheus -n monitoring --create-namespace prometheus-community/prometheus -f community-prometheus-component.yaml
[zaki@cloud-dev helm-prometheus]$ kc get pod -n monitoring 
NAME                                            READY   STATUS        RESTARTS   AGE
prometheus-alertmanager-57cdddd49-zwmts         0/2     Terminating   0          17m
prometheus-kube-state-metrics-95d956569-mmdqd   0/1     Terminating   0          17m
prometheus-node-exporter-6nw7c                  1/1     Running       0          17m
prometheus-node-exporter-kkswf                  1/1     Running       0          17m
prometheus-pushgateway-5b7f66965c-n97gz         0/1     Terminating   0          17m
prometheus-server-585959fdd4-npr2t              2/2     Running       0          17m

というか、Prometheus本体もfalseに設定ができる。
(その場合は入れたいコンポーネント個別のHelmチャートをインストールすればいいはずなので、この設定にする必要性は…どうなんだろ?)

[zaki@cloud-dev helm-prometheus]$ kc get pod -n monitoring 
NAME                                 READY   STATUS        RESTARTS   AGE
prometheus-node-exporter-6nw7c       1/1     Running       0          18m
prometheus-node-exporter-kkswf       1/1     Running       0          18m
prometheus-server-585959fdd4-npr2t   0/2     Terminating   0          18m

PrometheusのServiceリソース

デフォルトだとClusterIPでデプロイされる。
例えばLoadBalancerにするには、server.service.typeの値をLoadBalancerに変更すれば良い。

[zaki@cloud-dev helm-prometheus]$ kc get svc -n monitoring 
NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
prometheus-alertmanager         ClusterIP      10.96.14.82     <none>           80/TCP         5m11s
prometheus-kube-state-metrics   ClusterIP      10.96.116.243   <none>           8080/TCP       5m11s
prometheus-node-exporter        ClusterIP      None            <none>           9100/TCP       25m
prometheus-pushgateway          ClusterIP      10.96.176.224   <none>           9091/TCP       5m11s
prometheus-server               LoadBalancer   10.96.162.246   172.20.220.100   80:30357/TCP   5m11s

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

Grafanaを追加

Prometheusだけだと(カスタマイズYAMLにも特にないので)Grafanaはデプロイされない。
なので、使用する場合は追加でデプロイする。

が、実はPrometheus OperatorはGrafanaを勝手にデプロイしてくれるけど、Grafana単体をデプロイしようとすると、Prometheus用のHelmリポジトリには実は含まれていない。
(https://charts.helm.sh/stable には含まれているがDeprecated)

じゃあどこにあるかと探してみると、Grafanaのコミュニティリポジトリがあった。

https://github.com/grafana/helm-charts

[zaki@cloud-dev helm-prometheus]$ helm repo add grafana https://grafana.github.io/helm-charts
"grafana" has been added to your repositories
[zaki@cloud-dev helm-prometheus]$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "grafana" chart repository
...Successfully got an update from the "rook-release" chart repository
...Successfully got an update from the "prometheus-community" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
[zaki@cloud-dev helm-prometheus]$ 
[zaki@cloud-dev helm-prometheus]$ helm search repo grafana
NAME                                            CHART VERSION   APP VERSION     DESCRIPTION                                       
grafana/grafana                                 6.1.4           7.3.1           The leading tool for querying and visualizing t...
stable/grafana                                  5.5.7           7.1.1           DEPRECATED - The leading tool for querying and ...
prometheus-community/kube-prometheus-stack      11.1.1          0.43.2          kube-prometheus-stack collects Kubernetes manif...
prometheus-community/prometheus-druid-exporter  0.8.1           v0.8.0          Druid exporter to monitor druid metrics with Pr...

はい。

[zaki@cloud-dev helm-prometheus]$ helm install grafana -n monitoring --create-namespace grafana/grafana -f grafana-config.yaml 
W1113 00:38:05.891246 3071302 warnings.go:67] rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Role
W1113 00:38:05.892794 3071302 warnings.go:67] rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding
W1113 00:38:05.939252 3071302 warnings.go:67] rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Role
W1113 00:38:05.941381 3071302 warnings.go:67] rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding
NAME: grafana
LAST DEPLOYED: Fri Nov 13 00:38:05 2020
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:

   kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana.monitoring.svc.cluster.local

   Get the Grafana URL to visit by running these commands in the same shell:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch the status of by running 'kubectl get svc --namespace monitoring -w grafana'
     export SERVICE_IP=$(kubectl get svc --namespace monitoring grafana -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
     http://$SERVICE_IP:80

3. Login with the password from step 1 and the username: admin
#################################################################################
######   WARNING: Persistence is disabled!!! You will lose your data when   #####
######            the Grafana pod is terminated.                            #####
#################################################################################
[zaki@cloud-dev helm-prometheus]$ helm ls -n monitoring 
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
grafana         monitoring      1               2020-11-13 00:38:05.772250806 +0900 JST deployed        grafana-6.1.4           7.3.1      
prometheus      monitoring      5               2020-11-13 00:12:35.410043984 +0900 JST deployed        prometheus-11.16.8      2.21.0     
[zaki@cloud-dev helm-prometheus]$ kubectl get pod -n monitoring 
NAME                                            READY   STATUS    RESTARTS   AGE
grafana-69469d4cc8-4jzrl                        1/1     Running   0          7s
prometheus-alertmanager-57cdddd49-h7485         2/2     Running   0          30m
prometheus-kube-state-metrics-95d956569-wj2wp   1/1     Running   0          30m
prometheus-node-exporter-6nw7c                  1/1     Running   0          50m
prometheus-node-exporter-kkswf                  1/1     Running   0          50m
prometheus-pushgateway-5b7f66965c-78ccd         1/1     Running   0          30m
prometheus-server-585959fdd4-ddp7k              2/2     Running   0          30m
[zaki@cloud-dev helm-prometheus]$ kc get svc -n monitoring 
NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
grafana                         LoadBalancer   10.96.24.52     172.20.220.101   80:30819/TCP   13s
prometheus-alertmanager         ClusterIP      10.96.14.82     <none>           80/TCP         30m
prometheus-kube-state-metrics   ClusterIP      10.96.116.243   <none>           8080/TCP       30m
prometheus-node-exporter        ClusterIP      None            <none>           9100/TCP       50m
prometheus-pushgateway          ClusterIP      10.96.176.224   <none>           9091/TCP       30m
prometheus-server               LoadBalancer   10.96.162.246   172.20.220.100   80:30357/TCP   30m
[zaki@cloud-dev helm-prometheus]$ 

Grafanaのログイン情報

デフォルトだと、adminのユーザー名はadminだが、パスワードは自動でランダムな文字列が設定される。
パスワードを固定の文字列に設定したい場合は、カスタマイズYAMLに設定すれば良い。(はず。未確認)

デフォルトのランダムなパスワードにしている場合は、helm installの出力に確認するためのコマンドが表示されてるので、実行すればわかる。

[zaki@cloud-dev helm-prometheus]$ kubectl get secret -n monitoring grafana -o jsonpath='{.data.admin-user}' | base64 -d; echo
admin
[zaki@cloud-dev helm-prometheus]$ kubectl get secret -n monitoring grafana -o jsonpath='{.data.admin-password}' | base64 -d; echo
AogEjq07n00OHyn0gzaZHZbQTMIDrlns56Bwvudy

ダッシュボードの作成

デプロイされているPrometheusのServiceリソース名はprometheus-serverで、ポートは80なので、データソースのURLは(同じネームスペースなのでService名のみで)http://prometheus-serverを入力。

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

※ ちなみにprometheusをデプロイした時に設定情報は出力されていた

The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-server.monitoring.svc.cluster.local

見えてますね。(グラフの線を出すためのメトリクス値収集のために1日半ほど放置してましたw)

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

metrics server

下記参照

zaki-hmkc.hatenablog.com