はじめに
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サーバーにリクエストを送信します。ファイルには次のものが含まれます:
- Prometheusがすべてのポッドとノードにアクセスできるようにする権限。
- プロメテウスconfigMap 廃棄する要素を定義します。
- Prometheusの導入手順。
- 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にアクセスします。