本页面介绍如何使用 Cloud Logging 和 Cloud Monitoring 以及 Prometheus 和 Grafana 对 VMware 上的 Anthos 集群 (GKE On-Prem) 实现进行日志记录和监控。如需查看可用配置选项的摘要,请参阅日志记录和监控概览。
使用 Cloud Logging 和 Cloud Monitoring
以下部分介绍如何将 Cloud Logging 和 Cloud Monitoring 与 Anthos Clusters on VMware (GKE On-Prem) 集群搭配使用。
受监控的资源
受监控的资源是 Google 如何表示资源(如集群、节点、Pod 和容器)。如需了解详情,请参阅 Cloud Monitoring 的受监控的资源类型文档。
如需查询日志和指标,您需要了解以下资源标签:
project_id
:集群的日志记录和监控项目 ID 的项目 ID。您在集群配置文件的stackdriver.projectID
字段中提供了此值。location
:您要存储 Cloud Logging 日志和 Cloud Monitoring 指标的 Google Cloud 区域。建议选择一个靠近您的本地数据中心的地区。在安装过程中,您在集群配置文件的stackdriver.clusterLocation
字段中提供了此值。cluster_name
:您在创建集群时选择的集群名称。您可以通过检查 Stackdriver 自定义资源来检索管理员或用户集群的
cluster_name
值:kubectl get stackdriver stackdriver --namespace kube-system \ --kubeconfig CLUSTER_KUBECONFIG --output yaml | grep 'clusterName:'
其中
CLUSTER_KUBECONFIG
是需要集群名称的管理员集群或用户集群的 kubeconfig 文件的路径。
访问日志数据
您可以使用 Google Cloud 控制台中的日志浏览器访问日志。例如,要访问容器的日志,请执行以下操作:
- 打开项目 Google Cloud 控制台中的日志浏览器。
- 通过以下方式查找容器的日志:
- 点击左上角的日志目录下拉框,然后选择 Kubernetes 容器。
- 选择集群名称,然后选择命名空间,然后从层次结构中选择容器。
创建信息中心以监控集群运行状况
默认情况下,Anthos Clusters on VMware 集群配置为监控系统和容器指标。创建集群(管理员或用户)后,最佳做法是使用 Cloud Monitoring 创建以下信息中心,让您的 Anthos Clusters on VMware 运营团队监控集群运行状况:
如果启用了 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
创建控制层面正常运行时间信息中心
Anthos Clusters on VMware 控制层面由 API 服务器、调度器、控制器管理器和 etcd 组成。如需监控控制层面的状态,请创建一个监控这些组件的状态的信息中心。
下载信息中心配置:
control-plane-uptime.json
。运行以下命令,使用配置文件创建自定义信息中心:
gcloud monitoring dashboards create --config-from-file=control-plane-uptime.json
在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:
选择资源 > 信息中心,并查看名为 GKE On-Prem 控制层面正常运行时间的信息中心。每个用户集群的控制层面正常运行时间从管理员集群中的单独命名空间中收集。namespace_name 字段是用户集群名称。
(可选)创建提醒政策。
创建 pod 状态信息中心
如需创建包含每个 pod 的阶段以及每个容器的重启次数和资源使用情况的信息中心,请执行以下步骤。
下载信息中心配置:
pod-status.json
。运行以下命令,使用配置文件创建自定义信息中心:
gcloud monitoring dashboards create --config-from-file=pod-status.json
在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:
选择资源 > 信息中心,并查看名为 GKE On-Prem pod 状态的信息中心。
(可选)创建提醒政策。
创建节点状态信息中心
如需创建节点状态信息中心以监控节点情况、CPU、内存和磁盘用量,请执行以下步骤:
下载信息中心配置:
node-status.json
。运行以下命令,使用配置文件创建自定义信息中心:
gcloud monitoring dashboards create --config-from-file=node-status.json
在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:
选择资源 > 信息中心,并查看名为 GKE On-Prem 节点状态的信息中心。
(可选)创建提醒政策。
创建虚拟机运行状况信息中心
虚拟机运行状况信息中心会监控管理员集群和用户集群中虚拟机的 CPU、内存和磁盘资源争用信号。
如需创建虚拟机运行状况信息中心,请执行以下操作:
确保将
stackdriver.disableVsphereResourceMetrics
设置为 false。请参阅用户集群配置文件。下载信息中心配置:
vm-health-status.json
。运行以下命令,使用配置文件创建自定义信息中心:
gcloud monitoring dashboards create --config-from-file=vm-health-status.json
在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:
选择资源 > 信息中心并查看名为 GKE On-Prem 虚拟机运行状况的信息中心。
(可选)创建提醒政策。
创建节点利用率信息中心
节点利用率信息中心显示集群中的以下利用率:
- 节点 CPU 分配比率
- 可用于安排 Kubernetes 工作负载的 vCPU
- 节点内存分配比率
- 可用于安排 k8s 工作负载的内存
- 节点磁盘利用率
如需创建节点利用率信息中心,请执行以下操作:
下载信息中心配置:
node-utilization.json
。使用此配置文件通过运行以下命令创建自定义信息中心:
gcloud monitoring dashboards create --config-from-file=node-utilization.json
在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:
选择资源 > 信息中心,并查看名为 GKE On-Prem 节点利用率的信息中心。
(可选)创建提醒政策。
配置 Stackdriver 组件资源
创建集群时,Anthos Clusters on VMware 会自动创建 Stackdriver 自定义资源。您可以在自定义资源中修改规范,以替换 Stackdriver 组件中 CPU 和内存请求的默认值和限制,也可以单独替换默认存储空间大小和存储类别。
替换请求的默认值以及 CPU 和内存的限制
如需替换这些默认设置,请执行以下操作:
在命令行编辑器中打开 Stackdriver 自定义资源:
kubectl --kubeconfig=KUBECONFIG -n kube-system edit stackdriver stackdriver
其中,KUBECONFIG 是集群的 kubeconfig 文件的路径。该集群可以是管理员集群或用户集群。
在 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 resourceAttrOverride: stackdriver-prometheus-k8s/prometheus-server: limits: cpu: 500m memory: 3000Mi requests: cpu: 300m memory: 2500Mi
保存更改并退出命令行编辑器。
检查 Pod 的运行状况:
kubectl --kubeconfig=KUBECONFIG -n kube-system get pods | grep stackdriver
例如,运行状况良好的 Pod 如下所示:
stackdriver-prometheus-k8s-0 2/2 Running 0 5d19h
检查组件的 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 ...
替换存储空间大小默认值
如需替换这些默认设置,请执行以下操作:
在命令行编辑器中打开 Stackdriver 自定义资源:
kubectl --kubeconfig=KUBECONFIG -n kube-system edit stackdriver stackdriver
在
spec
部分下添加storageSizeOverride
字段。您可以使用组件stackdriver-prometheus-k8s
或stackdriver-prometheus-app
。此部分将采用如下格式:storageSizeOverride: STATEFULSET_NAME: SIZE
此示例使用有状态集
stackdriver-prometheus-k8s
和大小120Gi
。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 storageSizeOverride: stackdriver-prometheus-k8s: 120Gi
保存并退出命令行编辑器。
检查 Pod 的运行状况:
kubectl --kubeconfig=KUBECONFIG -n kube-system get pods | grep stackdriver
例如,运行状况良好的 Pod 如下所示:stackdriver-prometheus-k8s-0 2/2 Running 0 5d19h
检查组件的 Pod 规范,确保已正确替换存储空间大小。
kubectl --kubeconfig=KUBECONFIG -n kube-system describe statefulset STATEFULSET_NAME
回答如下所示:
Volume Claims: Name: my-statefulset-persistent-volume-claim StorageClass: my-storage-class Labels: Annotations: Capacity: 120Gi Access Modes: [ReadWriteOnce]
替换存储类别默认值
前提条件
您必须先创建要使用的存储类别。
如需替换 Logging 和 Monitoring 组件声明的永久性卷的默认存储类别,请执行以下操作:
在命令行编辑器中打开 Stackdriver 自定义资源:
kubectl --kubeconfig=KUBECONFIG -n kube-system edit stackdriver stackdriver
其中,KUBECONFIG 是集群的 kubeconfig 文件的路径。该集群可以是管理员集群或用户集群。
在
spec
部分下添加storageClassName
字段:storageClassName: STORAGECLASS_NAME
请注意,
storageClassName
字段会替换现有默认存储类别,并应用于声明了永久性卷的所有 Logging 和 Monitoring 组件。示例文件如下所示: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: my-secret-name enableVPC:
optimizedMetrics: true storageClassName: my-storage-class 保存更改。
检查 Pod 的运行状况:
kubectl --kubeconfig=KUBECONFIG -n kube-system get pods | grep stackdriver
例如,运行状况良好的 Pod 如下所示:
stackdriver-prometheus-k8s-0 1/1 Running 0 5d19h
检查组件的 Pod 规范,确保正确设置了存储类别。
kubectl --kubeconfig=KUBECONFIG -n kube-system describe statefulset STATEFULSET_NAME
例如,使用有状态集
stackdriver-prometheus-k8s
时,响应将如下所示:Volume Claims: Name: stackdriver-prometheus-data StorageClass: my-storage-class Labels: Annotations: Capacity: 120Gi Access Modes: [ReadWriteOnce]
访问指标数据
您可以使用 Metrics Explorer,从 1500 多个指标中进行选择。如需访问 Metrics Explorer,请执行以下操作:
在 Google Cloud Console 中,选择 Monitoring 或使用如下按钮:
选择资源 > Metrics Explorer。
访问 Monitoring 元数据
通过指标间接使用元数据。当您在 Monitoring Metrics Explorer 中过滤指标时,会看到按 metadata.systemLabels
和 metadata.userLabels
过滤指标的选项。系统标签是 pod 的节点名称和服务名称等标签。用户标签是在 Pod 规范“元数据”部分的 Kubernetes YAML 文件中分配给 Pod 的标签。
默认 Cloud Monitoring 配额限制
Anthos Clusters on VMware 监控功能针对每个项目的默认限制为每分钟 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,请执行以下操作:
停止集群监控。缩减
stackdriver
运算符以防止监控协调:kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system scale deployment stackdriver-operator --replicas 0
删除监控流水线工作负载:
kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system delete statefulset stackdriver-prometheus-k8s
删除监控流水线 PersistentVolumeClaims (PVC):
kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system delete pvc -l app=stackdriver-prometheus-k8s
重启集群监控。扩展 Stackdriver 运算符以重新安装新的监控流水线并恢复协调:
kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system scale deployment stackdriver-operator --replicas=1
Prometheus 和 Grafana
以下部分介绍如何将 Prometheus 和 Grafana 与 Anthos Clusters on VMware 集群搭配使用。
启用 Prometheus 和 Grafana
从 Anthos Clusters on VMware 1.2 版开始,您可以选择启用或停用 Prometheus 和 Grafana。在新的用户集群中,Prometheus 和 Grafana 默认处于停用状态。
您的用户集群有一个名为
monitoring-sample
的 Monitoring 对象。打开要修改的对象:kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] edit \ monitoring monitoring-sample --namespace kube-system
其中,[USER_CLUSTER_KUBECONFIG] 是用户集群的 kubeconfig 文件。
如需启用 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
关闭修改会话以保存更改。
已知问题
在用户集群中,升级时会自动停用 Prometheus 和 Grafana。不过,配置和指标数据不会丢失。
如需解决此问题,请在升级后打开 monitoring-sample
进行修改,并将 enablePrometheus
设置为 true
。
从 Grafana 信息中心访问监控指标
Grafana 会显示从您的集群收集的指标。如需查看这些指标,您需要访问 Grafana 的信息中心:
获取在用户集群的
kube-system
命名空间中运行的 Grafana pod 的名称:kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system get pods
其中,[USER_CLUSTER_KUBECONFIG] 是用户集群的 kubeconfig 文件。
Grafana pod 有一个侦听 TCP localhost 端口 3000 的 HTTP 服务器。您可以将本地端口转发到 pod 中的端口 3000,以便通过网络浏览器查看 Grafana 的信息中心。
例如,假设 pod 的名称为
grafana-0
。如需将端口 50000 转发到 pod 中的端口 3000,请输入以下命令:kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system port-forward grafana-0 50000:3000
在网络浏览器中,转到
http://localhost:50000
。在登录页面,输入
admin
作为用户名和密码。如果登录成功,系统会提示您更改密码。更改默认密码后,系统会加载用户集群的 Grafana 首页信息中心。
如需访问其他信息中心,请点击页面左上角的首页下拉菜单。
如需查看使用 Grafana 的示例,请参阅创建 Grafana 信息中心。
访问提醒
Prometheus Alertmanager 会从 Prometheus 服务器收集提醒。您可以在 Grafana 信息中心查看这些提醒。如需查看提醒,您需要访问信息中心:
alertmanager-0
pod 中的容器侦听 TCP 端口 9093。将本地端口转发到 pod 中的 9093 端口:kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward \ -n kube-system alertmanager-0 50001:9093
在网络浏览器中,转到
http://localhost:50001
。
更改 Prometheus Alertmanager 配置
您可以通过修改用户集群的 monitoring.yaml
文件来更改 Prometheus Alertmanager 的默认配置。如果您希望将提醒指向特定目标位置,而不是将其保留在信息中心,则应执行此操作。您可以在 Prometheus 的配置文档中了解如何配置 Alertmanager。
如需更改 Alertmanager 配置,请执行以下步骤:
制作用户集群的
monitoring.yaml
清单文件的副本:kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system \ get monitoring monitoring-sample -o yaml > monitoring.yaml
如需配置 Alertmanager,请更改
spec.alertmanager.yml
下的字段。完成后,保存已更改的清单。将清单应用到您的集群:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONIFG] -f monitoring.yaml
扩缩 Prometheus 资源
默认监控配置最多支持五个节点。对于较大的集群,您可以调整 Prometheus Server 资源。建议每个集群节点使用 50 个毫核的 CPU 和 500Mi 内存。请确保您的集群包含两个节点,每个节点都有足够的资源来容纳 Prometheus。如需了解详情,请参阅调整用户集群的大小。
如需更改 Prometheus Server 资源,请执行以下步骤:
制作用户集群的
monitoring.yaml
清单文件的副本:kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system get monitoring monitoring-sample -o yaml > monitoring.yaml
如需替换资源,请更改
spec.resourceOverride
下的字段。完成后,保存已更改的清单。示例:spec: resourceOverride: - component: Prometheus resources: requests: cpu: 300m memory: 3000Mi limits: cpu: 300m memory: 3000Mi
将清单应用到您的集群:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f monitoring.yaml
创建 Grafana 信息中心
您已经部署了一个公开指标的应用,验证该指标是否已公开,并验证 Prometheus 是否会抓取该指标。现在,您可以将应用级指标添加到自定义 Grafana 信息中心。
如需创建 Grafana 信息中心,请执行以下步骤:
- 如有必要,请访问 Grafana。
- 在首页信息中心内,点击页面左上角的首页下拉菜单。
- 在右侧菜单中,点击新信息中心。
- 在新面板部分中,点击图表。系统会显示一个空的图表信息中心。
- 点击面板标题,然后点击修改。底部的图表面板将打开并显示指标标签页。
- 从数据源下拉菜单中选择用户。点击添加查询,然后在搜索字段中输入
foo
。 - 点击屏幕右上角的返回信息中心按钮。此时会显示您的信息中心。
- 如需保存信息中心,请点击屏幕右上角的保存信息中心。为信息中心选择一个名称,然后点击保存。
停用集群内监控
如需停用集群内监控,请还原对 monitoring-sample
对象所做的更改:
打开要修改的
monitoring-sample
对象:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit \ monitoring monitoring-sample --namespace kube-system
将 USER_CLUSTER_KUBECONFIG 替换为您的用户集群的 kubeconfig 文件。
如需停用 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
关闭修改会话以保存更改。
确认
prometheus-0
、prometheus-1
和grafana-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
验证指标是否已公开并已抓取
prometheus-example
pod 中的容器侦听 TCP 端口 8080。将本地端口转发到 pod 中的端口 8080:kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward prometheus-example 50002:8080
如需验证应用是否公开指标,请运行以下命令:
curl localhost:50002/metrics | grep foo
该命令返回以下输出:
# HELP foo Custom metric # TYPE foo gauge foo 40
prometheus-0
pod 中的容器侦听 TCP 端口 9090。将本地端口转发到 pod 中的端口 9090:kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward prometheus-0 50003:9090
如需验证 Prometheus 是否正在抓取指标,请转到 http://localhost:50003/targets,此网址应该会将您转到
prometheus-io-pods
目标组下的prometheus-0
pod。如需查看 Prometheus 格式的指标,请转到 http://localhost:50003/graph。在搜索字段中输入
foo
,然后点击执行。该页面应该会显示相应指标。