介绍一个小工具:SSL-exporter

Kubeadm 安装时的证书有效期设置为 1 年,虽说有 sealos 这样的不知名安装器以及各种方案来更新证书,但是对于像我一样经常跟不知来源的 Kubernetes 集群打交道的人来说,这个有效期就是达摩什么的利剑,不一定什么时候会砍到脖子上。如果能用 Prometheus 对证书有效期进行监控或者告警,就能更好地保护好自己的脖子了,ssl-exporter 就是这么个有趣的项目。

ssl-exporter 是个 Prometheus Exporter,能提供多种针对 SSL 的检测手段,包括:https 证书生效/失效时间、文件证书生效/失效时间,OCSP 等相关指标。下面用 API Server 证书检测来验证这一功能:

首先进行部署:

apiVersion: v1
kind: Service
metadata:
  labels:
    name: ssl-exporter
  name: ssl-exporter
spec:
  ports:
    - name: ssl-exporter
      protocol: TCP
      port: 9219
      targetPort: 9219
  selector:
    app: ssl-exporter
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ssl-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ssl-exporter
  template:
    metadata:
      name: ssl-exporter
      labels:
        app: ssl-exporter
    spec:
      initContainers:
        # Install kube ca cert as a root CA
        - name: ca
          image: alpine
          command:
            - sh
            - -c
            - |
              set -e
              apk add --update ca-certificates
              cp /var/run/secrets/kubernetes.io/serviceaccount/ca.crt /usr/local/share/ca-certificates/kube-ca.crt
              update-ca-certificates
              cp /etc/ssl/certs/* /ssl-certs
          volumeMounts:
            - name: ssl-certs
              mountPath: /ssl-certs
      containers:
        - name: ssl-exporter
          image: ribbybibby/ssl-exporter:v0.6.0
          ports:
            - name: tcp
              containerPort: 9219
          volumeMounts:
            - name: ssl-certs
              mountPath: /etc/ssl/certs
      volumes:
        - name: ssl-certs
          emptyDir: {}

上面的 YAML 部署了一个 Deployment 和 Service,在 9219 端口上提供 Exporter 服务。

接下来在 Prometheus 中配置一下抓取 Kubernetes 服务的内容:

- job_name: ssl-exporter
  metrics_path: /probe
  static_configs:
  - targets:
    - kubernetes.default.svc:443
  relabel_configs:
  - source_labels: [__address__]
    target_label: __param_target
  - source_labels: [__param_target]
    target_label: instance
  - target_label: __address__
    replacement: ssl-exporter:9219

接下来就可以进行查询了,查询语句:(ssl_cert_not_after-time())/3600/24,这个表达式查询各个目标的过期时间和当前时间的差。执行查询获取到过期天数,查询结果是 349 天。同样的表达式,复制到 Alertmanager 中,就可以及时的获取到证书的过期时间了。

相关链接

  • ssl-exporter:https://github.com/ribbybibby/ssl_exporter
  • ssl-exporter 示例部署和配置:https://github.com/ribbybibby/ssl_exporter/issues/12#issuecomment-562966945
  • sealos:https://github.com/fanux/sealos
Avatar
崔秀龙

简单,是大师的责任;我们凡夫俗子,能做到清楚就很不容易了。

comments powered by Disqus
下一页
上一页