启用应用日志记录和监控功能

本页面介绍了如何为 Anthos Clusters on Bare Metal 配置集群,以便将用户应用中的自定义日志和指标发送到 Cloud Logging 和 Cloud Monitoring 以及 Managed Service for Prometheus

启用 Managed Service for Prometheus

Managed Service for Prometheus 的配置在名为 stackdriverStackdriver 对象中指定。如需了解详情(包括最佳实践和问题排查),请参阅 Managed Service for Prometheus 文档

如需配置 stackdriver 对象以启用 Google Cloud Managed Service for Prometheus,请执行以下操作:

  1. 打开 Stackdriver 对象进行修改:

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

    CLUSTER_KUBECONFIG 替换为集群 kubeconfig 文件的路径。

  2. 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
    
  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 提供清单。该应用使用三个副本。

如需部署应用,请执行以下操作:

  1. 为您在示例应用中创建的资源创建 gmp-test 命名空间:

    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 资源

在本部分中,您将配置 PodMonitoring 自定义资源以捕获示例应用发出的指标数据,并将其发送到 Managed Service for Prometheus。PodMonitoring 自定义资源使用目标爬取。在这种情况下,收集器代理会爬取示例应用将数据发出到的 /metrics 端点。

PodMonitoring 自定义资源仅会爬取在其中进行部署的命名空间中的目标。如需爬取多个命名空间中的目标,请在每个命名空间中部署相同的 PodMonitoring 自定义资源。您可以通过运行以下命令来验证 PodMonitoring 资源是否已安装在预期的命名空间中:

kubectl --kubeconfig CLUSTER_KUBECONFIG get podmonitoring -A

如需了解所有 Managed Service for Prometheus 自定义资源的参考文档,请参阅 prometheus-engine/doc/api 参考文档

以下清单在 gmp-test 命名空间中定义了 PodMonitoring 资源 prom-example。该资源会查找命名空间中值为 prom-exampleapp 标签的所有 Pod。在 /metrics HTTP 路径上,每 30 秒在名为 metrics 的端口上抓取匹配的 Pod。

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

Managed Service for Prometheus 现在正在爬取匹配的 Pod。

查询指标数据

如需验证是否在导出 Prometheus 数据,最简单的方法是使用 Google Cloud 控制台中的 Metrics Explorer 中的 PromQL 查询。

如需运行 PromQL 查询,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入 Monitoring 页面或点击以下按钮:

    进入 Monitoring

  2. 在导航窗格中,选择 Metrics Explorer

  3. 使用 Prometheus 查询语言 (PromQL) 指定要在图表上显示的数据:

    1. 选择指标窗格的工具栏中,选择代码编辑器

    2. 语言切换菜单中选择 PromQL。语言切换开关位于代码编辑器窗格的底部。

    3. 在查询编辑器中输入查询。例如,如需绘制过去一小时内 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 部分中,将 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
    
  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'
    

为用户应用启用 Logging 和 Monitoring(旧版)

请注意,强烈建议您使用上述 enableGMPForApplicationsenableCloudLoggingForApplications 来为用户应用启用监控和日志记录功能。

以下步骤仍然有效,但不推荐执行。在执行以下步骤之前,请先阅读此已知问题

如需为应用启用 Logging 和 Monitoring,请使用集群配置文件中的 spec.clusterOperations.enableApplication 字段。

  1. 更新集群配置文件以将 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
        ...
    
  2. 使用 bmctl update 应用更改:

    bmctl update cluster -c CLUSTER_NAME --admin-kubeconfig=ADMIN_KUBECONFIG
    

    替换以下内容:

    • CLUSTER_NAME:要升级的集群的名称。
    • ADMIN_KUBECONFIG:管理员集群 kubeconfig 文件的路径。

为工作负载添加注解

如需从应用收集自定义指标,请将 prometheus.io/scrape: "true" 注解添加到应用的 Service 或 Pod 清单中,或将相同的注解添加到 Deployment 或 DaemonSet 清单中的 spec.template 部分,以便传递给其 Pod。

运行一个示例应用

在本部分中,您将创建一个应用,用于编写自定义日志并公开自定义指标。

  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 PodKubernetes Container

  3. 对于指标,请选择 external.googleapis.com/prometheus/example_monitoring_up

  4. 在图表中,您可以看到 example_monitoring_up 的重复值为 1。