GNU/Linux >> Linux の 問題 >  >> Cent OS

PrometheusでKubernetesを監視する方法

はじめに

Prometheusは、オープンソースのインストルメンテーションフレームワークです。 Prometheusは毎秒大量のデータを吸収できるため、複雑なワークロードに最適です。

Prometheusを使用してサーバー、VM、データベースを監視し、そのデータを利用してアプリケーションとインフラストラクチャのパフォーマンスを分析します。

この記事では、KubernetesクラスタでPrometheusモニタリングを設定する方法について説明します。

前提条件

  • Kubernetesクラスター
  • 完全に構成されたkubectl ローカルマシンのコマンドラインインターフェイス

Prometheusを使用したKubernetesクラスターのモニタリング

Prometheusはプルベースのシステムです。 HTTPリクエスト、いわゆるscrapeを送信します デプロイメントファイルで定義された構成に基づく 。このscrapeへの応答 リクエストは、スクレイプ自体のメトリックとともにストレージに保存および解析されます。

ストレージはPrometheusサーバー上のカスタムデータベースであり、大量のデータの流入を処理できます。 1台のサーバーで数千台のマシンを同時に監視することが可能です。

Prometheusがデータを収集できるように、データを適切に公開してフォーマットする必要があります。 Prometheusは、アプリのクライアントライブラリから直接、またはエクスポーターを使用してデータにアクセスできます。

輸出業者 完全に制御できないデータ(カーネルメトリックなど)に使用されます。エクスポータは、アプリケーションの隣に配置されるソフトウェアです。その目的は、PrometheusからのHTTPリクエストを受け入れ、データがサポートされている形式であることを確認してから、リクエストされたデータをPrometheusサーバーに提供することです。

これで、すべてのアプリケーションがPrometheusにデータを提供するようになりました。そのデータを探す場所をPrometheusに通知する必要があります。 Prometheusは、 Service Discovery を使用して、スクレイプするターゲットを検出します

Kubernetesクラスタには、すでにラベルとアノテーションがあり、変更とその要素のステータスを追跡するための優れたメカニズムがあります。したがって、PrometheusはKubernetesAPIを使用してターゲットを検出します。

Prometheusに公開できるKubernetesサービスディスカバリは次のとおりです。

  • ノード
  • エンドポイント
  • サービス
  • ポッド
  • 入力

Prometheusは、アプリケーション情報とは別にマシンレベルのメトリックを取得します。メモリ、ディスクスペース、CPU使用率、帯域幅の指標を公開する唯一の方法は、ノードエクスポータを使用することです。 。さらに、cgroupに関するメトリックも公開する必要があります。

幸い、cAdvisorエクスポーターはすでにKubernetesノードレベルに組み込まれており、簡単に公開できます。

システムがデータを収集したら、PromQLクエリ言語を使用してデータにアクセスしたり、Grafanaなどのグラフィカルインターフェースにエクスポートしたり、Alertmanagerでアラートを送信したりできます。

KubernetesにPrometheusMonitoringをインストールする

Prometheusモニタリングは、YAML(Yet Another Markup Language)ファイルのセットを使用してKubernetesクラスターにインストールできます。これらのファイルには、Prometheusがリソースにアクセスし、クラスターの要素をスクレイピングして情報を取得できるようにする構成、権限、およびサービスが含まれています。

YAMLファイルは簡単に追跡、編集でき、無期限に再利用できます。このチュートリアルで紹介するファイルは、GitHubなどのオンラインリポジトリで簡単かつ無料で入手できます。

モニタリング名前空間の作成

Kubernetesのすべてのリソースは名前空間で開始されます。指定されていない限り、システムはデフォルトのネームスペースを使用します。クラスタ監視プロセスをより適切に制御するために、監視名前空間を指定します。

名前空間の名前は、DNSと互換性のあるラベルである必要があります。簡単に参照できるように、名前空間に監視という名前を付けます。

KubernetesAPIからメトリックを取得するためのモニタリング名前空間を作成する方法は2つあります。

オプション1:

コマンドラインインターフェースにこの簡単なコマンドを入力し、監視を作成します ホストの名前空間:

kubectl create namespace monitoring

オプション2:

.ymlファイルを作成して適用します:

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring

この方法は、将来同じファイルをデプロイできるので便利です。コマンドターミナルで次のコマンドを入力して、ファイルをクラスターに適用します。

kubectl -f apply namespace monitoring.yml

使用する方法に関係なく、次のコマンドを使用して既存の名前空間を一覧表示します。

kubectl get namespaces

Prometheusデプロイメントファイルの構成

次のセクションには、Kubernetesクラスターとその要素でPrometheusスクレイピングを正常に設定するために必要な要素が含まれています。

セクションは、個別の .ymlとして実装できます。 順番に実行されるファイル。各ファイルを作成したら、次のコマンドを入力して適用できます。

kubectl -f apply [name_of_file].yml

この例では、すべての要素が単一の .ymlに配置されています ファイルと同時適用。

prometheus.yml この例のファイルは、 kubectlに指示します KubernetesAPIサーバーにリクエストを送信します。ファイルには次のものが含まれます:

  1. Prometheusがすべてのポッドとノードにアクセスできるようにする権限。
  2. プロメテウスconfigMap 廃棄する要素を定義します。
  3. Prometheusの導入手順。
  4. Prometheusユーザーインターフェイスへのアクセスを提供するサービス。

クラスターの役割、サービスアカウント、およびクラスターの役割のバインド

名前空間は、クラスター全体のデータを取得する場合にデフォルトの役割の権限を制限するように設計されており、Prometheusにそのクラスターのすべてのリソースへのアクセスを許可する必要があります。クラスタ全体のアクセスを提供する基本的なPrometheus.ymlファイルには、次の要素があります。

1.クラスターの役割を定義する

各ルールの動詞は、ロールがapiGroupsで実行できるアクションを定義します。

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]

2.サービスアカウントを作成する

さらに、この役割を適用するサービスアカウントを作成する必要があります:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: monitoring

3.ClusterRoleBindingを適用します

最後に、 ClusterRoleBindingを適用する必要があります 。このアクションにより、サービスアカウントが以前に作成されたクラスターロールにバインドされます。

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitoring

これらのリソースをファイルに追加することで、Prometheusに監視からのクラスター全体のアクセスを許可しました。 名前空間。

Prometheus ConfigMap

ファイルのこのセクションには、スクレイピングプロセスの手順が記載されています。 Kubernetesクラスタの各要素の具体的な手順は、モニタリング要件とクラスタ設定に一致するようにカスタマイズする必要があります。

1。グローバルスクレープルール

apiVersion: v1
data:
  prometheus.yml: |
    global:
      scrape_interval: 10s

2。スクレープノード

このサービスディスカバリは、Kubernetesクラスターを構成するノードを公開します。 kubeletはすべてのノードで実行され、貴重な情報のソースです。

2.1スクレープクベレット

    scrape_configs:
    - job_name: 'kubelet'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true  # Required with Minikube.

2.2 Scrape cAdvisor(コンテナレベルの情報)

クベレット コンテナではなく、それ自体に関する情報のみを提供します。コンテナレベルから情報を受け取るには、エクスポータを使用する必要があります。 cAdvisor すでに埋め込まれており、metrics_pathのみが必要です : /metrics / cadvisor Prometheusがコンテナデータを収集する場合:

    - job_name: 'cadvisor'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true  # Required with Minikube.
      metrics_path: /metrics/cadvisor

3。スクレープAPIServer

エンドポイントの役割を使用して、各アプリケーションインスタンスをターゲットにします。ファイルのこのセクションでは、Kubernetesクラスター内のAPIサーバーをスクレイプできます。

    - job_name: 'k8apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true  # Required if using Minikube.
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
   - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https

4。 Kubernetesサービス(APIサーバーを除く)のスクレープポッド

すべてのKubernetesサービスをサポートするポッドをスクレイプし、APIサーバーの指標を無視します。

- job_name: 'k8services'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels:
          - __meta_kubernetes_namespace
          - __meta_kubernetes_service_name
        action: drop
        regex: default;kubernetes
      - source_labels:
          - __meta_kubernetes_namespace
        regex: default
        action: keep
      - source_labels: [__meta_kubernetes_service_name]
        target_label: job

5。ポッドの役割

コンテナ名をジョブラベルとして使用して、名前メトリックを持つすべてのポッドポートを検出します。

- job_name: 'k8pods'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_container_port_name]
        regex: metrics
        action: keep
      - source_labels: [__meta_kubernetes_pod_container_name]
        target_label: job
kind: ConfigMap
metadata:
  name: prometheus-config

6。 ReplicaSetを構成する

必要なレプリカの数と、定義されたポッドのセットに適用されるテンプレートを定義します。

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: prometheus
spec:
  selector:
    matchLabels:
      app: prometheus
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      serviceAccountName: prometheus
      containers:
      - name: prometheus
        image: prom/prometheus:v2.1.0
        ports:
        - containerPort: 9090
          name: default
        volumeMounts:
        - name: config-volume
          mountPath: /etc/prometheus
      volumes:
      - name: config-volume
        configMap:
         name: prometheus-config

7。 nodePortを定義する

Prometheusは現在クラスターで実行されています。次のセクションをprometheus.ymlに追加します ファイルを使用すると、Prometheusが収集したデータにアクセスできます。

kind: Service
apiVersion: v1
metadata:
  name: prometheus
spec:
  selector:
    app: prometheus
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 9090
    targetPort: 9090
    nodePort: 30909

prometheus.ymlファイルを適用する

ファイルで定義された構成マップは、デプロイメント上のすべてのポッドに構成データを提供します。

kubectl apply -f prometheus.yml

prometheus.ymlで定義された個々のノードURLとnodePortを使用します ブラウザからPrometheusにアクセスするためのファイル。例:

http://192.153.99.106:30909

ノードのURLまたはIPを入力し、ymlファイルからポートを指定することで、PrometheusMonitoringに正常にアクセスできるようになりました。

kube-state-metricsを監視する方法は? (オプション)

これで、Kubernetesインフラストラクチャとアプリケーションインスタンスを完全に監視できるようになりました。ただし、これには、Kubernetesがクラスタ内のリソースに関して持っている情報に関する指標は含まれていません。

kube-state-metricsは、Prometheusがその情報も取得できるようにするエクスポーターです。 kube-state-metricsエクスポーター用のYAMLファイルを作成します:

---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: kube-state-metrics
spec:
  selector:
    matchLabels:
      app: kube-state-metrics
  replicas: 1
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: prometheus
      containers:
      - name: kube-state-metrics
        image: quay.io/coreos/kube-state-metrics:v1.2.0
        ports:
        - containerPort: 8080
          name: monitoring
---
kind: Service
apiVersion: v1
metadata:
  name: kube-state-metrics
spec:
  selector:
    app: kube-state-metrics
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

次のコマンドを入力して、ファイルを適用します。

kubectl apply -f kube-state-metrics.yml

ファイルを適用したら、ノードIP / URLを入力し、以前に定義したようにnodePortを定義して、Prometheusにアクセスします。


Cent OS
  1. Ubuntu20.04にMinikubeを使用してKubernetesをインストールする方法

  2. CentosでSysstatを使用してシステムを監視する方法

  3. Xrandrで接続されているモニターを一覧表示するにはどうすればよいですか?

  1. Ansibleを使用してPrometheusでシステム監視を設定する方法

  2. CentOS6でMuninを使用してサーバーのリソース使用量を監視する方法

  3. Osqueryを使用してLinuxサーバーのセキュリティを監視する方法

  1. Rancherを使用してKubernetesクラスターをセットアップする方法

  2. KubernetesにRabbitMQをデプロイする方法

  3. CentOS 8にMinikubeを使用してKubernetes(k8s)をインストールする方法