序章

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

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

人気のある監視ソリューションの1つは、オープンソースの Prometheus Grafana 、およびAlertmanagerスタックです。

  • Prometheus は、時系列データベースおよび監視ツールであり、メトリックエンドポイントをポーリングし、これらのエンドポイントによって公開されたデータをスクレイピングおよび処理することで機能します。 時系列データクエリ言語であるPromQLを使用してこのデータをクエリできます。
  • Grafana は、データの視覚化および分析ツールであり、メトリックデータのダッシュボードとグラフを作成できます。
  • Alertmanager は、通常Prometheusと一緒にデプロイされ、スタックのアラートレイヤーを形成し、Prometheusによって生成されたアラートを処理し、それらを重複排除、グループ化して、電子メールやPagerDutyなどの統合にルーティングします。

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

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

このチュートリアルでは、をインストールする方法を示します prometheus-operator DigitalOceanKubernetesクラスターのヘルムチャート。 チュートリアルが終了するまでに、完全な監視スタックがクラスターにインストールされます。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • DigitalOceanKubernetesクラスター。
  • The kubectl ローカルマシンにインストールされ、クラスターに接続するように構成されたコマンドラインインターフェイス。 インストールと構成の詳細を読むことができます kubectl 公式ドキュメント
  • Helm Package Manager を使用してKubernetesクラスターにソフトウェアをインストールする方法で詳しく説明されているように、ローカルマシンにインストールされた Helm パッケージマネージャー(2.10+)とクラスターにインストールされたTiller。

ステップ1—カスタム値ファイルを作成する

インストールする前に prometheus-operator ヘルムチャート、DigitalOcean固有の構成パラメーターでチャートのデフォルトの一部をオーバーライドするカスタム値ファイルを作成します。 デフォルトのチャート値のオーバーライドの詳細については、Helmドキュメントの HelmInstallセクションを参照してください。

まず、というファイルを作成して開きます custom-values.yaml ローカルマシンで nano またはお気に入りの編集者:

  1. 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の永続ストレージを有効にして、ポッドの再起動後もデータが保持されるようにします。 舞台裏では、これは 5 Gi DigitalOcean Block Storage ストレージクラスを使用した、各コンポーネントの永続ボリュームクレーム(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またはデフォルト値ファイルのConfigurationセクションを参照してください。

編集が終わったら、ファイルを保存して閉じます。 これで、Helmを使用してチャートをインストールできます。

ステップ2—インストール prometheus-operator チャート

The 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 ヘルムチャートと上記で作成したカスタム値ファイルの受け渡し:

  1. helm install --namespace monitoring --name doks-cluster-monitoring -f custom-values.yaml stable/prometheus-operator

ここで実行します helm install すべてのコンポーネントをにインストールします monitoring 同時に作成する名前空間。 これにより、モニタリングスタックを残りのKubernetesクラスターからきれいに分離できます。 Helmリリースに名前を付けます doks-cluster-monitoring ステップ1で作成したカスタム値ファイルを渡します。 最後に、インストールすることを指定します prometheus-operator ヘルムからのチャート stable ディレクトリ

次の出力が表示されます。

Output
NAME: 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:

  1. kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring"

次のように表示されます。

Output
NAME 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へのアクセスとメトリクスデータの調査

The prometheus-operator ヘルムチャートはGrafanaを ClusterIP サービス。つまり、クラスター内部のIPアドレスを介してのみアクセスできます。 Kubernetesクラスタの外部でGrafanaにアクセスするには、次のいずれかを使用できます。 kubectl patch 所定のサービスを次のような公開タイプに更新します NodePort また LoadBalancer、 また kubectl port-forward ローカルポートをGrafanaポッドポートに転送します。

このチュートリアルでは、ポートを転送しますが、詳細については kubectl patch およびKubernetesサービスタイプについては、公式のKubernetesドキュメントから kubectlpatchおよびServicesを使用してAPIオブジェクトをインプレースで更新するを参照できます。

実行中のサービスをリストすることから始めます monitoring 名前空間:

  1. kubectl get svc -n monitoring

次のサービスが表示されます。

Output
NAME 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 ポートへ 80doks-cluster-monitoring-grafana サービス、順番にポートに転送されます 3000 実行中のGrafanaポッドの これらのサービスポートとポッドポートは、 stable/grafana ヘルムチャート値ファイル

  1. kubectl port-forward -n monitoring svc/doks-cluster-monitoring-grafana 8000:80

次の出力が表示されます。

Output
Forwarding from 127.0.0.1:8000 -> 3000 Forwarding from [::1]:8000 -> 3000

これは、ローカルポートが 8000 Grafanaポッドに正常に転送されています。

訪問 http://localhost:8000 Webブラウザで。 次のGrafanaログインページが表示されます。

設定したユーザー名とパスワードとしてadminを入力します custom-values.yaml. 次に、ログインを押します。

次のホームダッシュボードが表示されます。

左側のナビゲーションバーで、ダッシュボードボタンを選択し、管理をクリックします。

次のダッシュボード管理インターフェイスが表示されます。このインターフェイスには、によってインストールされたダッシュボードが一覧表示されます。 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 Podsに接続するには、もう一度使用する必要があります kubectl port-forward ローカルポートを転送します。 Grafanaの探索が終了したら、を押すことでポートフォワードトンネルを閉じることができます CTRL-C. または、新しいシェルとポート転送接続を開くこともできます。

実行中のサービスをリストすることから始めます monitoring 名前空間:

  1. kubectl get svc -n monitoring

次のサービスが表示されます。

Output
NAME 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 ポートへ 9090doks-cluster-monitoring-pr-prometheus サービス:

  1. kubectl port-forward -n monitoring svc/doks-cluster-monitoring-pr-prometheus 9090:9090

次の出力が表示されます。

Output
Forwarding from 127.0.0.1:9090 -> 9090 Forwarding from [::1]:9090 -> 9090

これは、ローカルポートが 9090 PrometheusPodに正常に転送されています。

訪問 http://localhost:9090 Webブラウザで。 次のPrometheusGraphページが表示されます。

ここから、Prometheusクエリ言語であるPromQLを使用して、データベースに保存されている時系列メトリックを選択して集計できます。 PromQLの詳細については、公式のPrometheusドキュメントから QueryingPrometheusを参照してください。

Expressionフィールドに次のように入力します machine_cpu_cores 実行を押します。 メトリックを含む時系列のリストが表示されます machine_cpu_cores 特定のノードのCPUコアの数を報告します。 メトリックラベルで、どのノードがメトリックを生成し、どのジョブがメトリックをスクレイプしたかを確認できます。

最後に、上部のナビゲーションバーで、ステータスターゲットの順にクリックして、Prometheusがスクレイプするように構成されているターゲットのリストを表示します。 ステップ2の冒頭で説明した監視エンドポイントのリストに対応するターゲットのリストが表示されます。

Promtheusの詳細と、クラスターメトリックを照会する方法については、公式のPrometheusドキュメントを参照してください。

同様のプロセスに従って、Prometheusによって生成されたアラートを管理するAlertManagerに接続します。 Prometheusの上部ナビゲーションバーにあるアラートをクリックすると、これらのアラートを調べることができます。

Alertmanagerポッドに接続するには、もう一度使用します kubectl port-forward ローカルポートを転送します。 Prometheusの探索が終了したら、を押すことでポートフォワードトンネルを閉じることができます CTRL-C. または、新しいシェルとポート転送接続を開くこともできます。

実行中のサービスをリストすることから始めます monitoring 名前空間:

  1. kubectl get svc -n monitoring

次のサービスが表示されます。

Output
NAME 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 ポートへ 9093doks-cluster-monitoring-pr-alertmanager サービス。

  1. kubectl port-forward -n monitoring svc/doks-cluster-monitoring-pr-alertmanager 9093:9093

次の出力が表示されます。

Output
Forwarding from 127.0.0.1:9093 -> 9093 Forwarding from [::1]:9093 -> 9093

これは、ローカルポートが 9093 Alertmanagerポッドに正常に転送されています。

訪問 http://localhost:9093 Webブラウザで。 次のAlertmanagerAlertsページが表示されます。

ここから、アラートの発火とオプションでアラートの消音を調べることができます。 Alertmanagerの詳細については、公式Alertmanagerドキュメントを参照してください。

結論

このチュートリアルでは、Prometheus、Grafana、Alertmanagerのモニタリングスタックを、ダッシュボード、Prometheusルール、アラートの標準セットを使用してDigitalOceanKubernetesクラスターにインストールしました。 これはHelmを使用して行われたため、次を使用できます。 helm upgrade, helm rollback、 と helm delete 監視スタックをアップグレード、ロールバック、または削除します。 これらの機能の詳細については、 HelmPackageManagerを使用してKubernetesクラスターにソフトウェアをインストールする方法を参照してください。

The prometheus-operator グラフは、Helmを使用してクラスターの監視をすばやく起動して実行するのに役立ちます。 Prometheus Operatorを手動でビルド、デプロイ、および構成することをお勧めします。 これを行うには、 プロメテウスオペレーターおよび[kube-prometheus](< https://github.com/coreos/kube-prometheus )GitHubリポジトリ。