Prometheus は、クラウドネイティブアプリケーション向けのオープンソースモニタリングツールです。このトピックでは、ACK クラスターに Prometheus をデプロイする方法について説明します。
背景情報
このトピックでは、Kubernetes クラスター内のシステムコンポーネントとリソースエンティティを監視する方法について説明します。監視ターゲットは、2 つのカテゴリに分類されます:
-
リソースモニタリング:ノード、クラスター、および Pod のリソース使用状況を追跡します。
-
アプリケーションモニタリング:リアルタイムのユーザー数などの内部アプリケーションメトリクスを追跡します。ポートを公開して、アプリケーションレベルのモニタリングとアラートを有効にします。
監視ターゲットは次のとおりです:
-
システムコンポーネント:API Server、cloud-controller-manager、etcd などの組み込み Kubernetes コンポーネント。それぞれの設定ファイルでモニタリングを設定します。
-
静的リソースエンティティ:ノードステータスやカーネルイベントなどのリソース。設定ファイルでこれらを指定して、モニタリングを有効にします。
-
動的リソースエンティティ:Deployment、DaemonSet、Pod などの Kubernetes ワークロードオブジェクト。Prometheus をデプロイしてこれらを監視します。
-
カスタムアプリケーション:ポートを公開し、Prometheus を使用してアプリケーションからカスタムメトリクスを収集します。
手順1:オープンソース Prometheus のデプロイ
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
-
Helm ページで、 デプロイ をクリックします。[Chart] セクションで、 ack-prometheus-operator を検索して選択し、デフォルト設定のまま 次へ をクリックします。
-
デフォルトでは、コンポーネントは monitoring 名前空間にインストールされ、コンポーネントにちなんで名付けられます。
-
必要に応じて、アプリケーション名と名前空間をカスタマイズします。
-
-
パラメーター ページで、Chart バージョン 12.0.0 を選択し、必要なパラメーターを設定してから、 OK をクリックします。
バージョン 12.0.0 は、組み込み機能によるアラート設定をサポートしています。
オプションパラメーター:
-
アラート設定:DingTalk およびメールアラートをサポートします。
-
Prometheus へのカスタム ConfigMap のマウント:カスタム設定を有効にします。
-
Grafana へのダッシュボードファイルのマウント:カスタムダッシュボードを追加します。
インストール後、 Helm ページの Helm チャートリストでコンポーネントのステータスを確認します。
-
手順2:Prometheus 収集タスクの表示
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
[サービス] ページで、ack-prometheus-operator がデプロイされている monitoring 名前空間を選択します。ack-prometheus-operator-prometheus の [操作] 列で、 更新 をクリックします。
-
ダイアログボックスで、[タイプ] を [ロードバランサ (LoadBalancer)] に設定します。 リソースの新規作成 を選択し、 アクセス方式 を [パブリックアクセス] に、 課金方法 を [従量課金 (PayByCLCU)] に設定します。 [OK] をクリックします。
「CLB 課金の概要」をご参照ください。
-
更新後、外部 IP アドレスをコピーします。
<外部 IP アドレス>:9090(例:47.XX.XX.12:9090) で Prometheus UI を開きます。 -
Prometheus UI で、 に移動して、すべてのデータ収集タスクを表示します。
すべてのタスクが UP と表示されている場合、データ収集は正常に実行されています。
-
メニューバーで [Alerts] をクリックし、現在のアラートルールを表示します。
[Alerts] ページでは、Inactive (89)、 Pending (3)、 Firing (4) のアラートステータス統計を表示できます。現在トリガーされているアラートには、 TargetDown (2件アクティブ) と Watchdog (1件アクティブ) があります。
手順3:Grafana での集計データの表示
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
サービス ページで、ack-prometheus-operator がデプロイされている名前空間 (デフォルトでは monitoring) を選択します。 ack-prometheus-operator-grafana という名前の Service の 操作 列の 更新 をクリックします。
-
ダイアログボックスで、[タイプ] を [ロードバランサ (LoadBalancer)] に設定します。 リソースの新規作成 を選択し、 アクセス方式 を [パブリックアクセス] に、 課金方法 を [従量課金 (PayByCLCU)] に設定します。 [OK] をクリックします。
「CLB 課金の概要」をご参照ください。
-
更新後、外部 IP アドレスをコピーします。
<外部 IP アドレス>(デフォルトポート: 80) で Grafana ダッシュボードを開きます。例:47.XX.XX.12。
アラート設定
ack-prometheus-operator コンポーネントは、DingTalk およびメールアラートをサポートしています。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
-
作成する をクリックし、ack-prometheus-operator を見つけて、 次へ をクリックします。 パラメーター ページで、Chart バージョンを選択し、以下で説明するようにパラメーターを設定します。
ack-prometheus-operator がすでにインストールされている場合は、Helm チャートリストでその名前をクリックし、 パラメーター をクリックして設定を更新します。
DingTalk アラートの設定
-
設定ファイルで、
dingtalkフィールドを見つけ、enabledをtrueに設定します。 -
tokenフィールドに、DingTalk ウェブフック URL を入力します。Webhook URL については、「Kubernetes のモニタリングとアラートのための DingTalk チャットボットの使用」をご参照ください。
-
alertmanagerのconfigフィールドで、receiverの設定を見つけ、receiversで定義した DingTalk アラート名を入力します。デフォルト名はwebhookです。
メールアラートの設定
-
ハイライトされたセクションに、メールの詳細を入力します。
-
alertmanagerのconfigフィールドでreceiverを見つけ、receiversで定義されているメールアラート名を入力します。デフォルト名はmailです。
config:
global:
resolve_timeout: 5m
route:
group_by: ['job']
group_wait: 1m
group_interval: 1m
repeat_interval: 2m
receiver: "null"
routes:
- match:
alertname: Watchdog
receiver: "null"
receivers:
- name: "null"
#- name: webhook
# webhook_configs:
# - url: http://ack-prometheus-operator-alertmanager.monitoring:8060/dingtalk/ops_dingding/send
# send_resolved: true
#- name: 'mail'
# email_configs:
# - to: 'xxxxxxx@qq.com' # 受信アドレス:
# smarthost: 'smtp.163.com:465' # SMTP サーバーアドレス:
# from: 'xxxxx@163.com' # 送信者アドレス:
# auth_username: 'xxxxx@163.com' # メールユーザー名:
# auth_password: 'xxxxxxxxx' # メールパスワード (認証コード):
# require_tls: false # TLS スイッチ:
# send_resolved: true
アラート receiver テンプレート
alertmanager 設定の templateFiles セクションで、アラートテンプレートをカスタマイズします。
##
templateFiles: {}
#
# テンプレートの例:
# template_1.tmpl: |-
# {{ define "cluster" }}{{ .ExternalURL | reReplaceAll ".*alertmanager\.(.*)" "$1" }}{{ end }}
#
# {{ define "slack.myorg.text" }}
# {{- $root := . -}}
# {{ range .Alerts }}
# *Alert:* {{ .Annotations.summary }} - `{{ .Labels.severity }}`
# *Cluster:* {{ template "cluster" $root }}
# *Description:* {{ .Annotations.description }}
# *Graph:* <{{ .GeneratorURL }}|:chart_with_upwards_trend:>
# *Runbook:* <{{ .Annotations.runbook }}|:spiral_note_pad:>
# *Details:*
# {{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
# {{ end }}
Prometheus へのカスタム ConfigMap のマウント
special-config という名前の ConfigMap を使用して設定ファイルをマウントし、Pod の起動時に --config.file パラメーターとして指定します。
-
ConfigMap を作成します。
-
ConfigMap をマウントします。
パラメーター ページで、
configmapsフィールドに以下を追加し、ConfigMap を Prometheus Pod の/etc/prometheus/configmaps/にマウントします。## ConfigMaps は、Prometheus オブジェクトと同じ名前空間にある ConfigMap のリストで、 ## Prometheus Pod にマウントされます。 ## ConfigMap は /etc/prometheus/configmaps/ にマウントされます。 ## configMaps: [special-config]prometheusconfigmaps設定の例:## ConfigMaps は、Prometheus と同じ名前空間にある ConfigMap のリストです ## ConfigMap は /etc/prometheus/configmaps/ にマウントされます。 ## configMaps: - "special-config" - "detail-config"
Grafana の設定
Grafana へのダッシュボードファイルのマウント
ダッシュボードの ConfigMap を Grafana Pod にマウントするには、パラメーター ウィザードの extraConfigmapMounts フィールドを使用します。
extraConfigmapMounts: []
# - name: certs-configmap
# mountPath: /etc/grafana/ssl/
# configMap: certs-configmap
# readOnly: true
次のことを確認してください:
-
ダッシュボードがクラスター内に ConfigMap として存在し、そのラベルが他の ConfigMap の形式と一致していること。
-
Grafana 設定の
extraConfigmapMountsフィールドには、ダッシュボードの ConfigMap とマウント情報が含まれています。-
mountPath:/tmp/dashboards/に設定します。 -
ConfigMap: カスタム ConfigMap の名前。 -
name:ボリュームマウントの名前。
-
ダッシュボードの永続化の有効化
バックアップのためにダッシュボードを JSON ファイルとしてエクスポートします。詳細については、「Grafana エクスポート」をご参照ください。
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
ack-prometheus-operator を見つけて更新をクリックします。
grafanaフィールドで、persistenceオプションを以下のように設定します。## persistence: # 永続化スイッチ: enabled: false # storageClass 名: ストレージクラスには alicloud-disk-available、alicloud-disk-efficiency、alicloud-disk-essd、alicloud-disk-ssd の 4 種類があります storageClassName: alicloud-disk-efficiency accessModes: - ReadWriteOnce size: 30 Gi # annotations: {} # subPath: "" #existingClaim:
関連操作
オープンソース Prometheus のアンインストール
リソースの残存を防ぐため、お使いの Helm Chart のバージョンに応じた手順に従ってください。Helm リリース、名前空間、CRD、および kubelet Service を手動でクリーンアップします。
kubelet Service はアンインストール時に自動的に削除されません。これは既知のコミュニティの問題 (#1523) です。以下で説明するように手動で削除してください。
Chart v12.0.0
コンソール
-
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
クラスターリスト ページで、クラスターの名前をクリックし、左側メニューから次の操作を実行します。
-
Helm リリースのアンインストール: を選択します。Helm リリースリストで ack-prometheus-operator のエントリを見つけ、 アクション 列の 削除 をクリックして削除します。リリースレコードをクリアします。
-
名前空間の削除:名前空間とクォータ をクリックします。名前空間リストで monitoring を見つけて選択し、削除します。
-
カスタムリソース定義 (CRD) の削除: に移動し、CRD タブをクリックします。
monitoring.coreos.comAPI グループ配下のすべての CRD リソースを削除します:-
AlertmanagerConfig
-
Alertmanager
-
PodMonitor
-
Probe
-
Prometheus
-
PrometheusRule
-
ServiceMonitor
-
ThanosRuler
-
-
kubelet Service の削除:ネットワーク > サービス を選択します。kube-system 名前空間で ack-prometheus-operator-kubelet を見つけて削除します。
-
kubectl
-
Helm リリースのアンインストール
helm uninstall ack-prometheus-operator -n monitoring -
名前空間の削除
kubectl delete namespace monitoring -
CRD の削除
kubectl delete crd alertmanagerconfigs.monitoring.coreos.com kubectl delete crd alertmanagers.monitoring.coreos.com kubectl delete crd podmonitors.monitoring.coreos.com kubectl delete crd probes.monitoring.coreos.com kubectl delete crd prometheuses.monitoring.coreos.com kubectl delete crd prometheusrules.monitoring.coreos.com kubectl delete crd servicemonitors.monitoring.coreos.com kubectl delete crd thanosrulers.monitoring.coreos.com -
kubelet Service の削除
kubectl delete service ack-prometheus-operator-kubelet -n kube-system
Chart v65.1.1
コンソール
-
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
クラスターリスト ページで、クラスターの名前をクリックし、左側メニューから次の操作を実行します。
-
Helm リリースのアンインストール: を選択します。Helm リリースリストで ack-prometheus-operator のエントリを見つけ、 アクション 列の 削除 をクリックして削除します。リリースレコードをクリアします。
-
名前空間の削除:名前空間とクォータ をクリックします。名前空間リストで monitoring を見つけて選択し、削除します。
-
CustomResourceDefinition (CRD) の削除: に移動し、CRD タブをクリックします。
monitoring.coreos.comAPI グループ配下のすべての CRD リソースを削除します。-
AlertmanagerConfig
-
Alertmanager
-
PodMonitor
-
Probe
-
PrometheusAgent
-
Prometheus
-
PrometheusRule
-
ScrapeConfig
-
ServiceMonitor
-
ThanosRuler
-
-
kubelet Service の削除:ネットワーク > サービス を選択します。kube-system 名前空間で ack-prometheus-operator-kubelet を見つけて削除します。
-
kubectl
-
Helm リリースのアンインストール
helm uninstall ack-prometheus-operator -n monitoring -
名前空間の削除
kubectl delete namespace monitoring -
CRD の削除
kubectl delete crd alertmanagerconfigs.monitoring.coreos.com kubectl delete crd alertmanagers.monitoring.coreos.com kubectl delete crd podmonitors.monitoring.coreos.com kubectl delete crd probes.monitoring.coreos.com kubectl delete crd prometheusagents.monitoring.coreos.com kubectl delete crd prometheuses.monitoring.coreos.com kubectl delete crd prometheusrules.monitoring.coreos.com kubectl delete crd scrapeconfigs.monitoring.coreos.com kubectl delete crd servicemonitors.monitoring.coreos.com kubectl delete crd thanosrulers.monitoring.coreos.com -
kubelet Service の削除
kubectl delete service ack-prometheus-operator-kubelet -n kube-system
アラートサイレンスの設定
サイレンスルールは、サイレンス期間が終了するかルールが削除されるまで、一致するアラート通知を抑制します。
-
ローカルポート 9093 で Alertmanager を公開します:
kubectl --address 0.0.0.0 port-forward svc/alertmanager-operated 9093 -n monitoring -
Elastic IP アドレス (EIP) を関連付け、
<EIP>:9093で Alertmanager にアクセスします。セキュリティグループがポート 9093 でローカル IP からのトラフィックを許可していることを確認してください。詳細については、「セキュリティグループルールの追加」をご参照ください。
-
[Silence] をクリックして、アラートサイレンスを設定します。
よくある質問
DingTalk の設定後にアラートが受信されない
-
DingTalk チャットボットの Webhook URL を取得します。詳細については、「イベントモニタリング」をご参照ください。
-
dingtalk フィールドを見つけ、enabled を true に設定し、Token フィールドに DingTalk Webhook URL を入力します。詳細については、「アラート設定」の「DingTalk アラートの設定」をご参照ください。
prometheus-operator のデプロイ時のエラー
次のエラーメッセージが表示されます:
Can't install release with errors: rpc error: code = Unknown desc = object is being deleted: customresourcedefinitions.apiextensions.k8s.io "xxxxxxxx.monitoring.coreos.com" already exists
このエラーは、以前のデプロイからの CRD がクリーンアップされていないために発生します。CRD を削除して、コンポーネントを再デプロイしてください:
kubectl delete crd prometheuses.monitoring.coreos.com
kubectl delete crd prometheusrules.monitoring.coreos.com
kubectl delete crd servicemonitors.monitoring.coreos.com
kubectl delete crd alertmanagers.monitoring.coreos.com
メールアラートが機能しない
認証コードの代わりに auth_password にログインパスワードを入力すると、メールアラートが失敗する場合があります。SMTP サーバーアドレスにはポート番号を含める必要があります。
[YAML 更新] をクリックするとエラーが発生する:The current cluster is temporarily unavailable. Please try again later.
これは、Tiller 設定ファイルが大きすぎてクラスターにアクセスできなくなる場合に発生します。コメントを削除してファイルサイズを小さくし、ConfigMap としてマウントします。prometheus-operator は、prometheus および alertmanager Pod の ConfigMap マウントのみをサポートしています。詳細については、「Prometheus へのカスタム ConfigMap のマウント」をご参照ください。
デプロイ後の機能の有効化
prometheus-operator をデプロイした後に機能を有効にします。クラスターの詳細ページで、 を選択します。ack-prometheus-operator を見つけ、[操作] 列の 更新 をクリックします。有効にする機能を見つけて設定し、 OK をクリックします。
TSDB と Alibaba Cloud ディスクの選択
TSDB は、Alibaba Cloud ディスクよりも利用可能なリージョンが少ないです。データ保持ポリシー:
## メトリクスを保持する期間
##
retention: 10d
Grafana ダッシュボードの表示の問題
クラスターの詳細ページで、 を選択します。ack-prometheus-operator を見つけ、[操作] 列の 更新 をクリックします。 clusterVersion がクラスターのバージョンと一致していることを確認します。v1.16 より前のクラスターの場合は 1.14.8-aliyun.1 を入力します。v1.16 以降の場合は 1.16.6-aliyun.1 を入力します。
名前空間の削除後の再インストール失敗
名前空間のみを削除すると、設定が残ってしまう場合があります。次のリソースをクリーンアップしてください:
-
RBAC 権限を削除します。
-
ClusterRole を削除します。
kubectl delete ClusterRole ack-prometheus-operator-grafana-clusterrole kubectl delete ClusterRole ack-prometheus-operator-kube-state-metrics kubectl delete ClusterRole psp-ack-prometheus-operator-kube-state-metrics kubectl delete ClusterRole psp-ack-prometheus-operator-prometheus-node-exporter kubectl delete ClusterRole ack-prometheus-operator-operator kubectl delete ClusterRole ack-prometheus-operator-operator-psp kubectl delete ClusterRole ack-prometheus-operator-prometheus kubectl delete ClusterRole ack-prometheus-operator-prometheus-psp -
ClusterRoleBinding を削除します。
kubectl delete ClusterRoleBinding ack-prometheus-operator-grafana-clusterrolebinding kubectl delete ClusterRoleBinding ack-prometheus-operator-kube-state-metrics kubectl delete ClusterRoleBinding psp-ack-prometheus-operator-kube-state-metrics kubectl delete ClusterRoleBinding psp-ack-prometheus-operator-prometheus-node-exporter kubectl delete ClusterRoleBinding ack-prometheus-operator-operator kubectl delete ClusterRoleBinding ack-prometheus-operator-operator-psp kubectl delete ClusterRoleBinding ack-prometheus-operator-prometheus kubectl delete ClusterRoleBinding ack-prometheus-operator-prometheus-psp
-
-
CRD を削除します。
kubectl delete crd alertmanagerconfigs.monitoring.coreos.com kubectl delete crd alertmanagers.monitoring.coreos.com kubectl delete crd podmonitors.monitoring.coreos.com kubectl delete crd probes.monitoring.coreos.com kubectl delete crd prometheuses.monitoring.coreos.com kubectl delete crd prometheusrules.monitoring.coreos.com kubectl delete crd servicemonitors.monitoring.coreos.com kubectl delete crd thanosrulers.monitoring.coreos.com