前言
Kubernetes 中大量用到了证书, 比如 ca证书、以及 kubelet、apiserver、proxy、etcd等组件,还有 kubeconfig 文件。
如果证书过期,轻则无法登录 Kubernetes 集群,重则整个集群异常。
为了解决证书过期的问题,一般有以下几种方式:
- 大幅延长证书有效期,短则 10年,长则 100 年;
- 证书快过期是自动轮换,如 Rancher 的 K3s,RKE2 就采用这种方式;
- 增加证书过期的监控,便于提早发现证书过期问题并人工介入
本次主要介绍关于 Kubernetes 集群证书过期的监控,这里提供 3 种监控方案:
方案一: Blackbox Exporter 监控 Kubernetes apiserver 证书过期时间
Blackbox Exporter 用于探测 HTTPS、HTTP、TCP、DNS、ICMP 和 grpc 等 Endpoint。在你定义 Endpoint 后,Blackbox Exporter 会生成指标,可以使用 Grafana 等工具进行可视化。Blackbox Exporter 最重要的功能之一是测量 Endpoint 的可用性。
当然, Blackbox Exporter 探测 HTTPS 后就可以获取到证书的相关信息, 就是利用这种方式实现对 Kubernetes apiserver 证书过期时间的监控.
配置步骤
- 调整 Blackbox Exporter 的配置, 增加 insecure_tls_verify: true, 如下:
- 重启 blackbox exporter: kubectl rollout restart deploy ...
- 增加对 Kubernetes APIServer 内部端点https://kubernetes.default.svc.cluster.local/readyz的监控.
- 如果你没有使用 Prometheus Operator, 使用的是原生的 Prometheus, 则需要修改 Prometheus 配置文件的 configmap 或 secret, 添加 scrape config, 示例如下:
- 如果在使用 Prometheus Operator, 则可以增加如下 Probe CRD, Prometheus Operator 会自动将其转换并 merge 到 Prometheus 中.
- apiVersion: monitoring.coreos.com/v1
- kind: Probe
- metadata:
- name: kubernetes-apiserver
- spec:
- interval: 60s
- module: http_2xx
- prober:
- path: /probe
- url: monitor-prometheus-blackbox-exporter.default.svc.cluster.local:9115
- targets:
- staticConfig:
- static:
- - https://kubernetes.default.svc.cluster.local/readyz
复制代码 最后, 可以增加 Prometheus 告警 Rule, 这里就直接用 Prometheus Operator 创建 PrometheusRule CRD 做示例了, 示例如下:
[code]apiVersion: monitoring.coreos.com/v1kind: PrometheusRulemetadata: name: prometheus-blackbox-exporterspec: groups: - name: prometheus-blackbox-exporter rules: - alert: BlackboxSslCertificateWillExpireSoon expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30 for: 0m labels: severity: warning - alert: BlackboxSslCertificateWillExpireSoon expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 14 for: 0m labels: severity: critical - alert: BlackboxSslCertificateExpired annotations: description: |- SSL certificate has expired already VALUE = {{ $value }} LABELS = {{ $labels }} summary: SSL certificate expired (instance {{ $labels.instance }}) expr: probe_ssl_earliest_cert_expiry - time() |