本主题介绍如何部署用于 Prometheus 的 TKG 扩展 v1.3.1。Prometheus 是一种系统和服务监控系统。其按照指定时间间隔从已配置目标收集指标,评估规则表达式,显示结果,并可在观察到符合某种条件时触发警示。Alertmanager 处理 Prometheus 生成的警示,并将其路由到其接收端点。部署用于 Prometheus 的 TKG 扩展,以便收集和查看 Tanzu Kubernetes 集群的衡量指标。

扩展必备条件

使用 Alertmanager 部署 Prometheus 的 TKG 扩展 v1.3.1 以进行集群监控之前,请遵循以下要求。 除了常规要求之外,Prometheus 监控还需要默认的持久存储类。可以创建一个具有默认持久存储类的集群,也可以在部署扩展时在 Prometheus 配置文件中指定一个这样的集群。请参见 查看 TKG 扩展的持久存储要求

部署 Prometheus 扩展

用于 Prometheus 的 TKG 扩展将安装多个容器。有关详细信息,请参见 https://prometheus.io/
容器 资源类型 副本 描述
prometheus-alertmanager 部署 1 处理 Prometheus 服务器等客户端应用程序发送的警示。
prometheus-cadvisor DaemonSet 5 分析并公开来自正在运行的容器的资源使用情况和性能数据
prometheus-kube-state-metrics 部署 1 监控节点状态和容量、副本集合规性、pod、作业和 cronjob 状态、资源请求和限制。
prometheus-node-exporter DaemonSet 5 由内核公开的硬件和操作系统衡量指标的导出程序。
prometheus-pushgateway 部署 1 允许您从无法抓取的作业推送衡量指标的服务。
prometheus-server 部署 1 提供核心功能,包括提取、规则处理和警示。
该扩展配置为从位于 https://projects.registry.vmware.com/ 的 VMware 公共注册表中提取容器。如果使用的是专用注册表,请更改数据值和扩展配置中的端点 URL 以匹配。请参见 配置 Prometheus 扩展
  1. 验证您是否已完成每个扩展必备条件。请参见扩展必备条件
  2. 将目录更改为 Prometheus 扩展。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/monitoring/prometheus
  3. 创建 tanzu-system-monitoring 命名空间以及 Prometheus 服务帐户和角色对象。
    kubectl apply -f namespace-role.yaml
  4. 创建一个 Prometheus 数据值文件。

    示例数据值文件提供了最低配置。

    cp prometheus-data-values.yaml.example prometheus-data-values.yaml
  5. 通过更新 prometheus-data-values.yaml 配置 Prometheus 扩展。有关字段和选项的描述,请参见配置 Prometheus 扩展
    如果未使用默认持久存储类置备集群,请在数据值文件中指定存储类。此外,请确保命名空间具有足够的存储用于持久卷声明。
    monitoring:
      prometheus_server:
        image:
          repository: projects.registry.vmware.com/tkg/prometheus
        pvc:
          storage_class: vwt-storage-policy
          storage: "8Gi"
      alertmanager:
        image:
          repository: projects.registry.vmware.com/tkg/prometheus
        pvc:
          storage_class: vwt-storage-policy
          storage: "8Gi"
    ...      
    
  6. 使用 prometheus-data-values 文件创建 Prometheus 密钥。
    kubectl create secret generic prometheus-data-values --from-file=values.yaml=prometheus-data-values.yaml -n tanzu-system-monitoring
    

    tanzu-system-monitoring 命名空间中创建了 prometheus-data-values 密钥。使用 kubectl get secrets -n tanzu-system-monitoring 进行验证。

  7. 部署 Prometheus 扩展。
    kubectl apply -f prometheus-extension.yaml

    成功后,将创建 Prometheus 应用:app.kappctrl.k14s.io/prometheus created

  8. 检查 Prometheus 应用的状态。
    kubectl get app prometheus -n tanzu-system-monitoring
    状态应从 Reconciling 更改为 Reconcile succeeded。如果状态为 Reconcile failed,请参见“故障排除”。
  9. 查看有关 Prometheus 应用的详细信息。
    kubectl get app prometheus -n tanzu-system-monitoring -o yaml
  10. 验证 Prometheus DaemonSet。
    kubectl get daemonsets -n tanzu-system-monitoring
  11. 验证 Prometheus 部署。
    kubectl get deployments -n tanzu-system-monitoring

对 Prometheus 部署进行故障排除

如果部署或协调失败,请运行 kubectl get pods -A 以查看 pod 的状态。在正常情况下,您应该看到 pod 的状态为 Running。如果状态为 ImagePullBackOffImageCrashLoopBackOff,则无法从存储库提取容器映像。检查数据值和扩展 YAML 文件中的 URL,并确保它们准确无误。

查看容器日志,其中 name-XXXX 是运行 kubectl get pods -A 时的唯一 pod 名称:
kubectl logs pod/prometheus-alertmanager-XXXXX -c prometheus-alertmanager -n tanzu-system-monitoring
kubectl logs pod/prometheus-server-XXXXX -c prometheus-server -n tanzu-system-monitoring

更新 Prometheus 扩展

可更新部署到 Tanzu Kubernetes 集群的 Prometheus 扩展的配置。

  1. 从密钥获取 Prometheus 数据值。
    kubectl get secret prometheus-data-values -n tanzu-system-monitoring -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > prometheus-data-values.yaml
    
  2. 更新 Prometheus 数据值密钥。
    kubectl create secret generic prometheus-data-values --from-file=values.yaml=prometheus-data-values.yaml -n tanzu-system-monitoring -o yaml --dry-run | kubectl replace -f-
    
    将使用更新的数据值协调 Prometheus 扩展。
    注: 默认情况下,kapp-controller 将每 5 分钟同步一次应用程序。更新应在 5 分钟或更短的时间内生效。如果希望更新立即生效,请将 prometheus-extension.yaml 中的 syncPeriod 更改为更低的值,然后使用 kubectl apply -f prometheus-extension.yaml 应用 Fluent Bit 扩展。
  3. 检查扩展的状态。
    kubectl get app prometheus -n tanzu-system-monitoring

    更新 Prometheus 后,状态应更改为 Reconcile Succeeded

  4. 查看详细状态并进行故障排除。
    kubectl get app prometheus -n tanzu-system-monitoring -o yaml

删除 Prometheus 扩展

Tanzu Kubernetes 集群中删除 Prometheus 扩展。
注: 按顺序完成步骤。在完全删除 Prometheus 应用之前,请勿删除命名空间、服务帐户和角色对象。这样做可能会导致系统错误。
小心: Prometheus 和 Grafana 使用相同的命名空间。删除命名空间会对其中部署的任何扩展造成破坏。如果部署了 Grafana,请不要在删除 Grafana 之前删除命名空间。
  1. 将目录更改为 Prometheus 扩展。
    cd /extensions/monitoring/prometheus/
  2. 删除 Prometheus 应用程序。
    kubectl delete app prometheus -n tanzu-system-monitoring

    预期结果:app.kappctrl.k14s.io "prometheus" deleted

  3. 验证是否已删除 Prometheus 应用。
    kubectl get app prometheus -n tanzu-system-monitoring

    预期结果:apps.kappctrl.k14s.io "prometheus" not found

  4. 删除 tanzu-system-monitoring 命名空间以及 Prometheus 服务帐户和角色对象。
    警告: 如果部署了 Grafana,请勿执行此步骤。
    kubectl delete -f namespace-role.yaml
  5. 如果要重新部署 Prometheus,请移除密钥 prometheus-data-values
    kubectl delete secret prometheus-data-values -n tanzu-system-monitoring

    预期结果:secret "prometheus-data-values" deleted

升级 Prometheus 扩展

如果部署了现有的 Prometheus 扩展,可以将其升级到最新版本。
  1. 导出 Prometheus configmap 并将其另存为备份。
    kubectl get configmap prometheus -n tanzu-system-monitoring -o 'go-template={{ index .data "prometheus.yaml" }}' > prometheus-configmap.yaml
    
  2. 删除现有的 Prometheus 部署。请参见删除 Prometheus 扩展
  3. 部署 Prometheus 扩展。请参见部署 Prometheus 扩展

配置 Prometheus 扩展

Prometheus 配置在 /extensions/monitoring/prometheus/prometheus-data-values.yaml 中设置。
表 1. Prometheus 配置参数
参数 描述 类型 默认
monitoring.namespace 将部署 Prometheus 的命名空间 string tanzu-system-monitoring
monitoring.create_namespace 标记指示是否创建 monitoring.namespace 指定的命名空间 布尔 false
monitoring.prometheus_server.config.prometheus_yaml 要传递到 Prometheus 的 Kubernetes 集群监控器配置详细信息 Yaml 文件 prometheus.yaml
monitoring.prometheus_server.config.alerting_rules_yaml 在 Prometheus 中定义的详细警示规则 Yaml 文件 alerting_rules.yaml
monitoring.prometheus_server.config.recording_rules_yaml 在 Prometheus 中定义的详细记录规则 Yaml 文件 recording_rules.yaml
monitoring.prometheus_server.service.type 用于公开 Prometheus 的服务类型。支持的值:ClusterIP string ClusterIP
monitoring.prometheus_server.enable_alerts.kubernetes_api 在 Prometheus 中为 Kubernetes API 启用 SLO 警示 布尔 true
monitoring.prometheus_server.sc.aws_type 为 AWS 上的 storageclass 定义的 AWS 类型 string gp2
monitoring.prometheus_server.sc.aws_fsType 为 AWS 上的 storageclass 定义的 AWS 文件系统类型 string ext4
monitoring.prometheus_server.sc.allowVolumeExpansion 定义是否允许对 AWS 上的 storageclass 进行卷扩展 布尔 true
monitoring.prometheus_server.pvc.annotations 存储类注释 映射 {}
monitoring.prometheus_server.pvc.storage_class 要用于持久卷声明的存储类。默认情况下,此参数为空,并使用默认置备程序 string
monitoring.prometheus_server.pvc.accessMode 为持久卷声明定义访问模式。支持的值: ReadWriteOnce、ReadOnlyMany、ReadWriteMany string ReadWriteOnce
monitoring.prometheus_server.pvc.storage 为持久卷声明定义存储大小 string 8Gi
monitoring.prometheus_server.deployment.replicas prometheus 副本数 integer 1
monitoring.prometheus_server.image.repository 包含 Prometheus 映像的存储库的位置。默认为公共 VMware 注册表。如果使用的是专用存储库(例如气隙环境),请更改此值。 string projects.registry.vmware.com/tkg/prometheus
monitoring.prometheus_server.image.name Prometheus 映像的名称 string prometheus
monitoring.prometheus_server.image.tag Prometheus 映像标记。如果升级版本,可能需要更新此值。 string v2.17.1_vmware.1
monitoring.prometheus_server.image.pullPolicy Prometheus 映像提取策略 string IfNotPresent
monitoring.alertmanager.config.slack_demo Alertmanager 的 Slack 通知配置 string
slack_demo:
  name: slack_demo
  slack_configs:
  - api_url: https://hooks.slack.com
    channel: '#alertmanager-test'
monitoring.alertmanager.config.email_receiver Alertmanager 的电子邮件通知配置 string
email_receiver:
  name: email-receiver
  email_configs:
  - to: demo@tanzu.com
    send_resolved: false
    from: from-email@tanzu.com
    smarthost: smtp.eample.com:25
    require_tls: false
monitoring.alertmanager.service.type 用于公开 Alertmanager 的服务类型。支持的值:ClusterIP string ClusterIP
monitoring.alertmanager.image.repository 具有 Alertmanager 映像的存储库的位置。默认为公共 VMware 注册表。如果使用的是专用存储库(例如气隙环境),请更改此值。 string projects.registry.vmware.com/tkg/prometheus
monitoring.alertmanager.image.name Alertmanager 映像的名称 string alertmanager
monitoring.alertmanager.image.tag Alertmanager 映像标记。如果升级版本,可能需要更新此值。 string v0.20.0_vmware.1
monitoring.alertmanager.image.pullPolicy Alertmanager 映像拉取策略 string IfNotPresent
monitoring.alertmanager.pvc.annotations 存储类注释 映射 {}
monitoring.alertmanager.pvc.storage_class 要用于持久卷声明的存储类。默认情况下,此参数为空,并使用默认置备程序。 string
monitoring.alertmanager.pvc.accessMode 为持久卷声明定义访问模式。支持的值: ReadWriteOnce、ReadOnlyMany、ReadWriteMany string ReadWriteOnce
monitoring.alertmanager.pvc.storage 为持久卷声明定义存储大小 string 2Gi
monitoring.alertmanager.deployment.replicas alertmanager 副本数 integer 1
monitoring.kube_state_metrics.image.repository 包含 kube-state-metircs 映像的存储库。默认为公共 VMware 注册表。如果使用的是专用存储库(例如气隙环境),请更改此值。 string projects.registry.vmware.com/tkg/prometheus
monitoring.kube_state_metrics.image.name kube-state-metircs 映像的名称 string kube-state-metrics
monitoring.kube_state_metrics.image.tag kube-state-metircs 映像标记。如果升级版本,可能需要更新此值。 string v1.9.5_vmware.1
monitoring.kube_state_metrics.image.pullPolicy kube-state-metircs 映像提取策略 string IfNotPresent
monitoring.kube_state_metrics.deployment.replicas Kube-state-metrics 副本数 integer 1
monitoring.node_exporter.image.repository 包含 node-exporter 映像的存储库。默认为公共 VMware 注册表。如果使用的是专用存储库(例如气隙环境),请更改此值。 string projects.registry.vmware.com/tkg/prometheus
monitoring.node_exporter.image.name node-exporter 映像的名称 string node-exporter
monitoring.node_exporter.image.tag node-exporter 映像标记。如果升级版本,可能需要更新此值。 string v0.18.1_vmware.1
monitoring.node_exporter.image.pullPolicy node-exporter 映像提取策略 string IfNotPresent
monitoring.node_exporter.hostNetwork 如果设置为 hostNetwork: true,Pod 可以使用节点的网络命名空间和网络资源。 布尔 false
monitoring.node_exporter.deployment.replicas 节点导出副本数 integer 1
monitoring.pushgateway.image.repository 包含 pushgateway 映像的存储库。默认为公共 VMware 注册表。如果使用的是专用存储库(例如气隙环境),请更改此值。 string projects.registry.vmware.com/tkg/prometheus
monitoring.pushgateway.image.name pushgateway 映像的名称 string pushgateway
monitoring.pushgateway.image.tag pushgateway 映像标记。如果升级版本,可能需要更新此值。 string v1.2.0_vmware.1
monitoring.pushgateway.image.pullPolicy pushgateway 映像提取策略 string IfNotPresent
monitoring.pushgateway.deployment.replicas pushgateway 副本数 integer 1
monitoring.cadvisor.image.repository 包含 cadvisor 映像的存储库。默认为公共 VMware 注册表。如果使用的是专用存储库(例如气隙环境),请更改此值。 string projects.registry.vmware.com/tkg/prometheus
monitoring.cadvisor.image.name cadvisor 映像的名称 string cadvisor
monitoring.cadvisor.image.tag cadvisor 映像标记。如果升级版本,可能需要更新此值。 string v0.36.0_vmware.1
monitoring.cadvisor.image.pullPolicy cadvisor 映像提取策略 string IfNotPresent
monitoring.cadvisor.deployment.replicas cadvisor 副本数 integer 1
monitoring.ingress.enabled 为 prometheus 和 alertmanager 启用/禁用输入 布尔

false

要使用输入,请将此字段设置为 true,然后部署 Contour。要访问 Prometheus,请使用将 prometheus.system.tanzu 映射到工作节点 IP 地址的条目更新本地 /etc/hosts

monitoring.ingress.virtual_host_fqdn 用于访问 Prometheus 和 Alertmanager 的主机名 string prometheus.system.tanzu
monitoring.ingress.prometheus_prefix prometheus 的路径前缀 string /
monitoring.ingress.alertmanager_prefix alertmanager 的路径前缀 string /alertmanager/
monitoring.ingress.tlsCertificate.tls.crt 如果要使用自己的 TLS 证书,则为用于输入的可选证书。默认情况下生成自签名证书 string 生成的证书
monitoring.ingress.tlsCertificate.tls.key 如果要使用自己的 TLS 证书,则为用于输入的可选证书私钥。 string 生成的证书密钥
表 2. Prometheus_Server Configmap 的可配置字段
参数 描述 类型 默认
evaluation_interval 评估规则的频率 持续时间 1m
scrape_interval 抓取目标的频率 持续时间 1m
scrape_timeout 直到抓取请求超时的时长 持续时间 10s
rule_files 规则文件指定一组全局组。从所有匹配的文件中读取规则和警示 Yaml 文件
scrape_configs 碎片配置列表。 列表
job_name 默认情况下,分配给已抓取指标的作业名称 string
kubernetes_sd_configs Kubernetes 服务发现配置列表。 列表
relabel_configs 目标重新标记配置列表。 列表
操作 要根据正则表达式匹配执行的操作。 string
regex 与所提取的值匹配的正则表达式。 string
source_labels 源标签从现有标签中选择值。 string
方案 配置用于请求的协议方案。 string
tls_config 配置抓取请求的 TLS 设置。 string
ca_file 用于验证 API 服务器证书的 CA 证书。 文件名
insecure_skip_verify 禁用服务器证书验证。 布尔
bearer_token_file 可选持有者令牌文件身份验证信息。 文件名
替换 正则表达式匹配时,执行正则表达式替换所依据的替换值。 string
target_label 在替换操作中写入所生成值的标签。 string
表 3. Alertmanager Configmap 的可配置字段
参数 描述 类型 默认
resolve_timeout 如果警示不包括 EndsAt,则 ResolveTimeout 是 alertmanager 使用的默认值 持续时间 5m
smtp_smarthost 通过其发送电子邮件的 SMTP 主机。 持续时间 1m
slack_api_url Slack webhook URL。 string global.slack_api_url
pagerduty_url 要将 API 请求发送到的 pagerduty URL。 string global.pagerduty_url
模板 从中读取自定义通知模板定义的文件 文件路径
group_by 按标签对警示进行分组 string
group_interval 设置发送有关添加到组的新警示的通知之前等待的时间 持续时间 5m
group_wait 最初等待针对一组警示发送通知的时长 持续时间 30 秒
repeat_interval 如果已针对警示成功发送了通知,在再次发送通知之前等待的时长 持续时间 4 小时
接收方 通知接收方列表。 列表
严重性 事件的严重性。 string
通道 要发送通知的通道或用户。 string
html 电子邮件通知的 HTML 正文。 string
文本 电子邮件通知的文本正文。 string
send_resolved 是否通知已解决的警示。 文件名
email_configs 电子邮件集成配置 布尔
有关 Pod 的注释可以精细控制提取过程。这些注释必须是 Pod 元数据的一部分。如果在其他对象(如 Services 或 DaemonSet)上设置,则这些注释将不起作用。
表 4. Prometheus Pod 注释
Pod 注释 描述
prometheus.io/scrape 默认配置将抓取所有 Pod,如果设置为 false,则此注释会从抓取处理过程中排除 Pod。
prometheus.io/path 如果指标路径不是 /metrics,则用此注释进行定义。
prometheus.io/port 在指示的端口上抓取 Pod,而不是 Pod 的已声明端口(如果声明无,则默认为无端口目标)。
下面的 DaemonSet 清单将指示 Prometheus 在端口 9102 上抓取其所有 Pod。
apiVersion: apps/v1beta2 # for versions before 1.8.0 use extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: weave
  labels:
    app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '9102'
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: gcr.io/google-containers/fluentd-elasticsearch:1.20