HelmおよびPrometheusオペレーターを使用してDigitalOceanKubernetesクラスターモニタリングを設定する方法
序章
トレースとロギングに加えて、モニタリングとアラートはKubernetesの可観測性スタックの重要なコンポーネントです。 Kubernetesクラスタのモニタリングを設定すると、リソースの使用状況を追跡し、アプリケーションエラーを分析およびデバッグできます。
監視システムは通常、メトリックデータと視覚化レイヤーを格納する時系列データベースで構成されます。 さらに、アラートレイヤーはアラートを作成および管理し、必要に応じて統合および外部サービスにアラートを渡します。 最後に、1つ以上のコンポーネントが、この監視スタックによってアラート用に保存、視覚化、および処理されるメトリックデータを生成または公開します。
人気のある監視ソリューションの1つは、オープンソースの Prometheus 、 Grafana 、およびAlertmanagerスタックです。
- Prometheus は、時系列データベースおよび監視ツールであり、メトリックエンドポイントをポーリングし、これらのエンドポイントによって公開されたデータをスクレイピングおよび処理することで機能します。 時系列データクエリ言語であるPromQLを使用してこのデータをクエリできます。
- Grafana は、データの視覚化および分析ツールであり、メトリックデータのダッシュボードとグラフを作成できます。
- Alertmanager は、通常Prometheusと一緒にデプロイされ、スタックのアラートレイヤーを形成し、Prometheusによって生成されたアラートを処理し、それらを重複排除、グループ化して、電子メールやPagerDutyなどの統合にルーティングします。
さらに、kube-state-metricsやnode_exporterなどのツールは、クラスターレベルのKubernetesオブジェクトメトリックと、CPUやメモリ使用量などのマシンレベルのメトリックを公開します。
このモニタリングスタックをKubernetesクラスターに実装することは複雑になる可能性がありますが、幸いなことに、この複雑さの一部はHelmパッケージマネージャーとCoreOSのPrometheusOperatorおよびkube-prometheus[ X234X]プロジェクト。 これらのプロジェクトは、PrometheusとGrafanaの標準構成とダッシュボードでベイク処理し、下位レベルのKubernetesオブジェクト定義の一部を抽象化します。 Helm prometheus-operatorチャートを使用すると、Prometheus Operatorと上記の残りのコンポーネントを、デフォルトのダッシュボード、ルール、アラートのセットとともにインストールすることで、完全なクラスターモニタリングソリューションを稼働させることができます。 Kubernetesクラスターを監視するため。
このチュートリアルでは、prometheus-operator
ヘルムチャートをDigitalOceanKubernetesクラスターにインストールする方法を示します。 チュートリアルが終了するまでに、完全な監視スタックがクラスターにインストールされます。
前提条件
このチュートリアルに従うには、次のものが必要です。
- DigitalOceanKubernetesクラスター。
kubectl
コマンドラインインターフェイスがローカルマシンにインストールされ、クラスターに接続するように構成されています。kubectl
のインストールと構成の詳細については、公式ドキュメントを参照してください。- Helm Package Manager を使用してKubernetesクラスターにソフトウェアをインストールする方法で詳しく説明されているように、ローカルマシンにインストールされた Helm パッケージマネージャー(2.10+)とクラスターにインストールされたTiller。
ステップ1—カスタム値ファイルを作成する
prometheus-operator
Helmチャートをインストールする前に、DigitalOcean固有の構成パラメーターでチャートのデフォルトの一部をオーバーライドするカスタム値ファイルを作成します。 デフォルトのチャート値のオーバーライドの詳細については、Helmドキュメントの HelmInstallセクションを参照してください。
まず、nano
またはお気に入りのエディターを使用して、ローカルマシンでcustom-values.yaml
というファイルを作成して開きます。
nano custom-values.yaml
次のカスタム値をコピーして貼り付けると、Prometheus、Grafana、Alertmanangerコンポーネントの永続的なストレージが有効になり、DigitalOceanKubernetesで公開されていないKubernetesコントロールプレーンコンポーネントの監視が無効になります。
custom-values.yaml
# Define persistent storage for Prometheus (PVC) prometheus: prometheusSpec: storageSpec: volumeClaimTemplate: spec: accessModes: ["ReadWriteOnce"] storageClassName: do-block-storage resources: requests: storage: 5Gi # Define persistent storage for Grafana (PVC) grafana: # Set password for Grafana admin user adminPassword: your_admin_password persistence: enabled: true storageClassName: do-block-storage accessModes: ["ReadWriteOnce"] size: 5Gi # Define persistent storage for Alertmanager (PVC) alertmanager: alertmanagerSpec: storage: volumeClaimTemplate: spec: accessModes: ["ReadWriteOnce"] storageClassName: do-block-storage resources: requests: storage: 5Gi # Change default node-exporter port prometheus-node-exporter: service: port: 30206 targetPort: 30206 # Disable Etcd metrics kubeEtcd: enabled: false # Disable Controller metrics kubeControllerManager: enabled: false # Disable Scheduler metrics kubeScheduler: enabled: false
このファイルでは、チャートにパッケージされているvalues.yamlファイルのデフォルト値の一部をオーバーライドします。
まず、Prometheus、Grafana、Alertmanagerの永続ストレージを有効にして、ポッドの再起動後もデータが保持されるようにします。 舞台裏では、これはDigitalOcean Block Storage ストレージクラスを使用して、各コンポーネントの5 Gi
Persistent Volume Claim(PVC)を定義します。 モニタリングストレージのニーズに合わせて、これらのPVCのサイズを変更する必要があります。 PVCの詳細については、Kubernetesの公式ドキュメントの永続ボリュームを参照してください。
次に、 your_admin_password を、adminユーザーでGrafanaメトリックダッシュボードにログインするために使用する安全なパスワードに置き換えます。
次に、node-exporter用に別のポートを構成します。 Node-exporterは各Kubernetesノードで実行され、OSとハードウェアの指標をPrometheusに提供します。 DigitalOcean Kubernetesファイアウォールのデフォルトを回避するには、デフォルトのポートを変更する必要があります。これにより、ポート9100はブロックされますが、30000〜32767の範囲のポートは許可されます。 または、node-exporterのカスタムファイアウォールルールを構成することもできます。 方法については、DigitalOceanCloudFirewallsの公式ドキュメントからファイアウォールルールの構成方法を参照してください。
最後に、DigitalOceanKubernetesでメトリクスを公開しない3つのKubernetesコントロールプレーンコンポーネント(Kubernetesスケジューラとコントローラーマネージャー、etcdクラスターデータストア)のメトリクス収集を無効にします。
prometheus-operator
チャートの構成可能なパラメーターの完全なリストを確認するには、チャートリポジトリのREADMEまたはデフォルト値ファイルの構成セクションを参照してください。
編集が終わったら、ファイルを保存して閉じます。 これで、Helmを使用してチャートをインストールできます。
ステップ2—prometheus-operator
チャートのインストール
prometheus-operator
Helmチャートは、次のモニタリングコンポーネントをDigitalOceanKubernetesクラスターにインストールします。
- Prometheus Operator、Kubernetes Operator で、Prometheusクラスターの構成と管理を可能にします。 Kubernetesオペレーターは、ドメイン固有のロジックを、Kubernetesを使用したアプリケーションのパッケージ化、デプロイ、管理のプロセスに統合します。 Kubernetesオペレーターの詳細については、CoreOSオペレーターの概要を参照してください。 Prometheus Operatorの詳細については、PrometheusOperatorおよびPrometheusOperator GitHubrepoに関するこの紹介記事を参照してください。 PrometheusOperatorはDeploymentとしてインストールされます。
- StatefulSetとしてインストールされたPrometheus。
- Alertmanagerは、Prometheusサーバーから送信されたアラートを処理し、PagerDutyや電子メールなどの統合にルーティングするサービスです。 Alertmanagerの詳細については、PrometheusドキュメントのAlertingを参照してください。 AlertmanagerはStatefulSetとしてインストールされます。
- Grafanaは、Prometheusメトリックのダッシュボードを視覚化および作成できる時系列データ視覚化ツールです。 Grafanaはデプロイメントとしてインストールされます。
- node-exporterは、クラスターノードで実行され、OSとハードウェアのメトリックをPrometheusに提供するPrometheusエクスポーターです。 詳細については、 node-exporter GitHubrepoを参照してください。 node-exporterはDaemonSetとしてインストールされます。
- kube-state-metricsは、Kubernetes APIサーバーをリッスンし、DeploymentsやPodsなどのKubernetesオブジェクトの状態に関する指標を生成するアドオンエージェントです。 詳細については、 kube-state-metrics GitHubrepoを参照してください。 kube-state-metricsはデプロイとしてインストールされます。
デフォルトでは、node-exporter、kube-state-metrics、および上記の他のコンポーネントによって生成されたスクレイピングメトリックとともに、Prometheusは次のコンポーネントからメトリックをスクレイピングするように構成されます。
- kube-apiserver、KubernetesAPIサーバー。
- CoreDNS 、KubernetesクラスターDNSサーバー。
- kubelet 、ノード上のポッドとコンテナを管理するためにkube-apiserverと対話するプライマリノードエージェント。
- cAdvisor は、実行中のコンテナーを検出し、CPU、メモリ、ファイルシステム、およびネットワークの使用状況のメトリックを収集するノードエージェントです。
ローカルマシンで、prometheus-operator
ヘルムチャートをインストールし、上記で作成したカスタム値ファイルを渡すことから始めましょう。
helm install --namespace monitoring --name doks-cluster-monitoring -f custom-values.yaml stable/prometheus-operator
ここでは、helm install
を実行し、すべてのコンポーネントをmonitoring
名前空間にインストールします。この名前空間は同時に作成します。 これにより、モニタリングスタックを残りのKubernetesクラスターからきれいに分離できます。 Helmリリースにdoks-cluster-monitoring
という名前を付け、ステップ1で作成したカスタム値ファイルを渡します。 最後に、Helm stable
ディレクトリからprometheus-operator
チャートをインストールすることを指定します。
次の出力が表示されます。
OutputNAME: doks-cluster-monitoring LAST DEPLOYED: Mon Apr 22 10:30:42 2019 NAMESPACE: monitoring STATUS: DEPLOYED RESOURCES: ==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE doks-cluster-monitoring-grafana Pending do-block-storage 10s ==> v1/ServiceAccount NAME SECRETS AGE doks-cluster-monitoring-grafana 1 10s doks-cluster-monitoring-kube-state-metrics 1 10s . . . ==> v1beta1/ClusterRoleBinding NAME AGE doks-cluster-monitoring-kube-state-metrics 9s psp-doks-cluster-monitoring-prometheus-node-exporter 9s NOTES: The Prometheus Operator has been installed. Check its status by running: kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring" Visit https://github.com/coreos/prometheus-operator for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
これは、Prometheus Operator、Prometheus、Grafana、および上記の他のコンポーネントがDigitalOceanKubernetesクラスターに正常にインストールされたことを示します。
helm install
出力の注記に続いて、kubectl get pods
を使用してリリースのポッドのステータスを確認します。
kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring"
次のように表示されます。
OutputNAME READY STATUS RESTARTS AGE doks-cluster-monitoring-grafana-9d7f984c5-hxnw6 2/2 Running 0 3m36s doks-cluster-monitoring-kube-state-metrics-dd8557f6b-9rl7j 1/1 Running 0 3m36s doks-cluster-monitoring-pr-operator-9c5b76d78-9kj85 1/1 Running 0 3m36s doks-cluster-monitoring-prometheus-node-exporter-2qvxw 1/1 Running 0 3m36s doks-cluster-monitoring-prometheus-node-exporter-7brwv 1/1 Running 0 3m36s doks-cluster-monitoring-prometheus-node-exporter-jhdgz 1/1 Running 0 3m36s
これは、すべての監視コンポーネントが稼働中であり、Grafanaとその事前構成されたダッシュボードを使用してPrometheusメトリックの調査を開始できることを示しています。
ステップ3—Grafanaへのアクセスとメトリクスデータの調査
prometheus-operator
Helmチャートは、GrafanaをClusterIP
サービスとして公開します。つまり、クラスター内部のIPアドレスを介してのみアクセスできます。 Kubernetesクラスタの外部でGrafanaにアクセスするには、kubectl patch
を使用して、サービスをNodePort
やLoadBalancer
、kubectl port-forward
ローカルポートをGrafanaポッドポートに転送します。
このチュートリアルではポートを転送しますが、kubectl patch
とKubernetesサービスタイプの詳細については、 kubectlpatchとServicesを使用してAPIオブジェクトをインプレースで更新するをご覧ください。公式のKubernetesドキュメントから。
monitoring
名前空間で実行中のサービスを一覧表示することから始めます。
kubectl get svc -n monitoring
次のサービスが表示されます。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34m doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34m doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34m doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34m doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34m doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34m doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34m prometheus-operated ClusterIP None <none> 9090/TCP 34m
ローカルポート8000
をdoks-cluster-monitoring-grafana
サービスのポート80
に転送し、次に実行中のGrafanaポッドのポート3000
に転送します。 これらのサービスポートとポッドポートは、stable/grafana
ヘルムチャート値ファイルで構成されます。
kubectl port-forward -n monitoring svc/doks-cluster-monitoring-grafana 8000:80
次の出力が表示されます。
OutputForwarding from 127.0.0.1:8000 -> 3000 Forwarding from [::1]:8000 -> 3000
これは、ローカルポート8000
がGrafanaポッドに正常に転送されていることを示しています。
Webブラウザでhttp://localhost:8000
にアクセスします。 次のGrafanaログインページが表示されます。
custom-values.yaml
で設定したユーザー名とパスワードとしてadminを入力します。 次に、ログインを押します。
次のホームダッシュボードが表示されます。
左側のナビゲーションバーで、ダッシュボードボタンを選択し、管理をクリックします。
prometheus-operator
ヘルムチャートによってインストールされたダッシュボードを一覧表示する次のダッシュボード管理インターフェイスが表示されます。
これらのダッシュボードは、kubernetes-mixin
によって生成されます。これは、クラスター監視GrafanaダッシュボードとPrometheusアラートの標準化されたセットを作成できるオープンソースプロジェクトです。 詳細については、 KubernetesMixinGitHubリポジトリを参照してください。
Kubernetes / Nodes ダッシュボードをクリックして、特定のノードのCPU、メモリ、ディスク、およびネットワークの使用状況を視覚化します。
各ダッシュボードと、それを使用してクラスターのメトリックデータを視覚化する方法を説明することは、このチュートリアルの範囲を超えています。 システムのパフォーマンスを分析するためのUSEメソッドの詳細については、Brendan Greggの使用率の飽和とエラー(USE)メソッドページを参照してください。 GoogleのSREBook は、もう1つの役立つリソースであり、特に第6章:分散システムの監視です。 独自のGrafanaダッシュボードを作成する方法については、Grafanaのはじめにページをご覧ください。
次のステップでは、同様のプロセスに従って、Prometheus監視システムに接続して探索します。
ステップ4—PrometheusとAlertmanagerへのアクセス
Prometheusポッドに接続するには、もう一度kubectl port-forward
を使用してローカルポートを転送する必要があります。 Grafanaの探索が終了したら、CTRL-C
を押してポートフォワードトンネルを閉じることができます。 または、新しいシェルとポート転送接続を開くこともできます。
monitoring
名前空間で実行中のサービスを一覧表示することから始めます。
kubectl get svc -n monitoring
次のサービスが表示されます。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34m doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34m doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34m doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34m doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34m doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34m doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34m prometheus-operated ClusterIP None <none> 9090/TCP 34m
ローカルポート9090
をdoks-cluster-monitoring-pr-prometheus
サービスのポート9090
に転送します。
kubectl port-forward -n monitoring svc/doks-cluster-monitoring-pr-prometheus 9090:9090
次の出力が表示されます。
OutputForwarding from 127.0.0.1:9090 -> 9090 Forwarding from [::1]:9090 -> 9090
これは、ローカルポート9090
がPrometheusポッドに正常に転送されていることを示しています。
Webブラウザでhttp://localhost:9090
にアクセスします。 次のPrometheusGraphページが表示されます。
ここから、Prometheusクエリ言語であるPromQLを使用して、データベースに保存されている時系列メトリックを選択して集計できます。 PromQLの詳細については、公式のPrometheusドキュメントから QueryingPrometheusを参照してください。
Expression フィールドに、machine_cpu_cores
と入力し、Executeを押します。 特定のノードのCPUコアの数を報告するメトリックmachine_cpu_cores
の時系列のリストが表示されます。 メトリックラベルで、どのノードがメトリックを生成し、どのジョブがメトリックをスクレイプしたかを確認できます。
最後に、上部のナビゲーションバーで、ステータス、ターゲットの順にクリックして、Prometheusがスクレイプするように構成されているターゲットのリストを表示します。 ステップ2の冒頭で説明した監視エンドポイントのリストに対応するターゲットのリストが表示されます。
Promtheusの詳細と、クラスターメトリックを照会する方法については、公式のPrometheusドキュメントを参照してください。
同様のプロセスに従って、Prometheusによって生成されたアラートを管理するAlertManagerに接続します。 Prometheusの上部ナビゲーションバーにあるアラートをクリックすると、これらのアラートを調べることができます。
Alertmanagerポッドに接続するには、もう一度kubectl port-forward
を使用してローカルポートを転送します。 Prometheusの探索が終了したら、CTRL-C
を押してポートフォワードトンネルを閉じることができます。 または、新しいシェルとポート転送接続を開くこともできます。
monitoring
名前空間で実行中のサービスを一覧表示することから始めます。
kubectl get svc -n monitoring
次のサービスが表示されます。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 34m doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 <none> 80/TCP 34m doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 <none> 8080/TCP 34m doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 <none> 9093/TCP 34m doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 <none> 8080/TCP 34m doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 <none> 9090/TCP 34m doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 <none> 30206/TCP 34m prometheus-operated ClusterIP None <none> 9090/TCP 34m
ローカルポート9093
をdoks-cluster-monitoring-pr-alertmanager
サービスのポート9093
に転送します。
kubectl port-forward -n monitoring svc/doks-cluster-monitoring-pr-alertmanager 9093:9093
次の出力が表示されます。
OutputForwarding from 127.0.0.1:9093 -> 9093 Forwarding from [::1]:9093 -> 9093
これは、ローカルポート9093
がAlertmanagerポッドに正常に転送されていることを示しています。
Webブラウザでhttp://localhost:9093
にアクセスします。 次のAlertmanagerAlertsページが表示されます。
ここから、アラートの発火とオプションでアラートの消音を調べることができます。 Alertmanagerの詳細については、公式Alertmanagerドキュメントを参照してください。
結論
このチュートリアルでは、Prometheus、Grafana、Alertmanagerのモニタリングスタックを、ダッシュボード、Prometheusルール、アラートの標準セットを使用してDigitalOceanKubernetesクラスターにインストールしました。 これはHelmを使用して行われたため、helm upgrade
、helm rollback
、およびhelm delete
を使用して、監視スタックをアップグレード、ロールバック、または削除できます。 これらの機能の詳細については、 HelmPackageManagerを使用してKubernetesクラスターにソフトウェアをインストールする方法を参照してください。
prometheus-operator
チャートは、Helmを使用してクラスターの監視を迅速に開始および実行するのに役立ちます。 Prometheus Operatorを手動でビルド、デプロイ、および構成することをお勧めします。 これを行うには、 プロメテウスオペレーターおよび[kube-prometheus](< https://github.com/coreos/kube-prometheus )GitHubリポジトリ。