监控 Anthos Config Management

Anthos Config Management 使用 Prometheus 收集和显示与其流程相关的指标。

您还可以配置 Cloud Monitoring 以从 Prometheus 中拉取自定义指标。然后,您可以在 Prometheus 和 Monitoring 中查看自定义指标。如需了解详情,请参阅使用 Prometheus

抓取指标

所有 Prometheus 指标均可在端口 8675 抓取。在抓取指标之前,您需要采用下列两种方式中的任意一种为 Prometheus 配置集群。采用以下任一方式:

  • 按照 Prometheus 文档的说明配置集群以抓取指标,

  • 使用 CoreOS 提供的 Prometheus Operator 以及以下清单,这些清单将每 10 秒抓取所有 Anthos Config Management 指标一次。

    1. 创建一个临时目录来保存清单文件。

      mkdir acm-monitor
      cd acm-monitor
      
    2. 使用 curl 命令从 CoreOS 代码库下载 Prometheus Operator 清单:

      curl -o bundle.yaml https://raw.githubusercontent.com/coreos/prometheus-operator/master/bundle.yaml
      

      此清单配置为使用 default 命名空间,但不建议使用该命名空间。下一步会将配置修改为使用名为 monitoring 的命名空间。如需使用其他命名空间,请通过其余步骤在显示 monitoring 的位置替换命名空间。

    3. 创建一个文件来更新上述软件包中 ClusterRoleBinding 的命名空间。

      # patch-crb.yaml
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: prometheus-operator
      subjects:
      - kind: ServiceAccount
        name: prometheus-operator
        namespace: monitoring # we are patching from default namespace
      
    4. 创建一个 kustomization.yaml 文件,该文件将应用补丁程序并为清单中的其他资源修改命名空间。

      # kustomization.yaml
      resources:
      - bundle.yaml
      
      namespace: monitoring
      
      patchesStrategicMerge:
      - patch-crb.yaml
      
    5. 创建 monitoring 命名空间。您可以对该命名空间使用其他名称,但这样的话,还要通过前面的步骤更改 YAML 清单中 namespace 的值。

      kubectl create namespace monitoring
      
    6. 使用以下命令应用 kustomized 清单:

      kubectl apply -k .
      
      until kubectl get customresourcedefinitions servicemonitors.monitoring.coreos.com ; \
      do date; sleep 1; echo ""; done

      第二个命令会进行阻止,直到集群上有可用的 CRD。

    7. 为配置 Prometheus 服务器所需的资源创建清单,该服务器将从 Anthos Config Management 中抓取指标。

      # acm.yaml
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: prometheus-acm
        namespace: monitoring
      ---
      apiVersion: rbac.authorization.k8s.io/v1beta1
      kind: ClusterRole
      metadata:
        name: prometheus-acm
      rules:
      - apiGroups: [""]
        resources:
        - nodes
        - services
        - endpoints
        - pods
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources:
        - configmaps
        verbs: ["get"]
      - nonResourceURLs: ["/metrics"]
        verbs: ["get"]
      ---
      apiVersion: rbac.authorization.k8s.io/v1beta1
      kind: ClusterRoleBinding
      metadata:
        name: prometheus-acm
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: prometheus-acm
      subjects:
      - kind: ServiceAccount
        name: prometheus-acm
        namespace: monitoring
      ---
      apiVersion: monitoring.coreos.com/v1
      kind: Prometheus
      metadata:
        name: acm
        namespace: monitoring
        labels:
          prometheus: acm
      spec:
        replicas: 2
        serviceAccountName: prometheus-acm
        serviceMonitorSelector:
          matchLabels:
            prometheus: config-management
        podMonitorSelector:
          matchLabels:
            prometheus: config-management
        alerting:
          alertmanagers:
          - namespace: default
            name: alertmanager
            port: web
        resources:
          requests:
            memory: 400Mi
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: prometheus-acm
        namespace: monitoring
        labels:
          prometheus: acm
      spec:
        type: NodePort
        ports:
        - name: web
          nodePort: 31900
          port: 9190
          protocol: TCP
          targetPort: web
        selector:
          app: prometheus
          prometheus: acm
      ---
      apiVersion: monitoring.coreos.com/v1
      kind: ServiceMonitor
      metadata:
        name: acm-service
        namespace: monitoring
        labels:
          prometheus: config-management
      spec:
        selector:
          matchLabels:
            monitored: "true"
        namespaceSelector:
          matchNames:
          - config-management-system
        endpoints:
        - port: metrics
          interval: 10s
      ---
      apiVersion: monitoring.coreos.com/v1
      kind: ServiceMonitor
      metadata:
        name: cnrm
        namespace: monitoring
        labels:
          prometheus: config-management
      spec:
        endpoints:
        - interval: 10s
          port: metrics
        namespaceSelector:
          matchNames:
          - cnrm-system
        selector:
          matchLabels:
            cnrm.cloud.google.com/monitored: "true"
            cnrm.cloud.google.com/system: "true"
      ---
      apiVersion: monitoring.coreos.com/v1
      kind: PodMonitor
      metadata:
        name: acm-pod
        namespace: monitoring
        labels:
          prometheus: config-management
      spec:
        selector:
          matchLabels:
            monitored: "true"
        namespaceSelector:
          matchNames:
          - gatekeeper-system
        podMetricsEndpoints:
        - port: metrics
          interval: 10s
      
    8. 使用以下命令应用清单:

      kubectl apply -f acm.yaml
      
      until kubectl rollout status statefulset/prometheus-acm -n monitoring; \
      do sleep 1; done
      

      第二个命令会进行阻止,直到 Pod 开始运行。

    9. 您可以通过将 Prometheus 服务器的 Web 端口转发到本地机器来验证安装。

      kubectl -n monitoring port-forward svc/prometheus-acm 9190
      

      现在,您可以通过 http://localhost:9190 访问 Prometheus 网页界面。

    10. 移除临时目录。

      cd ..
      rm -rf acm-monitor
      

可用指标

Anthos Config Management 会收集以下指标并将其提供给 Prometheus。标签列列出了适用于每个指标的所有标签。没有标签的指标代表一段时间内的一次测量结果,而带有标签的指标代表多次测量结果,每组标签值对应一次测量结果。

如果此表变得不同步,您可以在 Prometheus 界面中按前缀过滤指标,所有指标都以 gkeconfig_ 前缀开头。

名称 类型 标签 说明
gkeconfig_importer_cycle_duration_seconds_bucket 直方图 status 导入程序尝试将配置导入集群的周期数(按每个周期的持续时间分配到存储分区中)
gkeconfig_importer_cycle_duration_seconds_count 直方图 status 导入程序尝试将配置导入集群的周期数(忽略持续时间)
gkeconfig_importer_cycle_duration_seconds_sum 直方图 status 导入程序尝试将配置导入集群的所有周期的持续时间之和
gkeconfig_importer_namespace_configs 仪表盘 当前状态下的命名空间配置数
gkeconfig_monitor_errors 仪表盘 component 配置代码库中按发生错误的组件分组的错误数
gkeconfig_monitor_configs 仪表盘 state 按配置(集群和命名空间)的同步状态分组的配置数量
gkeconfig_monitor_last_import_timestamp 仪表盘 最近执行的导入操作的时间戳
gkeconfig_monitor_last_sync_timestamp 仪表盘 最近执行的同步操作的时间戳
gkeconfig_monitor_sync_latency_seconds_bucket 直方图 执行的导入到同步测量的数量(通过两者之间的延迟时间分配到存储分区中)
gkeconfig_monitor_sync_latency_seconds_count 直方图 执行的导入到同步测量的数量(忽略两者之间的延迟时间)
gkeconfig_monitor_sync_latency_seconds_sum 直方图 执行的所有导入到同步测量的延迟时间总和
gkeconfig_syncer_api_duration_seconds_bucket 直方图 operation、type、status 同步程序对 API 服务器的调用次数(按每次调用的持续时间分配到存储分区中)
gkeconfig_syncer_api_duration_seconds_count 直方图 operation、type、status 导入程序对 API 服务器的调用次数(忽略持续时间)
gkeconfig_syncer_api_duration_seconds_sum 直方图 operation、type、status 同步程序对 API 服务器进行的所有调用的持续时间之和
gkeconfig_syncer_controller_restarts_total 计数器 source 命名空间和集群配置控制器的重新启动总数
gkeconfig_syncer_operations_total 计数器 operation、type、status 将资源同步到配置所执行的操作总数
gkeconfig_syncer_reconcile_duration_seconds_bucket 直方图 type、status 同步程序处理的协调事件数(按持续时间分配到存储分区中)
gkeconfig_syncer_reconcile_duration_seconds_count 直方图 type、status 同步程序处理的协调事件数(忽略持续时间)
gkeconfig_syncer_reconcile_duration_seconds_sum 直方图 type、status 同步程序处理的所有协调事件的持续时间之和
gkeconfig_syncer_reconcile_event_timestamps 仪表盘 type 同步程序协调事件发生时的时间戳
如果您使用的是 Config Connector,则可以在使用 Prometheus 监控 Config Connector 中找到指标列表。

如果在集群上启用了政策控制器,则以下附加指标将可用(所有前缀为 gatekeeper_):

名称 类型 标签 说明
gatekeeper_audit_duration_seconds 直方图 审核周期持续时间分布
gatekeeper_audit_last_run_time 仪表盘 自上次审核运行时以来的 Epoch 时间戳,以秒为单位,以浮点数表示
gatekeeper_constraint_template_ingestion_count 计数器 status 限制条件模板提取操作的总数
gatekeeper_constraint_template_ingestion_duration_seconds 直方图 status 限制条件模板提取持续时间分布
gatekeeper_constraint_templates 仪表盘 status 当前限制条件模板数量
gatekeeper_constraints 仪表盘 enforcement_action, status 当前限制条件数量
gatekeeper_request_count 计数器 admission_status 来自 API 服务器的准入请求计数
gatekeeper_request_duration_seconds 直方图 admission_status 准入请求持续时间分布
gatekeeper_violations 仪表盘 enforcement_action 在上一个审核周期中检测到的审核违规次数
gatekeeper_watch_manager_intended_watch_gvk 仪表盘 打算监控多少个唯一的 GroupVersionKinds 政策控制器。这是同步资源和限制条件的结合。目前尚未实现。
gatekeeper_watch_manager_watched_gvk 仪表盘 实际上正在监控多少个唯一的 GroupVersionKinds 政策控制器。这意味着收敛于 gatekeeper_watch_manager_intended_watch_gvk。目前尚未实现。
gatekeeper_sync 仪表盘 kind, status 已复制到 OPA 缓存中的资源数量
gatekeeper_sync_duration_seconds 直方图 对象同步持续时间分布
gatekeeper_sync_last_run_time 仪表盘 上次资源同步的时间

排查过程示例

下面的示例展示了一些模式,它们使用 Prometheus 指标、对象状态字段和对象注释来检测和诊断与 Anthos Config Management 相关的问题。这些示例显示了如何先从检测问题的基本监控开始,然后逐步优化搜索,从而深入分析并诊断问题的根本原因。

按状态查询配置

monitor 进程提供了概要指标,有助于您全面了解 Anthos Config Management 在集群上的运行情况。您可以查看是否发生了任何错误,甚至还可以设置错误提醒

gkeconfig_monitor_errors

使用 nomos status 显示错误

除了使用 Prometheus 指标来监控集群上的 Anthos Config Management 状态外,您还可以使用 nomos status 命令在命令行上显示所有集群的错误。

按状态查询导入和同步操作

Anthos Config Management 使用两个步骤将代码库中的配置应用到集群。gkeconfig_monitor_errors 指标按组件进行标记,因此您可以查看发生错误的位置。

gkeconfig_monitor_errors{component="importer"}
gkeconfig_monitor_errors{component="syncer"}

您还可以查看导入程序和同步程序进程自身的指标。

gkeconfig_importer_cycle_duration_seconds_count{status="error"}
gkeconfig_syncer_reconcile_duration_seconds_count{status="error"}

检查配置对象状态

Anthos Config Management 定义两个自定义 Kubernetes 对象:ClusterConfig 和 NamespaceConfig。这些对象定义一个状态字段,可在其中了解上次应用于配置的更改以及发生的任何错误。例如,如果名为 shipping-dev 的命名空间出现错误,您可查看相应的 NamespaceConfig 的状态。

kubectl get namespaceconfig shipping-dev -o yaml

检查对象的 token 注释

您可能希望了解 Anthos Config Management 上次更新代管 Kubernetes 对象的时间。每个代管对象都将进行注释,以显示在上次修改时 Git 提交的哈希值以及包含修改内容的配置的路径。

kubectl get clusterrolebinding namespace-readers
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    configmanagement.gke.io/source-path: cluster/namespace-reader-clusterrolebinding.yaml
    configmanagement.gke.io/token: bbb6a1e2f3db692b17201da028daff0d38797771
  name: namespace-readers
...

如需了解详情,请参阅标签和注释

后续步骤