アプリケーションのロギングとモニタリングを有効にする

このページでは、ユーザー アプリケーションからのカスタムのログと指標が Cloud Logging、Cloud Monitoring、Google Cloud Managed Service for Prometheus に送信されるように、GKE on Bare Metal クラスタを構成する方法について説明します。

最適なユーザー アプリケーションのロギングとモニタリングを実現するには、次の構成を使用することを強くおすすめします。

  • Stackdriver オブジェクトで enableGMPForApplicationstrue に設定して、Google Cloud Managed Service for Prometheus を有効にします。この構成では、Prometheus を使用してワークロードをグローバルにモニタリングし、アラートを出すことができます。手順と追加情報については、このページの Managed Service for Prometheus を有効にするをご覧ください。

  • Stackdriver オブジェクトの enableCloudLoggingForApplicationstrue に設定して、ユーザー アプリケーションの Cloud Logging を有効にします。この構成により、ワークロードのロギングが可能になります。手順と追加情報については、このページのユーザー アプリケーション用の Cloud Logging を有効にするをご覧ください。

  • クラスタ リソースで enableApplicationfalse に設定して、ユーザー アプリケーションの以前の Logging と Monitoring を無効にします。この機能を無効にすると、アプリケーション指標が 2 回収集されなくなります。ユーザー アプリケーション(レガシー)の Logging と Monitoring を有効にするの手順を使用しますが、enableApplicationtrue ではなく false に設定します。

Prometheus 向けのマネージド サービスの有効化

Prometheus 向けのマネージド サービスの構成は、stackdriver という名前の Stackdriver オブジェクトで指定します。ベスト プラクティスやトラブルシューティングなどの詳細については、Prometheus 向けのマネージド サービスのドキュメントをご覧ください。

Prometheus 向けの Google Cloud マネージド サービスを有効にするように stackdriver オブジェクトを構成するには:

  1. Stackdriver オブジェクトを編集用に開きます。

    kubectl --kubeconfig=CLUSTER_KUBECONFIG \
        --namespace kube-system edit stackdriver stackdriver
    

    CLUSTER_KUBECONFIG は、ユーザー クラスタ kubeconfig ファイルのパスに置き換えます。

  2. spec で、enableGMPForApplicationstrue に設定します。

    apiVersion: addons.gke.io/v1alpha1
    kind: Stackdriver
    metadata:
      name: stackdriver
      namespace: kube-system
    spec:
      projectID: ...
      clusterName: ...
      clusterLocation: ...
      proxyConfigSecretName: ...
      enableGMPForApplications: true
      enableVPC: ...
      optimizedMetrics: true
    
  3. 編集したファイルを保存して閉じます。

    Google マネージド Prometheus コンポーネントは、クラスタの gmp-system 名前空間で自動的に開始されます。

  4. 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 つのレプリカを使用します。

アプリケーションをデプロイするには:

  1. サンプル アプリケーションの一部として作成するリソースに gmp-test Namespace を作成します。

    kubectl --kubeconfig=CLUSTER_KUBECONFIG create ns gmp-test
    
  2. 次のコマンドを使用して、アプリケーション マニフェストを適用します。

    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 クエリを実行する手順は次のとおりです。

  1. Google Cloud コンソールで [モニタリング] ページに移動するか、次のボタンをクリックします。

    [モニタリング] に移動

  2. ナビゲーション パネルで、 [Metrics Explorer] を選択します。

  3. Prometheus Query Language(PromQL)を使用して、グラフに表示するデータを指定します。

    1. [指標を選択] ペインのツールバーで、[コードエディタ] を選択します。

    2. [言語] 切り替えボタンの [PromQL] を選択します。言語切り替えボタンは、[コードエディタ] ペインの下部にあります。

    3. 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 指標を表示するグラフを示しています。

Prometheus の「anthos_container_cpu_usage_seconds_total」指標の Managed Service for Prometheus グラフ。

大量のデータを収集する場合は、エクスポートした指標をフィルタリングして費用を抑えられる可能性があります。

ユーザー アプリケーションのために Cloud Logging を有効にする

Cloud Logging と Cloud Monitoring の構成は、stackdriver という名前の Stackdriver オブジェクトに保持されます。

  1. Stackdriver オブジェクトを編集用に開きます。

    kubectl --kubeconfig=CLUSTER_KUBECONFIG \
        --namespace kube-system edit stackdriver stackdriver
    

    CLUSTER_KUBECONFIG は、ユーザー クラスタ kubeconfig ファイルのパスに置き換えます。

  2. spec セクションで、enableCloudLoggingForApplicationstrue に設定します。

    apiVersion: addons.gke.io/v1alpha1
      kind: Stackdriver
      metadata:
        name: stackdriver
        namespace: kube-system
      spec:
        projectID: ...
        clusterName: ...
        clusterLocation: ...
        proxyConfigSecretName: ...
        enableCloudLoggingForApplications: true
        enableVPC: ...
        optimizedMetrics: true
    
  3. 編集したファイルを保存して閉じます。

サンプル アプリケーションを実行する

このセクションでは、カスタムログを書き込むアプリケーションを作成します。

  1. 次の 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
    
  2. Deployment を作成する

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-app.yaml
    

アプリケーション ログを表示

コンソール

  1. Google Cloud コンソールのログ エクスプローラに移動します。

    [ログ エクスプローラ] に移動

  2. [リソース] をクリックします。[すべてのリソースタイプ] メニューで、[Kubernetes コンテナ] を選択します。

  3. [CLUSTER_NAME] で、ユーザー クラスタの名前を選択します。

  4. [NAMESPACE_NAME] で [デフォルト] を選択します。

  5. [追加] をクリックしてから、[クエリを実行] をクリックします。

  6. [クエリ結果] で、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

  1. 次のコマンドを実行します。

    gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \
        resource.type="k8s_container" AND resource.labels.namespace_name="default"'
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  2. 出力で、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 から、enableCloudLoggingForApplicationstrue に設定されている場合、次の条件でアプリケーション ログをフィルタできます。

  • Pod ラベル(podLabelSelectors
  • 名前空間(namespaces
  • ログコンテンツの正規表現(contentRegexes

GKE on Bare Metal は、フィルタ結果のみを Cloud Logging に送信します。

アプリケーション ログフィルタを定義する

Logging の構成は、stackdriver という名前の Stackdriver オブジェクトで指定されます。

  1. stackdriver オブジェクトを編集用に開きます。

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \
        edit stackdriver stackdriver
    

    USER_CLUSTER_KUBECONFIG は、ユーザー クラスタ kubeconfig ファイルのパスに置き換えます。

  2. specappLogFilter セクションを追加します。

      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
    
  3. 編集したファイルを保存して閉じます。

  4. (省略可)podLabelSelectors を使用している場合は、stackdriver-log-forwarder DaemonSet を再起動して、できるだけ早く変更を有効にします。

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \
        rollout restart daemonset stackdriver-log-forwarder
    

    通常、podLabelSelectors は 10 分後に有効になります。DaemonSet stackdriver-log-forwarder を再起動すると、変更がより迅速に有効になります。

例: ERROR または WARN ログを prod 名前空間にのみ含める

次の例は、アプリケーション ログフィルタの仕組みを示しています。名前空間(prod)、正規表現(.*(ERROR|WARN).*)、Pod ラベル(disableGCPLogging=yes)を使用するフィルタを定義します。次に、フィルタが機能することを確認するため、prod 名前空間で Pod を実行して、これらのフィルタ条件をテストします。

アプリケーション ログフィルタを定義してテストするには:

  1. 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
    ...
    
  2. prod 名前空間に Pod をデプロイし、ERRORINFO のログエントリを生成するスクリプトを実行します。

    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 エントリは含まれません。

  3. ラベル 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 フィールドを使用します。

  1. クラスタ構成ファイルを更新して、enableApplicationtrue に設定します。

    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
        ...
    
  2. 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 セクションに同じアノテーションを追加します。

サンプル アプリケーションを実行する

このセクションでは、カスタムログを書き込み、カスタム指標を公開するアプリケーションを作成します。

  1. 次の 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
    
  2. Deployment と Service を作成します。

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-app.yaml
    

アプリケーション ログを表示

コンソール

  1. Google Cloud コンソールのログ エクスプローラに移動します。

    ログ エクスプローラに移動

  2. [リソース] をクリックします。[すべてのリソースタイプ] で、[Kubernetes コンテナ] を選択します。

  3. [CLUSTER_NAME] で、ユーザー クラスタの名前を選択します。

  4. [NAMESPACE_NAME] で [デフォルト] を選択します。

  5. [追加] をクリックしてから、[クエリを実行] をクリックします。

  6. [クエリ結果] で、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

  1. 次のコマンドを実行します。

    gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \
        resource.type="k8s_container" AND resource.labels.namespace_name="default"'
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  2. 出力で、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 コンソールで、その指標の値を確認できます。

  1. Google Cloud コンソールの Metrics Explorer に移動します。

    Metrics Explorer に移動

  2. [リソースタイプ] で、Kubernetes Pod または Kubernetes Container を選択します。

  3. [指標] で [external.googleapis.com/prometheus/example_monitoring_up] を選択します。

  4. このチャートでは、example_monitoring_up の繰り返し値が 1 であることがわかります。