このページでは、Google Distributed Cloud のクラスタを構成する方法について説明します。これにより、ユーザー アプリケーションのカスタムのログと指標が Cloud Logging、Cloud Monitoring、Google Cloud Managed Service for Prometheus に送信されます。
ユーザー アプリケーションのロギングとモニタリングを最適化するには、次の構成を使用することを強くおすすめします。
Stackdriver
オブジェクトでenableGMPForApplications
をtrue
に設定して、Google Cloud Managed Service for Prometheus を有効にします。この構成では、Prometheus を使用してワークロードをグローバルにモニタリングし、アラートを行うことができます。手順と追加情報については、このページの Google Cloud Managed Service for Prometheus を有効にするをご覧ください。Stackdriver
オブジェクトのenableCloudLoggingForApplications
をtrue
に設定して、ユーザー アプリケーションの Cloud Logging を有効にします。この構成により、ワークロードのロギングが可能になります。手順と追加情報については、このページのユーザー アプリケーション用の Cloud Logging を有効にするをご覧ください。
Google Cloud Managed Service for Prometheus を有効にする
Google Cloud Managed Service for Prometheus の構成は、stackdriver
という名前の Stackdriver
オブジェクトで指定します。ベスト プラクティスやトラブルシューティングなどの詳細については、Google Cloud Managed Service for Prometheus のドキュメントをご覧ください。
Google Cloud Managed Service for Prometheus を有効にするように 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
Namespace で自動的に開始されます。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
Google Cloud 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 リソースを構成する
このセクションでは、サンプル アプリケーションによって出力された指標データをキャプチャして Google Cloud Managed Service for Prometheus に送信するように、PodMonitoring
カスタム リソースを構成します。PodMonitoring
カスタム リソースでは、ターゲット スクレイピングが使用されます。この場合、コレクタ エージェントは、サンプル アプリケーションがデータを出力する /metrics
エンドポイントを取得します。
PodMonitoring
カスタム リソースは、デプロイされている Namespace 内のターゲットのみをスクレイピングします。複数の Namespace のターゲットをスクレイピングするには、各 Namespace に同じ PodMonitoring
カスタム リソースをデプロイします。次のコマンドを実行して、目的の Namespace に PodMonitoring
リソースがインストールされていることを確認できます。
kubectl --kubeconfig CLUSTER_KUBECONFIG get podmonitoring -A
すべての Google Cloud Managed Service for Prometheus カスタム リソースに関するリファレンス ドキュメントについては、prometheus-engine/doc/api リファレンスをご覧ください。
次のマニフェストでは、gmp-test
Namespace で PodMonitoring
リソース(prom-example
)を定義します。このリソースでは、値が prom-example
のラベル app
がある Namespace で、すべての 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
これで Google Cloud Managed Service for Prometheus が、一致する Pod をスクレイピングするようになりました。
指標データのクエリ
Prometheus データがエクスポートされていることを確認する最も簡単な方法は、Google Cloud コンソールの Metrics Explorer で PromQL クエリを使用することです。
PromQL クエリを実行する手順は次のとおりです。
Google Cloud コンソールで [Monitoring] ページに移動するか、次のボタンをクリックします。
ナビゲーション パネルで、[ Metrics Explorer] を選択します。
Prometheus Query Language(PromQL)を使用して、グラフに表示するデータを指定します。
[指標を選択] ペインのツールバーで、[コードエディタ] を選択します。
言語切り替えボタンの [PromQL] を選択します。言語切り替えボタンは、[コードエディタ] ペインの下部にあります。
クエリエディタにクエリを入力します。たとえば、過去 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 コンソールで [ログ エクスプローラ] に移動します。
[リソース] をクリックします。[ALL RESOURCE TYPES] メニューで、[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 へのネットワーク トラフィックを減らすことができます。Google Distributed Cloud リリース 1.15.0 から、enableCloudLoggingForApplications
が true
に設定されている場合、次の条件でアプリケーション ログをフィルタできます。
- Pod ラベル(
podLabelSelectors
) - Namespace(
namespaces
) - ログコンテンツの正規表現(
contentRegexes
)
Google Distributed Cloud は、フィルタ結果のみを 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
Namespace にのみ含める
次の例は、アプリケーション ログフィルタの仕組みを示しています。Namespace(prod
)、正規表現(.*(ERROR|WARN).*
)、Pod ラベル(disableGCPLogging=yes
)を使用するフィルタを定義します。次に、フィルタが機能することを確認するため、prod
Namespace で Pod を実行して、これらのフィルタ条件をテストします。
アプリケーション ログ フィルタを定義してテストするには:
Stackdriver オブジェクトでアプリケーション ログフィルタを指定します。
次の
appLogFilter
の例では、prod
Namespace 内の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
Namespace に 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