HelmおよびPrometheusオペレーターを使用してDigitalOcean Kubernetesクラスター監視を設定する方法

前書き

トレースとロギングに加えて、監視とアラートはKubernetesの可観測性スタックの重要なコンポーネントです。 Kubernetesクラスターの監視を設定すると、リソースの使用状況を追跡し、アプリケーションエラーを分析およびデバッグできます。

監視システムは通常、メトリックデータと視覚化レイヤーを格納する時系列データベースで構成されます。 さらに、アラートレイヤーはアラートを作成および管理し、必要に応じて統合および外部サービスに渡します。 最後に、1つ以上のコンポーネントが、この監視スタックによるアラート用に保存、視覚化、および処理されるメトリックデータを生成または公開します。

一般的な監視ソリューションの1つは、オープンソースのPrometheusGrafana、およびAlertmanagerスタックです。

  • Prometheusは、メトリックエンドポイントをポーリングし、これらのエンドポイントによって公開されたデータをスクレイピングおよび処理することによって機能する時系列データベースおよび監視ツールです。 時系列データクエリ言語であるPromQLを使用してこのデータをクエリできます。

  • Grafanaは、メトリックデータのダッシュボードとグラフを作成できるデータ視覚化および分析ツールです。

  • Alertmanagerは、通常Prometheusと一緒にデプロイされ、スタックのアラートレイヤーを形成し、Prometheusによって生成されたアラートを処理し、重複排除、グループ化、および電子メールやPagerDutyなどの統合へのルーティングを行います。

さらに、kube-state-metricsnode_exporterなどのツールは、クラスターレベルのKubernetesオブジェクトメトリックと、CPUやメモリ使用量などのマシンレベルのメトリックを公開します。

このモニタリングスタックをKubernetesクラスターに実装することは複雑になる可能性がありますが、幸いなことに、この複雑さの一部は、HelmパッケージマネージャーとCoreOSのPrometheus Operatorおよびkube-prometheusプロジェクトで管理できます。 これらのプロジェクトは、PrometheusとGrafanaの標準構成とダッシュボードを作成し、下位レベルのKubernetesオブジェクト定義の一部を抽象化します。 Helmprometheus-operator chartを使用すると、Prometheus Operatorと上記の残りのコンポーネントを、Kubernetesクラスターのモニタリングに役立つダッシュボード、ルール、アラートのデフォルトセットとともにインストールすることで、完全なクラスターモニタリングソリューションを稼働させることができます。

このチュートリアルでは、prometheus-operatorHelmチャートをDigitalOceanKubernetesクラスターにインストールする方法を示します。 チュートリアルの最後までに、完全な監視スタックをクラスターにインストールします。

前提条件

このチュートリアルを実行するには、次のものが必要です。

[[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 repothis 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で作成したカスタム値ファイルを渡します。 最後に、Helmstabledirectoryから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を使用して、インプレースのサービスをNodePortLoadBalancerなどの公開タイプに更新するか、kubectl port-forwardを次のように更新します。ローカルポートをGrafanaPodポートに転送します。

このチュートリアルではポートを転送しますが、kubectl patchとKubernetesサービスタイプの詳細については、公式のKubernetesドキュメントからUpdate API Objects in Place Using kubectl patchServicesを参照してください。

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

ローカルポート8000doks-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ログインページが表示されます。

Grafana Login Page

custom-values.yamlで構成したユーザー名とパスワードとしてadminを入力します。 次に、Log Inを押します。

次のHome Dashboardに移動します。

Grafana Home Page

左側のナビゲーションバーで、Dashboardsボタンを選択し、Manageをクリックします。

Grafana Dashboard Tab

次のダッシュボード管理インターフェイスが表示されます。このインターフェイスには、prometheus-operatorヘルムチャートによってインストールされたダッシュボードが一覧表示されます。

Grafana Dashboard List

これらのダッシュボードは、kubernetes-mixinによって生成されます。これは、クラスター監視GrafanaダッシュボードとPrometheusアラートの標準化されたセットを作成できるオープンソースプロジェクトです。 詳細については、Kubernetes Mixin GitHub repoを参照してください。

Kubernetes / Nodesダッシュボードをクリックして、特定のノードのCPU、メモリ、ディスク、およびネットワークの使用状況を視覚化します。

Grafana Nodes Dashboard

各ダッシュボードの説明と、それを使用してクラスターのメトリックデータを視覚化する方法は、このチュートリアルの範囲を超えています。 システムのパフォーマンスを分析するための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

ローカルポート9090doks-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 Graph Page

ここから、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

ローカルポート9093doks-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 Alerts Page

ここから、アラートの発動とオプションでそれらのサイレンシングを探索できます。 Alertmanagerの詳細については、official Alertmanager documentationを参照してください。

結論

このチュートリアルでは、ダッシュボード、Prometheusルール、およびアラートの標準セットを使用して、Prometheus、Grafana、Alertmanagerの監視スタックをDigitalOcean Kubernetesクラスターにインストールしました。 これはHelmを使用して行われたため、helm upgradehelm 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リポジトリを参照してください。

Related