监控Kubernetes集群证书过期时间的三种方案
前言Kubernetes 中大量用到了证书, 比如 ca证书、以及 kubelet、apiserver、proxy、etcd等组件,还有 kubeconfig 文件。
如果证书过期,轻则无法登录 Kubernetes 集群,重则整个集群异常。
为了解决证书过期的问题,一般有以下几种方式:
[*]大幅延长证书有效期,短则 10年,长则 100 年;
[*]证书快过期是自动轮换,如 Rancher 的 K3s,RKE2 就采用这种方式;
[*]增加证书过期的监控,便于提早发现证书过期问题并人工介入
本次主要介绍关于 Kubernetes 集群证书过期的监控,这里提供 3 种监控方案:
[*]使用 Blackbox Exporter 通过 Probe 监控 Kubernetes apiserver 证书过期时间;
[*]使用 kube-prometheus-stack 通过 apiserver 和 kubelet 组件监控获取相关证书过期时间;
[*]使用 enix 的 x509-certificate-exporter监控集群所有node的 /etc/kubernetes/pki 和 /var/lib/kubelet 下的证书以及 kubeconfig 文件
方案一: 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, 如下:
https://img2023.cnblogs.com/other/3034537/202212/3034537-20221208104340630-1578950483.jpg
[*]重启 blackbox exporter: kubectl rollout restart deploy ...
[*]增加对 Kubernetes APIServer 内部端点https://kubernetes.default.svc.cluster.local/readyz的监控.
[*]如果你没有使用 Prometheus Operator, 使用的是原生的 Prometheus, 则需要修改 Prometheus 配置文件的 configmap 或 secret, 添加 scrape config, 示例如下:
https://img2023.cnblogs.com/other/3034537/202212/3034537-20221208104341371-532035668.png
[*]如果在使用 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 做示例了, 示例如下:
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()
页:
[1]