序章

トレースとロギングに加えて、モニタリングとアラートは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クラスターにインストールする方法を示します。 チュートリアルが終了するまでに、完全な監視スタックがクラスターにインストールされます。

前提条件

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

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

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

まず、nanoまたはお気に入りのエディターを使用して、ローカルマシンでcustom-values.yamlというファイルを作成して開きます。

  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の永続ストレージを有効にして、ポッドの再起動後もデータが保持されるようにします。 舞台裏では、これは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サーバーをリッスンし、デプロイやポッドなどの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で作成したカスタム値ファイルを渡します。 最後に、Helm stableディレクトリからprometheus-operatorチャートをインストールすることを指定します。

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

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

prometheus-operator Helmチャートは、GrafanaをClusterIPサービスとして公開します。つまり、クラスター内部のIPアドレスを介してのみアクセスできます。 Kubernetesクラスタの外部でGrafanaにアクセスするには、kubectl patchを使用して、サービスをNodePortLoadBalancerkubectl port-forwardローカルポートをGrafanaポッドポートに転送します。

このチュートリアルではポートを転送しますが、kubectl patchとKubernetesサービスの種類について詳しくは、 kubectlpatchServicesを使用してAPIオブジェクトをインプレースで更新するをご覧ください。公式のKubernetesドキュメントから。

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

ローカルポート8000doks-cluster-monitoring-grafanaサービスのポート80に転送し、次に実行中のGrafanaポッドのポート3000に転送します。 これらのサービスポートとポッドポートは、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ポッドに正常に転送されていることを示しています。

Webブラウザでhttp://localhost:8000にアクセスします。 次のGrafanaログインページが表示されます。

Grafana Login Page

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

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

Grafana Home Page

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

Grafana Dashboard Tab

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

Grafana Dashboard List

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

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

Grafana Nodes Dashboard

各ダッシュボードと、それを使用してクラスターのメトリックデータを視覚化する方法を説明することは、このチュートリアルの範囲を超えています。 システムのパフォーマンスを分析するためのUSEメソッドの詳細については、Brendan Greggの使用率の飽和とエラー(USE)メソッドページを参照してください。 GoogleのSREBook は、もう1つの役立つリソースであり、特に第6章:分散システムの監視です。 独自のGrafanaダッシュボードを作成する方法については、Grafanaのはじめにページをご覧ください。

次のステップでは、同様のプロセスに従って、Prometheus監視システムに接続して探索します。

ステップ4—PrometheusとAlertmanagerへのアクセス

Prometheus Podに接続するには、もう一度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

ローカルポート9090doks-cluster-monitoring-pr-prometheusサービスのポート9090に転送します。

  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がPrometheusポッドに正常に転送されていることを示しています。

Webブラウザでhttp://localhost:9090にアクセスします。 次のPrometheusGraphページが表示されます。

Prometheus Graph Page

ここから、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名前空間で実行中のサービスを一覧表示することから始めます。

  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

ローカルポート9093doks-cluster-monitoring-pr-alertmanagerサービスのポート9093に転送します。

  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ポッドに正常に転送されていることを示しています。

Webブラウザでhttp://localhost:9093にアクセスします。 次のAlertmanagerAlertsページが表示されます。

Alertmanager Alerts Page

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

結論

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

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