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

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

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

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

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

Google Cloud Managed Service for Prometheus を有効にする

Google Cloud Managed Service for Prometheus の構成は、stackdriver という名前の Stackdriver オブジェクトで指定します。ベスト プラクティスやトラブルシューティングなどの詳細については、Google Cloud Managed Service for 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
    

Google Cloud 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 リソースを構成する

このセクションでは、サンプル アプリケーションによって出力された指標データをキャプチャして Google Cloud Managed Service for Prometheus に送信するように、PodMonitoring カスタム リソースを構成します。PodMonitoring カスタム リソースでは、ターゲット スクレイピングが使用されます。この場合、コレクタ エージェントはサンプル アプリケーションがデータを出力する /metrics エンドポイントを取得します。

PodMonitoring カスタム リソースは、デプロイされている名前空間内のターゲットのみをスクレイピングします。複数の名前空間のターゲットをスクレイピングするには、各名前空間に同じ PodMonitoring カスタム リソースをデプロイします。次のコマンドを実行して、目的の名前空間に PodMonitoring リソースがインストールされていることを確認できます。

kubectl --kubeconfig CLUSTER_KUBECONFIG get podmonitoring -A

Google Cloud Managed Service for 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

これで Google Cloud Managed Service for 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」指標に対する Google Cloud 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 へのネットワーク トラフィックを減らすことができます。Google Distributed Cloud リリース 1.15.0 から、enableCloudLoggingForApplicationstrue に設定されている場合、次の条件でアプリケーション ログをフィルタできます。

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

Google Distributed Cloud は、フィルタ結果のみを 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