使用日志记录和监控

本页面介绍如何使用 Cloud Logging 和 Cloud Monitoring 以及 Prometheus 和 Grafana 进行日志记录和监控。如需查看可用配置选项的摘要,请参阅日志记录和监控概览

使用 Cloud Logging 和 Cloud Monitoring

以下部分介绍了如何将 Logging 和 Monitoring 与 GKE On-Prem 集群搭配使用。

受监控的资源

受监控的资源是 Google 如何表示资源(如集群、节点、Pod 和容器)。如需了解详情,请参阅 Cloud Monitoring 的受监控的资源类型文档。

如需查询日志和指标,您需要了解以下资源标签:

  • project_id:与 GKE On-Prem 集群关联的项目的项目 ID

  • location:您要存储 Logging 日志和 Monitoring 指标的 Google Cloud 地区。建议选择一个靠近您的本地数据中心的地区。在安装过程中,您在 GKE On-Prem 配置文件的 stackdriver.clusterlocation 字段中提供了此值。

  • cluster_name:您在创建集群时选择的集群名称。

    您可以通过检查 Stackdriver 自定义资源来检索管理员或用户集群的 cluster_name 值:

      kubectl -n kube-system get stackdrivers stackdriver -o yaml | grep 'clusterName:'

访问日志数据

您可以使用 Google Cloud 控制台中的日志浏览器访问日志。例如,要访问容器的日志,请执行以下操作:

  1. 打开项目 Google Cloud 控制台中的日志浏览器
  2. 通过以下方式查找容器的日志:
    1. 点击左上角的日志目录下拉框,然后选择 Kubernetes 容器
    2. 选择集群名称,然后选择命名空间,然后从层次结构中选择容器。

创建信息中心以监控集群运行状况

默认情况下,GKE On-Prem 集群配置为监控系统和容器指标。创建集群(管理员或用户)后,最佳做法是使用 Monitoring 创建以下信息中心,让您的 GKE On-Prem 运营团队监控集群运行状况:

自 GKE On-Prem 1.5 起,启用 Cloud Monitoring 后,系统会在管理员集群安装期间自动创建信息中心。

本部分介绍如何创建这些信息中心。如需详细了解以下部分中介绍的信息中心创建流程,请参阅通过 API 管理信息中心

前提条件

您的 Google 账号必须拥有以下权限才能创建信息中心:

  • monitoring.dashboards.create
  • monitoring.dashboards.delete
  • monitoring.dashboards.update

如果您的账号具有以下任一角色,那么您将拥有这些权限。您可以在 Google Cloud 控制台中检查您的权限:

  • monitoring.dashboardEditor
  • monitoring.editor
  • 项目 editor
  • 项目 owner

此外,如需使用 gcloud (gcloud CLI) 创建信息中心,您的 Google 账号必须拥有 serviceusage.services.use 权限。

如果您的账号具有下列角色之一,则拥有此权限:

  • roles/serviceusage.serviceUsageConsumer
  • roles/serviceusage.serviceUsageAdmin
  • roles/owner
  • roles/editor
  • 项目 editor
  • 项目 owner

创建控制层面状态信息中心

GKE On-Prem 控制层面由 API 服务器、调度器、控制器管理器和 etcd 组成。如需监控控制层面的状态,请创建一个监控这些组件的状态的信息中心。

  1. 下载信息中心配置:control-plane-status.json

  2. 运行以下命令,使用配置文件创建自定义信息中心:

    gcloud monitoring dashboards create --config-from-file=control-plane-status.json
  3. 在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:

    转到“监控”

  4. 选择资源 > 信息中心,并查看名为 GKE On-Prem 控制层面状态的信息中心。每个用户集群的控制层面状态从管理员集群中的单独命名空间中收集。namespace_name 字段是用户集群名称。

    每个图表中都设置了服务等级目标 (SLO) 阈值 0.999。

  5. (可选)创建提醒政策

创建 pod 状态信息中心

如需创建包含每个 pod 的阶段以及每个容器的重启次数和资源使用情况的信息中心,请执行以下步骤。

  1. 下载信息中心配置:pod-status.json

  2. 运行以下命令,使用配置文件创建自定义信息中心:

    gcloud monitoring dashboards create --config-from-file=pod-status.json
  3. 在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:

    转到“监控”

  4. 选择资源 > 信息中心,并查看名为 GKE On-Prem pod 状态的信息中心。

  5. (可选)创建提醒政策

创建节点状态信息中心

如需创建 GKE On-Prem 节点状态信息中心以监控节点情况、CPU、内存和磁盘用量,请执行以下步骤:

  1. 下载信息中心配置:node-status.json

  2. 运行以下命令,使用配置文件创建自定义信息中心:

    gcloud monitoring dashboards create --config-from-file=node-status.json
  3. 在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:

    转到“监控”

  4. 选择资源 > 信息中心,并查看名为 GKE On-Prem 节点状态的信息中心。

  5. (可选)创建提醒政策

配置 Stackdriver 组件资源

创建集群时,GKE On-Prem 会自动创建 Stackdriver 自定义资源。如需替换 Stackdriver 组件的 CPU 和内存请求及限制的默认值,请执行以下操作:

  1. 运行以下命令,在命令行编辑器中打开您的 Stackdriver 自定义资源:

    kubectl --kubeconfig=KUBECONFIG -n kube-system edit stackdriver stackdriver

    其中 KUBECONFIGkubeconfig 文件的路径。

  2. 在 Stackdriver 自定义资源中的 spec 字段下添加 resourceAttrOverride 部分:

    resourceAttrOverride:
          POD_NAME_WITHOUT_RANDOM_SUFFIX/CONTAINER_NAME:
            LIMITS_OR_REQUESTS:
              RESOURCE: RESOURCE_QUANTITY

    请注意,resourceAttrOverride 部分将替换指定组件的所有现有默认限制和请求。示例文件如下所示:

    apiVersion: addons.sigs.k8s.io/v1alpha1
    kind: Stackdriver
    metadata:
      name: stackdriver
      namespace: kube-system
    spec:
      projectID: my-project
      clusterName: my-cluster
      clusterLocation: us-west-1a
      proxyConfigSecretName: secret-name
      enableVPC: stackdriver-enable-VPC
      optimizedMetrics: true
      resourceAttrOverride:
        stackdriver-prometheus-k8s/prometheus-server:
          limits:
            cpu: 500m
            memory: 3000Mi
          requests:
            cpu: 300m
            memory: 2500Mi
  3. 如需保存对 Stackdriver 自定义资源的更改,请保存并退出命令行编辑器。

  4. 检查 Pod 的运行状况:

    kubectl --kubeconfig=KUBECONFIG -n kube-system get pods | grep stackdriver

    例如,运行状况良好的 Pod 如下所示:

    stackdriver-prometheus-k8s-0                                2/2     Running   0          5d19h
  5. 检查组件的 Pod 规范,确保资源设置正确。

    kubectl --kubeconfig=KUBECONFIG -n kube-system describe pod POD_NAME

    其中,POD_NAME 是您刚刚更改的 Pod 的名称。例如 stackdriver-prometheus-k8s-0

    回答如下所示:

      Name:         stackdriver-prometheus-k8s-0
      Namespace:    kube-system
      ...
      Containers:
        prometheus-server:
          Limits:
            cpu: 500m
            memory: 3000Mi
          Requests:
            cpu: 300m
            memory: 2500Mi
          ...

访问指标数据

您可以使用 Metrics Explorer,从 1500 多个指标中进行选择。如需访问 Metrics Explorer,请执行以下操作:

  1. 在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:

    转到“监控”

  2. 选择资源 > Metrics Explorer

访问 Monitoring 元数据

通过指标间接使用元数据。当您在 Monitoring Metrics Explorer 中过滤指标时,会看到按 metadata.systemLabelsmetadata.userLabels 过滤指标的选项。系统标签是 pod 的节点名称和服务名称等标签。用户标签是在 Pod 规范“元数据”部分的 Kubernetes YAML 文件中分配给 Pod 的标签。

默认 Cloud Monitoring 配额限制

GKE On-Prem 监控功能针对每个项目的默认限制为每分钟 6000 次 API 调用。如果超出此限制,系统可能不会显示您的指标。 如果您需要更高的监控限制,请通过 Google Cloud Console 申请

已知问题:Cloud Monitoring 错误条件

(问题 ID 159761921)

在某些情况下,在每个新集群中部署的默认 Cloud Monitoring pod 可能会无响应。例如,升级集群后,重启 statefulset/prometheus-stackdriver-k8s 中的 pod 时,存储数据可能会损坏。

具体而言,当损坏的数据阻止 prometheus-stackdriver-sidecar 向集群存储空间 PersistentVolume 写入内容时,监控 pod stackdriver-prometheus-k8s-0 可能会陷入循环。

您可以按照以下步骤手动诊断并恢复错误。

诊断 Cloud Monitoring 故障

如果监控 pod 失败,日志将报告以下内容:

{"log":"level=warn ts=2020-04-08T22:15:44.557Z caller=queue_manager.go:534 component=queue_manager msg=\"Unrecoverable error sending samples to remote storage\" err=\"rpc error: code = InvalidArgument desc = One or more TimeSeries could not be written: One or more points were written more frequently than the maximum sampling period configured for the metric.: timeSeries[0-114]; Unknown metric: kubernetes.io/anthos/scheduler_pending_pods: timeSeries[196-198]\"\n","stream":"stderr","time":"2020-04-08T22:15:44.558246866Z"}

{"log":"level=info ts=2020-04-08T22:15:44.656Z caller=queue_manager.go:229 component=queue_manager msg=\"Remote storage stopped.\"\n","stream":"stderr","time":"2020-04-08T22:15:44.656798666Z"}

{"log":"level=error ts=2020-04-08T22:15:44.663Z caller=main.go:603 err=\"corruption after 29032448 bytes: unexpected non-zero byte in padded page\"\n","stream":"stderr","time":"2020-04-08T22:15:44.663707748Z"}

{"log":"level=info ts=2020-04-08T22:15:44.663Z caller=main.go:605 msg=\"See you next time!\"\n","stream":"stderr","time":"2020-04-08T22:15:44.664000941Z"}

从 Cloud Monitoring 错误恢复

如需手动恢复 Cloud Monitoring,请执行以下操作:

  1. 停止集群监控。缩减 stackdriver 运算符以防止监控协调:

    kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system scale deployment stackdriver-operator --replicas 0

  2. 删除监控流水线工作负载:

    kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system delete statefulset stackdriver-prometheus-k8s

  3. 删除监控流水线 PersistentVolumeClaims (PVC):

    kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system delete pvc -l app=stackdriver-prometheus-k8s

  4. 重启集群监控。扩展 Stackdriver 运算符以重新安装新的监控流水线并恢复协调:

    kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system scale deployment stackdriver-operator --replicas=1

Prometheus 和 Grafana

以下部分介绍了如何将 Prometheus 和 Grafana 与 GKE On-Prem 集群搭配使用。

启用 Prometheus 和 Grafana

从 GKE On-Prem 1.2 版开始,您可以选择是启用还是停用 Prometheus 和 Grafana。在新的用户集群中,Prometheus 和 Grafana 默认处于停用状态。

  1. 您的用户集群有一个名为 monitoring-sample 的 Monitoring 对象。打开要修改的对象:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] edit \
       monitoring monitoring-sample --namespace kube-system

    其中,[USER_CLUSTER_KUBECONFIG] 是用户集群的 kubeconfig 文件。

  2. 如需启用 Prometheus 和 Grafana,请将 enablePrometheus 设置为 true。如需停用 Prometheus 和 Grafana,请将 enablePrometheus 设置为 false

    apiVersion: addons.k8s.io/v1alpha1
    kind: Monitoring
    metadata:
     labels:
       k8s-app: monitoring-operator
     name: monitoring-sample
     namespace: kube-system
    spec:
     channel: stable
     ...
     enablePrometheus: true
  3. 关闭修改会话以保存更改。

已知问题

在用户集群中,升级时会自动停用 Prometheus 和 Grafana。不过,配置和指标数据不会丢失。

如需解决此问题,请在升级后打开 monitoring-sample 进行修改,并将 enablePrometheus 设置为 true

从 Grafana 信息中心访问监控指标

Grafana 会显示从您的集群收集的指标。如需查看这些指标,您需要访问 Grafana 的信息中心:

  1. 获取在用户集群的 kube-system 命名空间中运行的 Grafana pod 的名称:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system get pods

    其中,[USER_CLUSTER_KUBECONFIG] 是用户集群的 kubeconfig 文件。

  2. Grafana pod 中的容器侦听 TCP 端口 3443。您可以将本地端口转发到 pod 中的端口 3443,以便通过网络浏览器查看 Grafana 的信息中心。

    例如,假设 pod 的名称为 grafana-0。如需将端口 50000 转发到 pod 中的端口 3443,请输入以下命令:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system port-forward grafana-0 50000:3443
  3. 在网络浏览器中,转到 http://localhost:50000。加载用户集群的 Grafana 首页信息中心。

  4. 如需访问其他信息中心,请点击页面左上角的首页下拉菜单。

如需查看使用 Grafana 的示例,请参阅创建 Grafana 信息中心

访问提醒

Prometheus Alertmanager 会从 Prometheus 服务器收集提醒。您可以在 Grafana 信息中心查看这些提醒。如需查看提醒,您需要访问信息中心:

  1. alertmanager-0 pod 中的容器侦听 TCP 端口 9093。将本地端口转发到 pod 中的 9093 端口:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward \
       -n kube-system alertmanager-0 50001:9093
  2. 在网络浏览器中,转到 http://localhost:50001

更改 Prometheus Alertmanager 配置

您可以通过修改用户集群的 monitoring.yaml 文件来更改 Prometheus Alertmanager 的默认配置。如果您希望将提醒指向特定目标位置,而不是将其保留在信息中心,则应执行此操作。您可以在 Prometheus 的配置文档中了解如何配置 Alertmanager。

如需更改 Alertmanager 配置,请执行以下步骤:

  1. 制作用户集群的 monitoring.yaml 清单文件的副本:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system \
       get monitoring monitoring-sample -o yaml > monitoring.yaml
  2. 如需配置 Alertmanager,请更改 spec.alertmanager.yml 下的字段。完成后,保存已更改的清单。

  3. 将清单应用到您的集群:

    kubectl apply --kubeconfig [USER_CLUSTER_KUBECONIFG] -f monitoring.yaml

扩缩 Prometheus 资源

默认监控配置最多支持五个节点。对于较大的集群,您可以调整 Prometheus Server 资源。建议每个集群节点使用 50 个毫核的 CPU 和 500Mi 内存。请确保您的集群包含两个节点,每个节点都有足够的资源来容纳 Prometheus。如需了解详情,请参阅调整用户集群的大小

如需更改 Prometheus Server 资源,请执行以下步骤:

  1. 制作用户集群的 monitoring.yaml 清单文件的副本:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system get monitoring monitoring-sample -o yaml > monitoring.yaml
  2. 如需替换资源,请更改 spec.resourceOverride 下的字段。完成后,保存已更改的清单。示例:

    spec:
      resourceOverride:
      - component: Prometheus
        resources:
          requests:
            cpu: 300m
            memory: 3000Mi
          limits:
            cpu: 300m
            memory: 3000Mi
    
  3. 将清单应用到您的集群:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f monitoring.yaml

创建 Grafana 信息中心

您已经部署了一个公开指标的应用,验证该指标是否已公开,并验证 Prometheus 是否会抓取该指标。现在,您可以将应用级指标添加到自定义 Grafana 信息中心。

如需创建 Grafana 信息中心,请执行以下步骤:

  1. 如有必要,请访问 Grafana
  2. 在首页信息中心内,点击页面左上角的首页下拉菜单。
  3. 在右侧菜单中,点击新信息中心
  4. 新面板部分中,点击图表。系统会显示一个空的图表信息中心。
  5. 点击面板标题,然后点击修改。底部的图表面板将打开并显示指标标签页。
  6. 数据源下拉菜单中选择用户。点击添加查询,然后在搜索字段中输入 foo
  7. 点击屏幕右上角的返回信息中心按钮。此时会显示您的信息中心。
  8. 如需保存信息中心,请点击屏幕右上角的保存信息中心。为信息中心选择一个名称,然后点击保存

停用集群内监控

如需停用集群内监控,请还原对 monitoring-sample 对象所做的更改:

  1. 打开要修改的 monitoring-sample 对象:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit \
       monitoring monitoring-sample --namespace kube-system

    USER_CLUSTER_KUBECONFIG 替换为您的用户集群的 kubeconfig 文件。

  2. 如需停用 Prometheus 和 Grafana,请将 enablePrometheus 设置为 false

       apiVersion: addons.k8s.io/v1alpha1
       kind: Monitoring
       metadata:
         labels:
           k8s-app: monitoring-operator
         name: monitoring-sample
         namespace: kube-system
       spec:
         channel: stable
         ...
         enablePrometheus: false
    
  3. 关闭修改会话以保存更改。

  4. 确认 prometheus-0prometheus-1grafana-0 statefulset 已删除:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods --namespace kube-system

示例:将应用级指标添加到 Grafana 信息中心

以下部分将引导您逐步添加应用的指标。在此部分中,您需要完成以下任务:

  • 部署一个示例应用以公开名为 foo 的指标。
  • 验证 Prometheus 是否会公开并抓取该指标。
  • 创建一个自定义 Grafana 信息中心。

部署示例应用

示例应用在单个 pod 中运行。pod 的容器公开了 foo 指标,其常量值为 40

创建以下 pod 清单 pro-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: prometheus-example
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/port: '8080'
    prometheus.io/path: '/metrics'
spec:
  containers:
  - image: registry.k8s.io/prometheus-dummy-exporter:v0.1.0
    name: prometheus-example
    command:
    - /bin/sh
    - -c
    - ./prometheus_dummy_exporter --metric-name=foo --metric-value=40 --port=8080

然后将 pod 清单应用到您的用户集群:

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f pro-pod.yaml

验证指标是否已公开并已抓取

  1. prometheus-example pod 中的容器侦听 TCP 端口 8080。将本地端口转发到 pod 中的端口 8080:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward prometheus-example 50002:8080
  2. 如需验证应用是否公开指标,请运行以下命令:

    curl localhost:50002/metrics | grep foo
    

    该命令返回以下输出:

    # HELP foo Custom metric
    # TYPE foo gauge
    foo 40
  3. prometheus-0 pod 中的容器侦听 TCP 端口 9090。将本地端口转发到 pod 中的端口 9090:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward prometheus-0 50003:9090
  4. 如需验证 Prometheus 是否正在抓取指标,请转到 http://localhost:50003/targets,此网址应该会将您转到 prometheus-io-pods 目标组下的 prometheus-0 pod。

  5. 如需查看 Prometheus 格式的指标,请转到 http://localhost:50003/graph。在搜索字段中输入 foo,然后点击执行。该页面应该会显示相应指标。