Helmチャートを使ってPrometheusをインストールする、その2
前回のはあまり前提を把握できてなく勢いでデプロイしたけど、「Helmを使ってPrometheus Operatorをデプロイ」していたので、今回はOperator無しのPrometheusをデプロイする。
[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 3.4.1だとコマンドで制限してるのかな。
— z a k i (@zaki_hmkc) 2020年11月12日
helm 3.3.4だと大丈夫だった。
阪神関係ない pic.twitter.com/tZNMq8N64K
違い
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
alertmanager
やnodeExporter
など、まとめてデプロイできるものもある。
とりあえずデフォルトでデプロイ
[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
ストレージはAlertManagerとPrometheus本体がデフォルトで使用するようになっている。
(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
)以外に、以下のものが動いている。
- prometheus-alertmanager
- prometheus-kube-state-metrics
- prometheus-node-exporter
- prometheus-pushgateway
それぞれのコンポーネントは、チャートのカスタマイズ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
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
を入力。
※ ちなみに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)
metrics server
下記参照