最新:在TwitterMastodon

Prometheus 指标

为了帮助进行操作并深入了解 cert-manager 的活动,cert-manager 以 Prometheus 格式从控制器、Webhook 和 cainjector 组件公开指标。这些指标可在每个组件 Pod 的标准 /metrics 端点(端口 9402)上获取。

抓取指标

如何抓取指标取决于您如何操作 Prometheus 服务器。这些示例假设使用 Prometheus Operator 运行 Prometheus,并配置 Pod 或 Service Monitor CRD。

Helm

如果使用 Helm 部署 cert-manager,可以配置 PodMonitor 资源。此配置应启用指标抓取,并且可以根据 Helm 配置文档 中的描述进一步调整配置。

prometheus:
enabled: true
podmonitor:
enabled: true

常规清单

如果不使用 Helm 部署 cert-manager,而是使用提供的常规 YAML 清单,则此示例 PodMonitor 应该是开始摄取 cert-manager 指标所需的一切。

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: cert-manager
namespace: cert-manager
labels:
app: cert-manager
app.kubernetes.io/name: cert-manager
app.kubernetes.io/instance: cert-manager
spec:
jobLabel: app.kubernetes.io/name
selector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- cainjector
- cert-manager
- webhook
- key: app.kubernetes.io/instance
operator: In
values:
- release-name
- key: app.kubernetes.io/component
operator: In
values:
- cainjector
- controller
- webhook
podMetricsEndpoints:
- port: http-metrics

TLS

可以在指标端点上启用 TLS 以实现端到端加密。这可以通过使用预签名静态证书或使用内部动态证书签名来实现。

静态证书

可以向 cert-manager 提供静态证书,以便在侦听指标端点时使用。如果证书文件发生更改,则 cert-manager 将重新加载证书以实现零停机时间轮换。

可以使用标志 --metrics-tls-cert-file--metrics-tls-private-key-file 或相应的配置文件参数 metricsTLSConfig.filesystem.certFilemetricsTLSConfig.filesystem.keyFile 指定静态证书。

证书和私钥必须装载到控制器 Pod 中才能正常工作。如果使用 Helm 部署 cert-manager,则 .volumes[].mounts[] 属性可以帮助实现此功能。

Helm 值文件示例:

# values.yaml
prometheus:
enabled: true
config:
metricsTLSConfig:
filesystem:
certFile: "/path/to/cert.pem"
keyFile: "/path/to/key.pem"
webhook:
config:
metricsTLSConfig:
filesystem:
certFile: "/path/to/cert.pem"
keyFile: "/path/to/key.pem"
cainjector:
config:
metricsTLSConfig:
filesystem:
certFile: "/path/to/cert.pem"
keyFile: "/path/to/key.pem"

动态证书

在此模式下,cert-manager 将在命名 Secret 中创建 CA,然后使用此 CA 签署指标端点证书。此模式还将负责轮换,并在需要时自动轮换证书。

可以使用标志 --metrics-dynamic-serving-ca-secret-namespace--metrics-dynamic-serving-ca-secret-name--metrics-dynamic-serving-dns-names 或相应的配置文件参数 metricsTLSConfig.dynamic.secretNamespacemetricsTLSConfig.dynamic.secretNamemetricsTLSConfig.dynamic.dnsNames 指定动态证书。

Helm 值文件示例:

# values.yaml
prometheus:
enabled: true
podmonitor:
enabled: true
endpointAdditionalProperties:
scheme: https
tlsConfig:
serverName: cert-manager-metrics
ca:
secret:
name: cert-manager-metrics-ca
key: "tls.crt"
config:
metricsTLSConfig:
dynamic:
secretNamespace: "cert-manager"
secretName: "cert-manager-metrics-ca"
dnsNames:
- cert-manager-metrics
webhook:
config:
metricsTLSConfig:
dynamic:
secretNamespace: "cert-manager"
secretName: "cert-manager-metrics-ca"
dnsNames:
- cert-manager-metrics
cainjector:
config:
metricsTLSConfig:
dynamic:
secretNamespace: "cert-manager"
secretName: "cert-manager-metrics-ca"
dnsNames:
- cert-manager-metrics

ℹ️ 此配置将导致创建一个新的 Secret cert-manager/cert-manager-metrics-ca,其中包含 CA。第一个 controllerwebookcainjector Pod 将创建 CA Secret,其他 Pod 随后将使用它。

所有控制器、Webhook 和 cainjector Pod 都将生成自己的唯一指标服务证书,并使用 CA 私钥对其进行签名。

PodMonitor 被配置为从 CA Secret 读取公钥证书,Prometheus 将在连接到每个匹配 Pod 的指标服务器时使用该 CA。

所有服务证书共享相同的 DNS 名称。必须将相同的名称添加到 PodMonitor,Prometheus 将在连接到每个匹配 Pod 的指标服务器时使用该主机名。

故障排除

检查控制器、Webhook 和 cainjector 日志以查看创建和更新的 CA 证书和服务证书。

kubectl -n cert-manager logs -l app.kubernetes.io/instance=cert-manager --prefix
I0719 15:21:28.113411 1 dynamic_source.go:172] "Detected root CA rotation - regenerating serving certificates" logger="cert-manager"
I0719 15:21:28.115018 1 dynamic_source.go:290] "Updated cert-manager TLS certificate" logger="cert-manager" DNSNames=["cert-manager-metrics"]

使用 kubectl port-forwardcurl 检查指标端点的连接。

kubectl port-forward -n cert-manager deployment/cert-manager-webhook 9402
curl --insecure -v https://localhost:9402/metrics

检查 Prometheus 状态页面上 cert-manager 抓取目标的运行状况。

监控 Mixin

监控 Mixin 是一种使用 Jsonnet 数据模板语言以可配置且可扩展的方式将应用程序的常用警报、规则和仪表盘捆绑在一起的方式。cert-manager 监控 Mixin 可在此处找到 https://gitlab.com/uneeq-oss/cert-manager-mixin。有关用法的文档可在 cert-manager-mixin 项目中找到。