前書き
トレースとロギングに加えて、監視とアラートはKubernetesの可観測性スタックの重要なコンポーネントです。 Kubernetesクラスターの監視を設定すると、リソースの使用状況を追跡し、アプリケーションエラーを分析およびデバッグできます。
監視システムは通常、メトリックデータと視覚化レイヤーを格納する時系列データベースで構成されます。 さらに、アラートレイヤーはアラートを作成および管理し、必要に応じて統合および外部サービスに渡します。 最後に、1つ以上のコンポーネントが、この監視スタックによるアラート用に保存、視覚化、および処理されるメトリックデータを生成または公開します。
一般的な監視ソリューションの1つは、オープンソースのPrometheus、Grafana、およびAlertmanagerスタックです。
-
Prometheusは、メトリックエンドポイントをポーリングし、これらのエンドポイントによって公開されたデータをスクレイピングおよび処理することによって機能する時系列データベースおよび監視ツールです。 時系列データクエリ言語であるPromQLを使用してこのデータをクエリできます。
-
Grafanaは、メトリックデータのダッシュボードとグラフを作成できるデータ視覚化および分析ツールです。
-
Alertmanagerは、通常Prometheusと一緒にデプロイされ、スタックのアラートレイヤーを形成し、Prometheusによって生成されたアラートを処理し、重複排除、グループ化、および電子メールやPagerDutyなどの統合へのルーティングを行います。
さらに、kube-state-metricsやnode_exporterなどのツールは、クラスターレベルのKubernetesオブジェクトメトリックと、CPUやメモリ使用量などのマシンレベルのメトリックを公開します。
このモニタリングスタックをKubernetesクラスターに実装することは複雑になる可能性がありますが、幸いなことに、この複雑さの一部は、HelmパッケージマネージャーとCoreOSのPrometheus Operatorおよびkube-prometheusプロジェクトで管理できます。 これらのプロジェクトは、PrometheusとGrafanaの標準構成とダッシュボードを作成し、下位レベルのKubernetesオブジェクト定義の一部を抽象化します。 Helmprometheus-operator
chartを使用すると、Prometheus Operatorと上記の残りのコンポーネントを、Kubernetesクラスターのモニタリングに役立つダッシュボード、ルール、アラートのデフォルトセットとともにインストールすることで、完全なクラスターモニタリングソリューションを稼働させることができます。
このチュートリアルでは、prometheus-operator
HelmチャートをDigitalOceanKubernetesクラスターにインストールする方法を示します。 チュートリアルの最後までに、完全な監視スタックをクラスターにインストールします。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
DigitalOcean Kubernetesクラスター。
-
ローカルマシンにインストールされ、クラスターに接続するように構成された
kubectl
コマンドラインインターフェイス。kubectl
in its official documentationのインストールと構成の詳細を読むことができます。 -
How To Install Software on Kubernetes Clusters with the Helm Package Managerで詳しく説明されているように、ローカルマシンにインストールされているHelmパッケージマネージャー(2.10+)とクラスターにインストールされているTiller。
[[step-1 -—- creating-a-custom-values-file]] ==ステップ1—カスタム値ファイルの作成
prometheus-operator
Helmチャートをインストールする前に、DigitalOcean固有の構成パラメーターでチャートのデフォルトの一部をオーバーライドするカスタム値ファイルを作成します。 デフォルトのグラフ値のオーバーライドの詳細については、HelmドキュメントのHelm Installセクションを参照してください。
まず、nano
またはお気に入りのエディターを使用して、ローカルマシンでcustom-values.yaml
というファイルを作成して開きます。
nano custom-values.yaml
次のカスタム値をコピーして貼り付けます。これにより、Prometheus、Grafana、Alertmanangerコンポーネントの永続ストレージが有効になり、DigitalOcean Kubernetesで公開されていない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 fileにパッケージされているデフォルト値の一部をオーバーライドします。
まず、Prometheus、Grafana、Alertmanagerの永続ストレージを有効にして、Podの再起動後もデータが保持されるようにします。 舞台裏では、これはDigitalOceanBlock Storageストレージクラスを使用して、各コンポーネントの5 Gi
永続ボリュームクレーム(PVC)を定義します。 監視ストレージのニーズに合わせて、これらのPVCのサイズを変更する必要があります。 PVCの詳細については、Kubernetesの公式ドキュメントのPersistent Volumesを参照してください。
次に、your_admin_password
を、adminユーザーでGrafanaメトリックダッシュボードにログインするために使用する安全なパスワードに置き換えます。
次に、node-exporterに別のポートを構成します。 Node-exporterは各Kubernetesノードで実行され、OSおよびハードウェアメトリックをPrometheusに提供します。 DigitalOcean Kubernetesファイアウォールのデフォルトを回避するには、デフォルトポートを変更する必要があります。これにより、ポート9100はブロックされますが、30000〜32767の範囲のポートは許可されます。 または、node-exporterのカスタムファイアウォールルールを設定できます。 方法については、DigitalOcean Cloud Firewallsの公式ドキュメントのHow to Configure Firewall Rulesを参照してください。
最後に、DigitalOcean Kubernetesでメトリックを公開しない3つのKubernetescontrol plane components(Kubernetesスケジューラとコントローラーマネージャー、etcdクラスターデータストア)のメトリック収集を無効にします。
prometheus-operator
チャートの構成可能なパラメーターの完全なリストを表示するには、チャートリポジトリのREADMEまたはデフォルト値ファイルのConfigurationセクションを参照してください。
編集が完了したら、ファイルを保存して閉じます。 これで、Helmを使用してチャートをインストールできます。
[[step-2 -—- installing-the-prometheus-operator-chart]] ==ステップ2 —prometheus-operator
チャートのインストール
prometheus-operator
Helmチャートは、次のモニタリングコンポーネントをDigitalOceanKubernetesクラスターにインストールします。
-
Prometheus Operator、Prometheusクラスターの構成と管理を可能にするKubernetesOperator。 Kubernetes Operatorsは、ドメイン固有のロジックを、Kubernetesを使用したアプリケーションのパッケージ化、展開、および管理のプロセスに統合します。 Kubernetes演算子の詳細については、CoreOS Operators Overviewを参照してください。 Prometheus Operatorの詳細については、Prometheus OperatorおよびPrometheus OperatorGitHub repoのthis introductory postを参照してください。 Prometheus OperatorはDeploymentとしてインストールされます。
-
Prometheus、StatefulSetとしてインストールされます。
-
Alertmanager、Prometheusサーバーから送信されたアラートを処理し、PagerDutyや電子メールなどの統合にルーティングするサービス。 Alertmanagerの詳細については、PrometheusドキュメントのAlertingを参照してください。 AlertmanagerはStatefulSetとしてインストールされます。
-
Grafanaは、Prometheusメトリックのダッシュボードを視覚化および作成できる時系列データ視覚化ツールです。 Grafanaはデプロイメントとしてインストールされます。
-
node-exporter、クラスターノード上で実行され、OSおよびハードウェアメトリックをPrometheusに提供するPrometheusエクスポーター。 詳細については、node-exporter GitHub repoを参照してください。 node-exporterはDaemonSetとしてインストールされます。
-
kube-state-metrics、Kubernetes APIサーバーをリッスンし、展開やポッドなどのKubernetesオブジェクトの状態に関するメトリックを生成するアドオンエージェント。 kube-state-metrics GitHub repoを参照すると、詳細を確認できます。 kube-state-metricsはデプロイメントとしてインストールされます。
デフォルトでは、node-exporter、kube-state-metrics、および上記の他のコンポーネントによって生成されたスクレイピングメトリックとともに、Prometheusは次のコンポーネントからメトリックをスクレイピングするように構成されます。
-
kube-apiserver、Kubernetes API server。
-
CoreDNS、KubernetesクラスターDNSサーバー。
-
kubelet、kube-apiserverと対話してノード上のポッドとコンテナを管理するプライマリノードエージェント。
-
cAdvisorは、実行中のコンテナーを検出し、それらのCPU、メモリー、ファイルシステム、およびネットワーク使用状況のメトリックを収集するノードエージェントです。
ローカルマシンで、prometheus-operator
Helmチャートをインストールし、上記で作成したカスタム値ファイルを渡すことから始めましょう。
helm install --namespace monitoring --name doks-cluster-monitoring -f custom-values.yaml stable/prometheus-operator
ここでは、helm install
を実行し、すべてのコンポーネントをmonitoring
名前空間にインストールします。これは同時に作成します。 これにより、監視スタックを他のKubernetesクラスターから明確に分離できます。 Helmリリースにdoks-cluster-monitoring
という名前を付け、Step 1で作成したカスタム値ファイルを渡します。 最後に、Helmstable
directoryから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、および上記の他のコンポーネントがDigitalOcean Kubernetesクラスターに正常にインストールされたことを示しています。
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メトリックの調査を開始できることを示しています。
[[step-3 -—- accessing-grafana-and-exploring-metrics-data]] ==ステップ3—Grafanaへのアクセスとメトリクスデータの探索
prometheus-operator
Helmチャートは、GrafanaをClusterIP
サービスとして公開します。つまり、クラスター内部のIPアドレスを介してのみアクセスできます。 Kubernetesクラスターの外部でGrafanaにアクセスするには、kubectl patch
を使用して、インプレースのサービスをNodePort
やLoadBalancer
などの公開タイプに更新するか、kubectl port-forward
を次のように更新します。ローカルポートをGrafanaPodポートに転送します。
このチュートリアルではポートを転送しますが、kubectl patch
とKubernetesサービスタイプの詳細については、公式のKubernetesドキュメントからUpdate API Objects in Place Using kubectl patchとServicesを参照してください。
monitoring
名前空間で実行中のサービスを一覧表示することから始めます。
kubectl get svc -n monitoring
次のサービスが表示されるはずです。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-operated ClusterIP None 9093/TCP,6783/TCP 34m
doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 80/TCP 34m
doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 8080/TCP 34m
doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 9093/TCP 34m
doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 8080/TCP 34m
doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 9090/TCP 34m
doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 30206/TCP 34m
prometheus-operated ClusterIP None 9090/TCP 34m
ローカルポート8000
をdoks-cluster-monitoring-grafana
サービスのポート80
に転送し、次に実行中のGrafanaポッドのポート3000
に転送します。 これらのサービスポートとポッドポートは、stable/grafana
ヘルムチャートvalues fileで構成されます。
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を入力します。 次に、Log Inを押します。
次のHome Dashboardに移動します。
左側のナビゲーションバーで、Dashboardsボタンを選択し、Manageをクリックします。
次のダッシュボード管理インターフェイスが表示されます。このインターフェイスには、prometheus-operator
ヘルムチャートによってインストールされたダッシュボードが一覧表示されます。
これらのダッシュボードは、kubernetes-mixin
によって生成されます。これは、クラスター監視GrafanaダッシュボードとPrometheusアラートの標準化されたセットを作成できるオープンソースプロジェクトです。 詳細については、Kubernetes Mixin GitHub repoを参照してください。
Kubernetes / Nodesダッシュボードをクリックして、特定のノードのCPU、メモリ、ディスク、およびネットワークの使用状況を視覚化します。
各ダッシュボードの説明と、それを使用してクラスターのメトリックデータを視覚化する方法は、このチュートリアルの範囲を超えています。 システムのパフォーマンスを分析するためのUSEメソッドの詳細については、Brendan GreggのThe Utilization Saturation and Errors (USE) Methodページを参照してください。 GoogleのSRE Bookは、特に第6章:Monitoring Distributed Systemsのもう1つの役立つリソースです。 独自のGrafanaダッシュボードを作成する方法については、GrafanaのGetting Startedページをご覧ください。
次のステップでは、同様のプロセスに従って、Prometheus監視システムに接続して調査します。
[[step-4 -—- accessing-prometheus-and-alertmanager]] ==ステップ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 9093/TCP,6783/TCP 34m
doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 80/TCP 34m
doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 8080/TCP 34m
doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 9093/TCP 34m
doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 8080/TCP 34m
doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 9090/TCP 34m
doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 30206/TCP 34m
prometheus-operated ClusterIP 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ドキュメントのQuerying Prometheusを参照してください。
[Expression]フィールドにmachine_cpu_cores
と入力し、Executeを押します。 特定のノードのCPUコアの数を報告するメトリックmachine_cpu_cores
の時系列のリストが表示されます。 メトリックラベルで、メトリックを生成したノードとメトリックをスクレイピングしたジョブを確認できます。
最後に、上部のナビゲーションバーで、StatusをクリックしてからTargetsをクリックし、Prometheusがスクレイプするように構成されているターゲットのリストを表示します。 Step 2の先頭に記載されている監視エンドポイントのリストに対応するターゲットのリストが表示されます。
Promtheusの詳細と、クラスターメトリックをクエリする方法については、公式のPrometheus docsを参照してください。
同様のプロセスに従って、Prometheusによって生成されたアラートを管理するAlertManagerに接続します。 Prometheusの上部ナビゲーションバーでAlertsをクリックすると、これらのアラートを調べることができます。
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 9093/TCP,6783/TCP 34m
doks-cluster-monitoring-grafana ClusterIP 10.245.105.130 80/TCP 34m
doks-cluster-monitoring-kube-state-metrics ClusterIP 10.245.140.151 8080/TCP 34m
doks-cluster-monitoring-pr-alertmanager ClusterIP 10.245.197.254 9093/TCP 34m
doks-cluster-monitoring-pr-operator ClusterIP 10.245.14.163 8080/TCP 34m
doks-cluster-monitoring-pr-prometheus ClusterIP 10.245.201.173 9090/TCP 34m
doks-cluster-monitoring-prometheus-node-exporter ClusterIP 10.245.72.218 30206/TCP 34m
prometheus-operated ClusterIP 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の詳細については、official Alertmanager documentationを参照してください。
結論
このチュートリアルでは、ダッシュボード、Prometheusルール、およびアラートの標準セットを使用して、Prometheus、Grafana、Alertmanagerの監視スタックをDigitalOcean Kubernetesクラスターにインストールしました。 これはHelmを使用して行われたため、helm upgrade
、helm rollback
、およびhelm delete
を使用して、監視スタックをアップグレード、ロールバック、または削除できます。 これらの関数の詳細については、How To Install Software on Kubernetes Clusters with the Helm Package Managerを参照してください。
prometheus-operator
チャートは、Helmを使用してクラスターの監視を迅速に開始および実行するのに役立ちます。 Prometheus Operatorを手動で構築、展開、および構成することができます。 これを行うには、Prometheus Operatorおよびkube-prometheusのGitHubリポジトリを参照してください。