このページでは、ユーザー アプリケーションからのカスタムのログと指標が Cloud Logging、Cloud Monitoring、Google Cloud Managed Service for Prometheus に送信されるように、GKE on Bare Metal クラスタを構成する方法について説明します。
最適なユーザー アプリケーションのロギングとモニタリングを実現するには、次の構成を使用することを強くおすすめします。
Stackdriver
オブジェクトでenableGMPForApplications
をtrue
に設定して、Google Cloud Managed Service for Prometheus を有効にします。この構成では、Prometheus を使用してワークロードをグローバルにモニタリングし、アラートを出すことができます。手順と追加情報については、このページの Managed Service for Prometheus を有効にするをご覧ください。Stackdriver
オブジェクトのenableCloudLoggingForApplications
をtrue
に設定して、ユーザー アプリケーションの Cloud Logging を有効にします。この構成により、ワークロードのロギングが可能になります。手順と追加情報については、このページのユーザー アプリケーション用の Cloud Logging を有効にするをご覧ください。クラスタ リソースで
enableApplication
をfalse
に設定して、ユーザー アプリケーションの以前の Logging と Monitoring を無効にします。この機能を無効にすると、アプリケーション指標が 2 回収集されなくなります。ユーザー アプリケーション(レガシー)の Logging と Monitoring を有効にするの手順を使用しますが、enableApplication
をtrue
ではなくfalse
に設定します。
Prometheus 向けのマネージド サービスの有効化
Prometheus 向けのマネージド サービスの構成は、stackdriver
という名前の Stackdriver
オブジェクトで指定します。ベスト プラクティスやトラブルシューティングなどの詳細については、Prometheus 向けのマネージド サービスのドキュメントをご覧ください。
Prometheus 向けの Google Cloud マネージド サービスを有効にするように stackdriver
オブジェクトを構成するには:
Stackdriver オブジェクトを編集用に開きます。
kubectl --kubeconfig=CLUSTER_KUBECONFIG \ --namespace kube-system edit stackdriver stackdriver
CLUSTER_KUBECONFIG
は、ユーザー クラスタ kubeconfig ファイルのパスに置き換えます。spec
で、enableGMPForApplications
をtrue
に設定します。apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableGMPForApplications: true enableVPC: ... optimizedMetrics: true
編集したファイルを保存して閉じます。
Google マネージド Prometheus コンポーネントは、クラスタの
gmp-system
名前空間で自動的に開始されます。Google が管理する Prometheus コンポーネントを確認します。
kubectl --kubeconfig=CLUSTER_KUBECONFIG --namespace gmp-system get pods
このコマンドの出力は、次のようになります。
NAME READY STATUS RESTARTS AGE collector-abcde 2/2 Running 1 (5d18h ago) 5d18h collector-fghij 2/2 Running 1 (5d18h ago) 5d18h collector-klmno 2/2 Running 1 (5d18h ago) 5d18h gmp-operator-68d49656fc-abcde 1/1 Running 0 5d18h rule-evaluator-7c686485fc-fghij 2/2 Running 1 (5d18h ago) 5d18h
Managed Service for Prometheus は、ルールの評価とアラートをサポートします。ルールの評価を設定するには、ルール評価をご覧ください。
サンプル アプリケーションを実行する
マネージド サービスは、metrics
ポートに Prometheus 指標を送信するサンプル アプリケーション prom-example
のマニフェトを提供します。このアプリケーションは 3 つのレプリカを使用します。
アプリケーションをデプロイするには:
サンプル アプリケーションの一部として作成するリソースに
gmp-test
Namespace を作成します。kubectl --kubeconfig=CLUSTER_KUBECONFIG create ns gmp-test
次のコマンドを使用して、アプリケーション マニフェストを適用します。
kubectl -n gmp-test apply \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/example-app.yaml
PodMonitoring リソースを構成する
このセクションでは、サンプル アプリケーションによって出力された指標データをキャプチャして Prometheus のマネージド サービスに送信するように、PodMonitoring
カスタム リソースを構成します。PodMonitoring
カスタム リソースでは、ターゲット スクレイピングが使用されます。この場合、コレクタ エージェントはサンプル アプリケーションがデータを出力する /metrics
エンドポイントを取得します。
PodMonitoring
カスタム リソースは、デプロイされている名前空間内のターゲットのみをスクレイピングします。複数の名前空間のターゲットをスクレイピングするには、各名前空間に同じ PodMonitoring
カスタム リソースをデプロイします。次のコマンドを実行して、目的の名前空間に PodMonitoring
リソースがインストールされていることを確認できます。
kubectl --kubeconfig CLUSTER_KUBECONFIG get podmonitoring -A
Prometheus カスタム リソースのすべてのマネージド サービスに関するリファレンス ドキュメントについては、prometheus-engine/doc/api リファレンスをご覧ください。
次のマニフェストでは、gmp-test
名前空間で PodMonitoring
リソース prom-example
を定義します。このリソースでは、名前空間にラベル app
があり、値が prom-example
のすべての Pod が検索されます。一致する Pod が 30 秒ごとに、/metrics
HTTP パスの metrics
というポートでスクレイピングされます。
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
name: prom-example
spec:
selector:
matchLabels:
app: prom-example
endpoints:
- port: metrics
interval: 30s
このリソースを適用するには、次のコマンドを実行します。
kubectl --kubeconfig CLUSTER_KUBECONFIG -n gmp-test apply \
-f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/pod-monitoring.yaml
Prometheus のマネージド サービスが、一致する Pod をスクレイピングしています。
指標データのクエリ
Prometheus データがエクスポートされていることを確認する最も簡単な方法は、Google Cloud コンソールの Metrics Explorer で PromQL クエリを使用することです。
PromQL クエリを実行する手順は次のとおりです。
Google Cloud コンソールで [モニタリング] ページに移動するか、次のボタンをクリックします。
ナビゲーション パネルで、 [Metrics Explorer] を選択します。
Prometheus Query Language(PromQL)を使用して、グラフに表示するデータを指定します。
[指標を選択] ペインのツールバーで、[コードエディタ] を選択します。
[言語] 切り替えボタンの [PromQL] を選択します。言語切り替えボタンは、[コードエディタ] ペインの下部にあります。
Query Editor にクエリを入力します。たとえば、過去 1 時間に各モードで使用された CPU の平均秒数をグラフ化するには、次のクエリを使用します。
avg(rate(kubernetes_io:anthos_container_cpu_usage_seconds_total {monitored_resource="k8s_node"}[1h]))
PromQL の使用の詳細については、Cloud Monitoring の PromQL をご覧ください。
次のスクリーンショットは、anthos_container_cpu_usage_seconds_total
指標を表示するグラフを示しています。
大量のデータを収集する場合は、エクスポートした指標をフィルタリングして費用を抑えられる可能性があります。
ユーザー アプリケーションのために Cloud Logging を有効にする
Cloud Logging と Cloud Monitoring の構成は、stackdriver
という名前の Stackdriver オブジェクトに保持されます。
Stackdriver オブジェクトを編集用に開きます。
kubectl --kubeconfig=CLUSTER_KUBECONFIG \ --namespace kube-system edit stackdriver stackdriver
CLUSTER_KUBECONFIG
は、ユーザー クラスタ kubeconfig ファイルのパスに置き換えます。spec
セクションで、enableCloudLoggingForApplications
をtrue
に設定します。apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableCloudLoggingForApplications: true enableVPC: ... optimizedMetrics: true
編集したファイルを保存して閉じます。
サンプル アプリケーションを実行する
このセクションでは、カスタムログを書き込むアプリケーションを作成します。
次の Deployment マニフェストを
my-app.yaml
という名前のファイルに保存します。apiVersion: apps/v1 kind: Deployment metadata: name: "monitoring-example" namespace: "default" labels: app: "monitoring-example" spec: replicas: 1 selector: matchLabels: app: "monitoring-example" template: metadata: labels: app: "monitoring-example" spec: containers: - image: gcr.io/google-samples/prometheus-dummy-exporter:latest name: prometheus-example-exporter imagePullPolicy: Always command: - /bin/sh - -c - ./prometheus-dummy-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090 resources: requests: cpu: 100m
Deployment を作成する
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-app.yaml
アプリケーション ログを表示
コンソール
Google Cloud コンソールのログ エクスプローラに移動します。
[リソース] をクリックします。[すべてのリソースタイプ] メニューで、[Kubernetes コンテナ] を選択します。
[CLUSTER_NAME] で、ユーザー クラスタの名前を選択します。
[NAMESPACE_NAME] で [デフォルト] を選択します。
[追加] をクリックしてから、[クエリを実行] をクリックします。
[クエリ結果] で、
monitoring-example
Deployment からのログエントリを確認できます。例:{ "textPayload": "2020/11/14 01:24:24 Starting to listen on :9090\n", "insertId": "1oa4vhg3qfxidt", "resource": { "type": "k8s_container", "labels": { "pod_name": "monitoring-example-7685d96496-xqfsf", "cluster_name": ..., "namespace_name": "default", "project_id": ..., "location": "us-west1", "container_name": "prometheus-example-exporter" } }, "timestamp": "2020-11-14T01:24:24.358600252Z", "labels": { "k8s-pod/pod-template-hash": "7685d96496", "k8s-pod/app": "monitoring-example" }, "logName": "projects/.../logs/stdout", "receiveTimestamp": "2020-11-14T01:24:39.562864735Z" }
gcloud CLI
次のコマンドを実行します。
gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \ resource.type="k8s_container" AND resource.labels.namespace_name="default"'
PROJECT_ID
は、プロジェクトの ID に置き換えます。出力で、
monitoring-example
Deployment からのログエントリを確認できます。次に例を示します。insertId: 1oa4vhg3qfxidt labels: k8s-pod/app: monitoring-example k8s- pod/pod-template-hash: 7685d96496 logName: projects/.../logs/stdout receiveTimestamp: '2020-11-14T01:24:39.562864735Z' resource: labels: cluster_name: ... container_name: prometheus-example-exporter location: us-west1 namespace_name: default pod_name: monitoring-example-7685d96496-xqfsf project_id: ... type: k8s_container textPayload: | 2020/11/14 01:24:24 Starting to listen on :9090 timestamp: '2020-11-14T01:24:24.358600252Z'
アプリケーション ログをフィルタする
アプリケーション ログをフィルタすると、アプリケーション ロギングの課金とクラスタから Cloud Logging へのネットワーク トラフィックを減らすことができます。GKE on Bare Metal リリース 1.15.0 から、enableCloudLoggingForApplications
が true
に設定されている場合、次の条件でアプリケーション ログをフィルタできます。
- Pod ラベル(
podLabelSelectors
) - 名前空間(
namespaces
) - ログコンテンツの正規表現(
contentRegexes
)
GKE on Bare Metal は、フィルタ結果のみを Cloud Logging に送信します。
アプリケーション ログフィルタを定義する
Logging の構成は、stackdriver
という名前の Stackdriver オブジェクトで指定されます。
stackdriver
オブジェクトを編集用に開きます。kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \ edit stackdriver stackdriver
USER_CLUSTER_KUBECONFIG は、ユーザー クラスタ kubeconfig ファイルのパスに置き換えます。
spec
にappLogFilter
セクションを追加します。apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: enableCloudLoggingForApplications: true projectID: ... clusterName: ... clusterLocation: ... appLogFilter: keepLogRules: - namespaces: - prod ruleName: include-prod-logs dropLogRules: - podLabelSelectors: - disableGCPLogging=yes ruleName: drop-logs
編集したファイルを保存して閉じます。
(省略可)
podLabelSelectors
を使用している場合は、stackdriver-log-forwarder
DaemonSet を再起動して、できるだけ早く変更を有効にします。kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \ rollout restart daemonset stackdriver-log-forwarder
通常、
podLabelSelectors
は 10 分後に有効になります。DaemonSetstackdriver-log-forwarder
を再起動すると、変更がより迅速に有効になります。
例: ERROR
または WARN
ログを prod
名前空間にのみ含める
次の例は、アプリケーション ログフィルタの仕組みを示しています。名前空間(prod
)、正規表現(.*(ERROR|WARN).*
)、Pod ラベル(disableGCPLogging=yes
)を使用するフィルタを定義します。次に、フィルタが機能することを確認するため、prod
名前空間で Pod を実行して、これらのフィルタ条件をテストします。
アプリケーション ログフィルタを定義してテストするには:
Stackdriver オブジェクトでアプリケーション ログフィルタを指定します。
次の
appLogFilter
の例では、prod
名前空間内のERROR
またはWARN
のログのみが保持されます。ラベルdisableGCPLogging=yes
が付いた Pod のログはすべて破棄されます。apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: ... appLogFilter: keepLogRules: - namespaces: - prod contentRegexes: - ".*(ERROR|WARN).*" ruleName: include-prod-logs dropLogRules: - podLabelSelectors: - disableGCPLogging=yes # kubectl label pods pod disableGCPLogging=yes ruleName: drop-logs ...
prod
名前空間に Pod をデプロイし、ERROR
とINFO
のログエントリを生成するスクリプトを実行します。kubectl --kubeconfig USER_CLUSTER_KUBECONFIG run pod1 \ --image gcr.io/cloud-marketplace-containers/google/debian10:latest \ --namespace prod --restart Never --command -- \ /bin/sh -c "while true; do echo 'ERROR is 404\\nINFO is not 404' && sleep 1; done"
フィルタされたログには、
ERROR
エントリのみが含まれ、INFO
エントリは含まれません。ラベル
disableGCPLogging=yes
を Pod に追加します。kubectl --kubeconfig USER_CLUSTER_KUBECONFIG label pods pod1 \ --namespace prod disableGCPLogging=yes
これで、フィルタされたログに
pod1
Pod のエントリが含まれなくなりました。
アプリケーション ログフィルタ API の定義
アプリケーション ログフィルタの定義は、Stackdriver カスタム リソース定義内で宣言されています。
Stackdriver カスタム リソースの定義を取得するには、次のコマンドを実行します。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get crd stackdrivers.addons.gke.io \
--namespace kube-system -o yaml
ユーザー アプリケーション(レガシー)で Logging と Monitoring を有効にする
このドキュメントの冒頭の構成ガイダンスに従うことを強くおすすめします。
次の手順は引き続き機能しますが、おすすめしません。次の手順を使用する前に、この関連する既知の問題をご覧ください。
アプリケーションの Logging と Monitoring を有効化するには、クラスタ構成ファイルで spec.clusterOperations.enableApplication
フィールドを使用します。
クラスタ構成ファイルを更新して、
enableApplication
をtrue
に設定します。apiVersion: v1 kind: Namespace metadata: name: cluster-user-basic --- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: user-basic namespace: cluster-user-basic spec: type: user ... clusterOperations: projectID: project-fleet location: us-central1 enableApplication: true ...
bmctl update
を使用して変更を適用します。bmctl update cluster -c CLUSTER_NAME --admin-kubeconfig=ADMIN_KUBECONFIG
以下を置き換えます。
CLUSTER_NAME
: アップグレードするクラスタの名前。ADMIN_KUBECONFIG
: 管理クラスタの kubeconfig ファイルのパス。
ワークロードにアノテーションを付加する
アプリケーションからのカスタム指標の収集を有効にするには、アプリケーションの Service マニフェストまたは Pod マニフェストに prometheus.io/scrape: "true"
アノテーションを追加するか、Pod に渡されるようにするために Deployment または DaemonSet マニフェストの spec.template
セクションに同じアノテーションを追加します。
サンプル アプリケーションを実行する
このセクションでは、カスタムログを書き込み、カスタム指標を公開するアプリケーションを作成します。
次の Service マニフェストと Deployment マニフェストを
my-app.yaml
という名前のファイルに保存します。Service にprometheus.io/scrape: "true"
というアノテーションが付いていることに注意してください。kind: Service apiVersion: v1 metadata: name: "monitoring-example" namespace: "default" annotations: prometheus.io/scrape: "true" spec: selector: app: "monitoring-example" ports: - name: http port: 9090 --- apiVersion: apps/v1 kind: Deployment metadata: name: "monitoring-example" namespace: "default" labels: app: "monitoring-example" spec: replicas: 1 selector: matchLabels: app: "monitoring-example" template: metadata: labels: app: "monitoring-example" spec: containers: - image: gcr.io/google-samples/prometheus-dummy-exporter:latest name: prometheus-example-exporter imagePullPolicy: Always command: - /bin/sh - -c - ./prometheus-dummy-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090 resources: requests: cpu: 100m
Deployment と Service を作成します。
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-app.yaml
アプリケーション ログを表示
コンソール
Google Cloud コンソールのログ エクスプローラに移動します。
[リソース] をクリックします。[すべてのリソースタイプ] で、[Kubernetes コンテナ] を選択します。
[CLUSTER_NAME] で、ユーザー クラスタの名前を選択します。
[NAMESPACE_NAME] で [デフォルト] を選択します。
[追加] をクリックしてから、[クエリを実行] をクリックします。
[クエリ結果] で、
monitoring-example
Deployment からのログエントリを確認できます。例:{ "textPayload": "2020/11/14 01:24:24 Starting to listen on :9090\n", "insertId": "1oa4vhg3qfxidt", "resource": { "type": "k8s_container", "labels": { "pod_name": "monitoring-example-7685d96496-xqfsf", "cluster_name": ..., "namespace_name": "default", "project_id": ..., "location": "us-west1", "container_name": "prometheus-example-exporter" } }, "timestamp": "2020-11-14T01:24:24.358600252Z", "labels": { "k8s-pod/pod-template-hash": "7685d96496", "k8s-pod/app": "monitoring-example" }, "logName": "projects/.../logs/stdout", "receiveTimestamp": "2020-11-14T01:24:39.562864735Z" }
gcloud CLI
次のコマンドを実行します。
gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \ resource.type="k8s_container" AND resource.labels.namespace_name="default"'
PROJECT_ID
は、プロジェクトの ID に置き換えます。出力で、
monitoring-example
Deployment からのログエントリを確認できます。例:insertId: 1oa4vhg3qfxidt labels: k8s-pod/app: monitoring-example k8s- pod/pod-template-hash: 7685d96496 logName: projects/.../logs/stdout receiveTimestamp: '2020-11-14T01:24:39.562864735Z' resource: labels: cluster_name: ... container_name: prometheus-example-exporter location: us-west1 namespace_name: default pod_name: monitoring-example-7685d96496-xqfsf project_id: ... type: k8s_container textPayload: | 2020/11/14 01:24:24 Starting to listen on :9090 timestamp: '2020-11-14T01:24:24.358600252Z'
Google Cloud コンソールでアプリケーションの指標を確認する
サンプル アプリケーションでは、example_monitoring_up
という名前のカスタム指標が公開されています。Google Cloud コンソールで、その指標の値を確認できます。
Google Cloud コンソールの Metrics Explorer に移動します。
[リソースタイプ] で、
Kubernetes Pod
またはKubernetes Container
を選択します。[指標] で [
external.googleapis.com/prometheus/example_monitoring_up
] を選択します。このチャートでは、
example_monitoring_up
の繰り返し値が 1 であることがわかります。