在工作负载集群上部署 Prometheus

本主题介绍了如何将 Prometheus 部署到工作负载集群中。以下过程适用于 vSphere、Amazon Web Services (AWS) 和 Azure 部署。

Prometheus

Prometheus 是一个监控和警示工具包的开源系统。Tanzu Kubernetes Grid 包含 Prometheus 的签名二进制文件,您可以在工作负载集群上部署这些二进制文件以监控集群运行状况和服务。

必备条件

重要

Tanzu Kubernetes Grid 中对 IPv6 地址的支持有限;请参见在 IPv6 上部署集群(仅限 vSphere)。如果未部署到仅 IPv6 网络环境,则必须在以下步骤中提供 IPv4 地址。

为 Prometheus 部署准备工作负载集群

要准备集群,请执行以下操作:

  1. 获取要部署 Prometheus 的工作负载集群的管理员凭据。例如:

    tanzu cluster kubeconfig get my-cluster --admin
    
  2. 将 kubectl 的上下文设置为集群。例如:

    kubectl config use-context my-cluster-admin@my-cluster
    

(可选)为 Prometheus 启用 Ingress

要启用 Ingress,您可以安装以下可选软件包:

  1. 安装证书管理器。有关信息,请参见安装证书管理器以进行证书管理
  2. 安装 Contour。有关信息,请参见安装 Contour 以进行 Ingress 控制

继续将 Prometheus 部署到下面的工作负载集群

将 Prometheus 部署到工作负载集群

要安装 Prometheus,请执行以下操作:

  1. 如果集群没有安装有 Prometheus 软件包的软件包存储库,如 tanzu-standard 存储库,请安装一个:

    tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
    

    其中:

    • PACKAGE-REPO-NAME 是软件包存储库的名称,如 tanzu-standard 或使用 ADDITIONAL_IMAGE_REGISTRY 变量配置的专用映像注册表的名称。
    • PACKAGE-REPO-ENDPOINT 是软件包存储库的 URL。

      • 对于此版本,tanzu-standard URL 为 projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16。要从 Tanzu CLI 获取此值,请参见列出软件包存储库,或在 Tanzu Mission Control 中查看集群 (Cluster) 窗格中的附加模块 (Addons) > 存储库 (Repositories) 列表。
  2. 确认 Prometheus 软件包在您的工作负载集群中可用:

    tanzu package available list -A
    
  3. 检索可用软件包的版本:

    tanzu package available list prometheus.tanzu.vmware.com -A
    | Retrieving package versions for prometheus.tanzu.vmware.com...
     NAME                           VERSION                          RELEASED-AT           NAMESPACE
     prometheus.tanzu.vmware.com    2.43.0+vmware.1-tkg.4            2020-11-24T18:00:00Z  tanzu-package-repo-global
    

准备好部署 Prometheus 后,您可以:

vSphere with Tanzu:要将 Prometheus 软件包部署到由 vSphere 主管集群创建的工作负载集群,必须使用自定义值进行部署。尚未针对 vSphere 7.0 U3 上的工作负载集群验证 Prometheus 软件包。

使用默认配置部署 Prometheus

确认软件包版本并检索软件包后,可以安装该软件包。

  1. 使用其默认值安装 Prometheus 软件包:

    tanzu package install prometheus \
    --package prometheus.tanzu.vmware.com \
    --version AVAILABLE-PACKAGE-VERSION \
    --namespace TARGET-NAMESPACE
    

    其中:

    • TARGET-NAMESPACE 是要在其中安装 Prometheus 软件包的命名空间。例如,my-packagestanzu-cli-managed-packages 命名空间。

      • 如果未指定 --namespace 标记,Tanzu CLI 将使用 default 命名空间。Prometheus Pod 以及与 Prometheus 组件关联的任何其他资源是在 tanzu-system-monitoring 命名空间中创建的;请勿将 Prometheus 软件包安装到此命名空间中。
      • 指定的命名空间必须已存在,例如,通过运行 kubectl create namespace my-packages
    • AVAILABLE-PACKAGE-VERSION 是上面检索到的版本,例如 2.43.0+vmware.1-tkg.4

    例如:

    tanzu package install prometheus --package prometheus.tanzu.vmware.com --namespace my-packages --version 2.43.0+vmware.1-tkg.4
    
    \ Installing package 'prometheus.tanzu.vmware.com'
    | Getting package metadata for 'prometheus.tanzu.vmware.com'
    | Creating service account 'prometheus-my-packages-sa'
    | Creating cluster admin role 'prometheus-my-packages-cluster-role'
    | Creating cluster role binding 'prometheus-my-packages-cluster-rolebinding'
    - Creating package resource
    \ Package install status: Reconciling
    
    Added installed package 'prometheus' in namespace 'my-packages'
    
  2. vSphere with Tanzu:在启用了 vSphere with Tanzu 功能的 vSphere 8 和 vSphere 7.0 U2 上,tanzu package install prometheus 命令可能返回 Failed to get final advertise address: No private IP address found, and explicit IP not provided 错误。

    要修复此错误,请创建并应用软件包覆盖以重新配置 alertmanager 组件:

    1. 创建一个 overlay-alertmanager.yaml 文件,其中包含:

      ---
      #@ load("@ytt:overlay", "overlay")
      
      #@overlay/match by=overlay.and_op(overlay.subset({"kind": "Deployment"}), overlay.subset({"metadata": {"name": "alertmanager"}}))
      ---
      spec:
        template:
          spec:
            containers:
              #@overlay/match by="name",expects="0+"
              - name: alertmanager
                args:
                  - --cluster.listen-address=
      
    2. 为覆盖网络创建密钥:

      kubectl create secret generic alertmanager-overlay -n tanzu-package-repo-global -o yaml --dry-run=client --from-file=overlay-alertmanager.yaml | kubectl apply -f -
      
    3. 使用密钥注释软件包:

      kubectl annotate PackageInstall prometheus -n tanzu-package-repo-global ext.packaging.carvel.dev/ytt-paths-from-secret-name.1=alertmanager-overlay
      

继续验证下面的 Prometheus 部署

使用自定义值部署 Prometheus

要使用用户提供的值安装 Prometheus 软件包,请执行以下操作:

  1. 创建配置文件。此文件配置 Prometheus 软件包。

    tanzu package available get prometheus.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
    

    其中,PACKAGE-VERSION 是要安装的 Prometheus 软件包的版本,FILE-PATH 是要将配置文件保存到的位置,例如,prometheus-data-values.yaml。以上命令将创建一个名为 prometheus-data-values.yaml 的配置文件,其中包含默认值。请注意,在以前的版本中,此文件称为 prometheus-data-values.yaml

    有关要在 prometheus-data-values.yaml 中使用的配置参数的信息,请参见下面的 Prometheus 软件包配置参数

  2. vSphere with Tanzu:如果要将 Prometheus 部署到使用 vSphere 主管集群创建的工作负载集群,请在 prometheus-data-values.yaml 文件中设置 prometheus.pvc.storageClassNamealertmanager.pvc.storageClassName 的非 null 值:

    ingress:
      enabled: true
      virtual_host_fqdn: "prometheus.corp.tanzu"
      prometheus_prefix: "/"
      alertmanager_prefix: "/alertmanager/"
      prometheusServicePort: 80
      alertmanagerServicePort: 80
    prometheus:
      pvc:
        storageClassName: STORAGE-CLASS
    alertmanager:
      pvc:
        storageClassName: STORAGE-CLASS
    

    其中,STORAGE-CLASS 是集群存储类的名称,如 kubectl get storageclass 返回的名称。

  3. prometheus-data-values.yaml 文件进行任何所需的更改后,移除其中的所有注释:

    yq -i eval '... comments=""' prometheus-data-values.yaml
    
  4. 部署软件包:

    tanzu package install prometheus \
    --package prometheus.tanzu.vmware.com \
    --version PACKAGE-VERSION \
    --values-file prometheus-data-values.yaml \
    --namespace TARGET-NAMESPACE
    

    其中:

    • TARGET-NAMESPACE 是要在其中安装 Prometheus 软件包、Prometheus 软件包应用以及描述该软件包的任何其他 Kubernetes 资源的命名空间。例如,my-packagestanzu-cli-managed-packages 命名空间。如果未指定 --namespace 标记,Tanzu CLI 将使用 default 命名空间。Prometheus Pod 以及与 Prometheus 组件关联的任何其他资源是在 tanzu-system-monitoring 命名空间中创建的;请勿将 Prometheus 软件包安装到此命名空间中。
    • PACKAGE-VERSION 是上面检索到的版本,例如 2.43.0+vmware.1-tkg.4

继续验证下面的 Prometheus 部署

验证 Prometheus 部署

部署 Prometheus 后,可以验证部署是否成功:

  1. 确认已安装 Prometheus 软件包。例如:

    tanzu package installed list -A
    / Retrieving installed packages...
    NAME            PACKAGE-NAME                       PACKAGE-VERSION                STATUS                   NAMESPACE
    cert-manager    cert-manager.tanzu.vmware.com      1.10.1+vmware.1-tkg.2           Reconcile succeeded      my-packages
    prometheus      prometheus.tanzu.vmware.com        2.43.0+vmware.1-tkg.4          Reconcile succeeded      my-packages
    antrea          antrea.tanzu.vmware.com                                           Reconcile succeeded      tkg-system
    metrics-server  metrics-server.tanzu.vmware.com                                   Reconcile succeeded      tkg-system
    vsphere-cpi     vsphere-cpi.tanzu.vmware.com                                      Reconcile succeeded      tkg-system
    vsphere-csi     vsphere-csi.tanzu.vmware.com                                      Reconcile succeeded      tkg-system
    

    prometheus 软件包和 prometheus 应用安装在运行 tanzu package install 命令时指定的命名空间中。

  2. 确认已成功协调 prometheus 应用:

    kubectl get apps -A
    

    例如:

    NAMESPACE     NAME                                DESCRIPTION           SINCE-DEPLOY   AGE
    my-packages   cert-manager                        Reconcile succeeded   74s            29m
    my-packages   prometheus                          Reconcile succeeded   20s            33m
    tkg-system    antrea                              Reconcile succeeded   70s            3h43m
    [...]
    

    如果状态不是 Reconcile succeeded,请查看 prometheus 应用的完整状态详细信息。查看完整状态可帮助您解决问题:

    kubectl get app prometheus --namespace PACKAGE-NAMESPACE -o yaml
    

    其中,PACKAGE-NAMESPACE 是安装软件包的命名空间。

  3. 通过列出集群中正在运行的所有 Pod,确认新服务正在运行。

    kubectl get pods -A
    

    tanzu-system-monitoring 命名空间中,您应该会看到 pod 中运行的 prometheusalertmanagernode_exporterpushgatewaycadvisorkube_state_metrics 服务:

    NAMESPACE               NAME                                    READY   STATUS    RESTARTS   AGE
    [...]
    tanzu-system-monitoring   alertmanager-d6bb4d94d-7fgmb                             1/1     Running   0          35m
    tanzu-system-monitoring   prometheus-cadvisor-pgfck                                1/1     Running   0          35m
    tanzu-system-monitoring   prometheus-kube-state-metrics-868b5b749d-9w5f2           1/1     Running   0          35m
    tanzu-system-monitoring   prometheus-node-exporter-97x6c                           1/1     Running   0          35m
    tanzu-system-monitoring   prometheus-node-exporter-dnrkk                           1/1     Running   0          35m
    tanzu-system-monitoring   prometheus-pushgateway-84cc9b85c6-tgmv6                  1/1     Running   0          35m
    tanzu-system-monitoring   prometheus-server-6479964fb6-kk9g2                       2/2     Running   0          35m
    [...]
    

Prometheus Pod 以及与 Prometheus 组件关联的任何其他资源是在 prometheus-data-values.yaml 中提供的命名空间中创建的。如果使用的是默认命名空间,则会在 tanzu-system-monitoring 命名空间中创建这些 Pod 和资源。

Prometheus 软件包配置参数

您可以通过两种方法查看 Prometheus 软件包的配置参数:

查看软件包结构定义

要检索软件包结构定义,请执行以下操作:

tanzu package available get prometheus.tanzu.vmware.com/2.43.0+vmware.1-tkg.4 -n AVAILABLE-PACKAGE-NAMESPACE --values-schema

此命令列出 Prometheus 软件包的配置参数及其默认值。您可以使用输出更新使用在上述使用自定义值部署 Prometheus 中创建的prometheus-data-values.yml

审核配置参数

下表列出了 Prometheus 软件包的配置参数,并介绍了其默认值。

您可以在上述使用自定义值部署 Prometheus 创建的 prometheus-data-values.yml 文件中设置以下配置值。

参数 描述 类型 默认
namespace 将在其中部署 Prometheus 的命名空间。 String tanzu-system-monitoring
prometheus.deployment.replicas Prometheus 副本数。 String 1
prometheus.deployment.containers.args Prometheus 容器参数。您可以配置此参数以更改保留时间。有关配置 Prometheus 存储参数的信息,请参见 Prometheus 文档注意 较长保留时间比较短保留时间所需的存储容量多。如果要大幅增加保留时间,则可能需要增加持久卷声明大小。 列表 不适用
prometheus.deployment.containers.resources Prometheus 容器资源请求和限制。 映射 {}
prometheus.deployment.podAnnotations Prometheus 部署 Pod 注释。 映射 {}
prometheus.deployment.podLabels Prometheus 部署 Pod 标签。 映射 {}
prometheus.deployment.configMapReload.containers.args Configmap-reload 容器参数。 列表 不适用
prometheus.deployment.configMapReload.containers.resources Configmap-reload 容器资源请求和限制。 映射 {}
prometheus.service.type 用于公开 Prometheus 的服务类型。支持的值:ClusterIP String ClusterIP
prometheus.service.port Prometheus 服务端口。 Integer 80
prometheus.service.targetPort Prometheus 服务目标端口。 Integer 9090
prometheus.service.labels Prometheus 服务标签。 映射 {}
prometheus.service.annotations Prometheus 服务注释。 映射 {}
prometheus.pvc.annotations 存储类注释。 映射 {}
prometheus.pvc.storageClassName 用于持久卷声明的存储类。默认情况下,此值为 null,并使用默认置备程序。 String null
prometheus.pvc.accessMode 定义持久卷声明的访问模式。支持的值:ReadWriteOnceReadOnlyManyReadWriteMany String ReadWriteOnce
prometheus.pvc.storage 定义持久卷声明的存储大小。 String 150Gi
prometheus.config.prometheus_yml 有关全局 Prometheus 配置的信息,请参见 Prometheus 文档 YAML 文件 prometheus.yaml
prometheus.config.alerting_rules_yml 有关 Prometheus 警示规则的信息,请参见 Prometheus 文档 YAML 文件 alerting_rules.yaml
prometheus.config.recording_rules_yml 有关 Prometheus 记录规则的信息,请参见 Prometheus 文档 YAML 文件 recording_rules.yaml
prometheus.config.alerts_yml 此处配置了其他 Prometheus 警示规则。 YAML 文件 alerts_yml.yaml
prometheus.config.rules_yml 此处配置了其他 Prometheus 记录规则。 YAML 文件 rules_yml.yaml
alertmanager.deployment.replicas alertmanager 副本数。 Integer 1
alertmanager.deployment.containers.resources Alertmanager 容器资源请求和限制。 映射 {}
alertmanager.deployment.podAnnotations Alertmanager 部署 Pod 注释。 映射 {}
alertmanager.deployment.podLabels Alertmanager 部署 Pod 标签。 映射 {}
alertmanager.service.type 用于公开 Alertmanager 的服务类型。支持的值:ClusterIP String ClusterIP
alertmanager.service.port Alertmanager 服务端口。 Integer 80
alertmanager.service.targetPort Alertmanager 服务目标端口。 Integer 9093
alertmanager.service.labels Alertmanager 服务标签。 映射 {}
alertmanager.service.annotations Alertmanager 服务注释。 映射 {}
alertmanager.pvc.annotations 存储类注释。 映射 {}
alertmanager.pvc.storageClassName 用于持久卷声明的存储类。默认情况下,此值为 null,并使用默认置备程序。 String null
alertmanager.pvc.accessMode 定义持久卷声明的访问模式。支持的值:ReadWriteOnceReadOnlyManyReadWriteMany String ReadWriteOnce
alertmanager.pvc.storage 定义持久卷声明的存储大小。 String 2Gi
alertmanager.config.alertmanager_yml 有关警示管理器的全局 YAML 配置的信息,请参见 Prometheus 文档 YAML 文件 alertmanager_yml
kube_state_metrics.deployment.replicas kube-state-metrics 副本数。 Integer 1
kube_state_metrics.deployment.containers.resources kube-state-metrics 容器资源请求和限制。 映射 {}
kube_state_metrics.deployment.podAnnotations kube-state-metrics 部署 Pod 注释。 映射 {}
kube_state_metrics.deployment.podLabels kube-state-metrics 部署 Pod 标签。 映射 {}
kube_state_metrics.service.type 用于公开 kube-state-metrics 的服务类型。支持的值:ClusterIP String ClusterIP
kube_state_metrics.service.port kube-state-metrics 服务端口。 Integer 80
kube_state_metrics.service.targetPort kube-state-metrics 服务目标端口。 Integer 8080
kube_state_metrics.service.telemetryPort kube-state-metrics 服务遥测端口。 Integer 81
kube_state_metrics.service.telemetryTargetPort kube-state-metrics 服务目标遥测端口。 Integer 8081
kube_state_metrics.service.labels kube-state-metrics 服务标签。 映射 {}
kube_state_metrics.service.annotations kube-state-metrics 服务注释。 映射 {}
node_exporter.daemonset.replicas 节点导出程序副本数。 Integer 1
node_exporter.daemonset.containers.resources 节点导出程序容器资源请求和限制。 映射 {}
node_exporter.daemonset.hostNetwork 已为此 Pod 请求主机网络连接。 布尔 false
node_exporter.daemonset.podAnnotations 节点导出程序部署 Pod 注释。 映射 {}
node_exporter.daemonset.podLabels 节点导出程序部署 Pod 标签。 映射 {}
node_exporter.service.type 用于公开节点导出程序的服务类型。支持的值:ClusterIP String ClusterIP
node_exporter.service.port 节点导出程序服务端口。 Integer 9100
node_exporter.service.targetPort 节点导出程序服务目标端口。 Integer 9100
node_exporter.service.labels 节点导出程序服务标签。 映射 {}
node_exporter.service.annotations 节点导出程序服务注释。 映射 {}
pushgateway.deployment.replicas pushgateway 副本数。 Integer 1
pushgateway.deployment.containers.resources pushgateway 容器资源请求和限制。 映射 {}
pushgateway.deployment.podAnnotations pushgateway 部署 Pod 注释。 映射 {}
pushgateway.deployment.podLabels pushgateway 部署 Pod 标签。 映射 {}
pushgateway.service.type 用于公开 pushgateway 的服务类型。支持的值:ClusterIP String ClusterIP
pushgateway.service.port pushgateway 服务端口。 Integer 9091
pushgateway.service.targetPort pushgateway 服务目标端口。 Integer 9091
pushgateway.service.labels pushgateway 服务标签。 映射 {}
pushgateway.service.annotations pushgateway 服务注释。 映射 {}
cadvisor.daemonset.replicas cadvisor 副本数。 Integer 1
cadvisor.daemonset.containers.resources cadvisor 容器资源请求和限制。 映射 {}
cadvisor.daemonset.podAnnotations cadvisor 部署 Pod 注释。 映射 {}
cadvisor.daemonset.podLabels cadvisor 部署 Pod 标签。 映射 {}
ingress.enabled 为 prometheus 和 alertmanager 启用/禁用输入。 布尔 false
ingress.virtual_host_fqdn 用于访问 promethues 和 alertmanager 的主机名。 String prometheus.system.tanzu
ingress.prometheus_prefix prometheus 的路径前缀。 String /
ingress.alertmanager_prefix alertmanager 的路径前缀。 String /alertmanager/
ingress.prometheusServicePort 要将流量代理到的 Prometheus 服务端口。 Integer 80
ingress.alertmanagerServicePort 要将流量代理到的 Alertmanager 服务端口。 Integer 80
ingress.tlsCertificate.tls.crt 如果要使用自己的 TLS 证书,则使用可选证书进行输入。默认情况下,将生成一个自签名证书。注意tls.crt 是密钥,未嵌套。 String Generated cert
ingress.tlsCertificate.tls.key 用于输入的可选证书私钥(如果要使用自己的 TLS 证书)。
注意tls.key 是密钥,未嵌套。
String Generated cert key
ingress.tlsCertificate.ca.crt 可选的 CA 证书。注意ca.crt 是密钥,未嵌套。 String CA certificate


更新正在运行的 Prometheus 部署

要在部署后更改 Prometheus 软件包的配置,请更新部署的 Prometheus 软件包:

  1. 更新 prometheus-data-values.yaml 文件中的 Prometheus 配置。

  2. 更新安装的软件包:

    tanzu package installed update prometheus \
    --version 2.43.0+vmware.1-tkg.4 \
    --values-file prometheus-data-values.yaml \
    --namespace my-packages
    

    预期输出:

    | Updating package 'prometheus'
    - Getting package install for 'prometheus'
    | Updating secret 'prometheus-my-packages-values'
    | Updating package install for 'prometheus'
    
     Updated package install 'prometheus' in namespace 'my-packages'
    

使用新值或者您添加的值协调 Prometheus 软件包。kapp-controller 应用更改可能需要长达五分钟的时间。

有关更新的信息,请参见更新软件包

删除 Prometheus 部署

要移除集群上的 Prometheus 软件包,请运行:

tanzu package installed delete prometheus --namespace my-packages

有关删除的信息,请参见删除软件包

在警示管理器中配置通知

要为 Alert Manager 配置通知,请编辑 prometheus-data-values.yml 文件中的 alertmanager.config.alertmanager_yml 部分。

有关配置通知(如 Slack 或电子邮件)的信息,请参见 Prometheus 文档中的配置

访问 Prometheus 仪表板

默认情况下,Prometheus 上未启用输入。这是因为未对 Prometheus 仪表板的访问进行身份验证。要访问 Prometheus 仪表板,请执行以下操作:

  1. 在集群上部署 Contour。

    有关部署 Contour 的信息,请参见为 Ingress 控制安装 Contour

  2. 将下面的 ingress.enabled 部分复制到 prometheus-data-values.yaml 中。

    ingress:
      enabled: false
      virtual_host_fqdn: "prometheus.system.tanzu"
      prometheus_prefix: "/"
      alertmanager_prefix: "/alertmanager/"
      prometheusServicePort: 80
      alertmanagerServicePort: 80
      #! [Optional] The certificate for the ingress if you want to use your own TLS certificate.
      #! We will issue the certificate by cert-manager when it's empty.
      tlsCertificate:
        #! [Required] the certificate
        tls.crt:
        #! [Required] the private key
        tls.key:
        #! [Optional] the CA certificate
        ca.crt:
    
  3. ingress.enabledfalse 更新为 true

  4. 创建一个 DNS 记录以映射 prometheus.system.tanzu 到 Envoy 负载均衡器的地址。

    要获取 Envoy 负载均衡器的地址,请参见为 Ingress 控制安装 Contour

  5. 在浏览器中导航到 https://prometheus.system.tanzu 以访问 Prometheus 仪表板。

    Prometheus 仪表板

下一步操作

Prometheus 软件包现在正在运行,并且正在从集群中提取数据。要在 Grafana 仪表板中显示数据,请参见在工作负载集群上部署 Grafana

check-circle-line exclamation-circle-line close-line
Scroll to top icon