公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

前言

Kubernetes 中大量用到了证书, 比如 ca证书、以及 kubelet、apiserver、proxy、etcd等组件,还有 kubeconfig 文件。

如果证书过期,轻则无法登录 Kubernetes 集群,重则整个集群异常。

为了解决证书过期的问题,一般有以下几种方式:

1.大幅延长证书有效期,短则 10年,长则 100 年;2.证书快过期是自动轮换,如 Rancher 的 K3s,RKE2 就采用这种方式;3.增加证书过期的监控,便于提早发现证书过期问题并人工介入

本次主要介绍关于 Kubernetes 集群证书过期的监控,这里提供 3 种监控方案:

1.使用 Blackbox Exporter[1] 通过 Probe 监控 Kubernetes apiserver 证书过期时间;2.使用 kube-prometheus-stack[2] 通过 apiserver 和 kubelet 组件监控获取相关证书过期时间;3.使用 enix 的 x509-certificate-exporter[3]监控集群所有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 证书过期时间的监控.

配置步骤

1.调整 Blackbox Exporter 的配置, 增加 insecure_tls_verify: true, 如下:

调整 Blackbox Exporter 配置

2.重启 blackbox exporter: kubectl rollout restart deploy ...3.增加对 Kubernetes APIServer 内部端点https://kubernetes.default.svc.cluster.local/readyz的监控.1.如果你没有使用 Prometheus Operator, 使用的是原生的 Prometheus, 则需要修改 Prometheus 配置文件的 configmap 或 secret, 添加 scrape config, 示例如下:

Prometheus 增加 scrape config

2.如果在使用 Prometheus Operator, 则可以增加如下 Probe CRD, Prometheus Operator 会自动将其转换并 merge 到 Prometheus 中.

apiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:name: kubernetes-apiserver
spec:interval: 60smodule: http_2xxprober:path: /probeurl: monitor-prometheus-blackbox-exporter.default.svc.cluster.local:9115targets:staticConfig:static:- https://kubernetes.default.svc.cluster.local/readyz

最后, 可以增加 Prometheus 告警 Rule, 这里就直接用 Prometheus Operator 创建 PrometheusRule CRD 做示例了, 示例如下:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:name: prometheus-blackbox-exporter
spec:groups:- name: prometheus-blackbox-exporterrules:- alert: BlackboxSslCertificateWillExpireSoonexpr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30for: 0mlabels:severity: warning- alert: BlackboxSslCertificateWillExpireSoonexpr: probe_ssl_earliest_cert_expiry - time() < 86400 * 14for: 0mlabels:severity: critical- alert: BlackboxSslCertificateExpiredannotations:description: |-SSL certificate has expired alreadyVALUE = {{ $value }}LABELS = {{ $labels }}summary: SSL certificate expired (instance {{ $labels.instance }})expr: probe_ssl_earliest_cert_expiry - time() <= 0for: 0mlabels:severity: emergency

效果

Probe 查询证书过期时间

方案二: kube-prometheus-stack 通过 apiserver 和 kubelet 组件监控证书过期时间

这里可以参考我的文章:Prometheus Operator 与 kube-prometheus 之二 - 如何监控 1.23+ kubeadm 集群[4], 安装完成后, 开箱即用.

开箱即用内容包括:

1.抓取 apiserver 和 kubelet 指标;(即 serviceMonitor)2.配置证书过期时间的相关告警; (即 PrometheusRule)

这里用到的指标有:

1.apiserver1.apiserver_client_certificate_expiration_seconds_count2.apiserver_client_certificate_expiration_seconds_bucket2.kubelet1.kubelet_certificate_manager_client_expiration_renew_errors2.kubelet_server_expiration_renew_errors3.kubelet_certificate_manager_client_ttl_seconds4.kubelet_certificate_manager_server_ttl_seconds

监控效果

对应的 Prometheus 告警规则如下:

证书过期时间相关 PrometheusRule

方案三: 使用 enix 的 x509-certificate-exporter

监控手段

该 Exporter 是通过监控集群所有node的指定目录或 path 下的证书文件以及 kubeconfig 文件来获取证书信息.

如果是使用 kubeadm 搭建的 Kubernetes 集群, 则可以监控如下包含证书的文件和 kubeconfig:

watchFiles:
- /var/lib/kubelet/pki/kubelet-client-current.pem
- /etc/kubernetes/pki/apiserver.crt
- /etc/kubernetes/pki/apiserver-etcd-client.crt
- /etc/kubernetes/pki/apiserver-kubelet-client.crt
- /etc/kubernetes/pki/ca.crt
- /etc/kubernetes/pki/front-proxy-ca.crt
- /etc/kubernetes/pki/front-proxy-client.crt
- /etc/kubernetes/pki/etcd/ca.crt
- /etc/kubernetes/pki/etcd/healthcheck-client.crt
- /etc/kubernetes/pki/etcd/peer.crt
- /etc/kubernetes/pki/etcd/server.crt
watchKubeconfFiles:
- /etc/kubernetes/admin.conf
- /etc/kubernetes/controller-manager.conf
- /etc/kubernetes/scheduler.conf

安装配置

编辑 values.yaml:

kubeVersion: ''
extraLabels: {}
nameOverride: ''
fullnameOverride: ''
imagePullSecrets: []
image:registry: docker.iorepository: enix/x509-certificate-exportertag:pullPolicy: IfNotPresent
psp:create: false
rbac:create: truesecretsExporter:serviceAccountName:serviceAccountAnnotations: {}clusterRoleAnnotations: {}clusterRoleBindingAnnotations: {}hostPathsExporter:serviceAccountName:serviceAccountAnnotations: {}clusterRoleAnnotations: {}clusterRoleBindingAnnotations: {}
podExtraLabels: {}
podAnnotations: {}
exposePerCertificateErrorMetrics: false
exposeRelativeMetrics: false
metricLabelsFilterList: null
secretsExporter:enabled: truedebugMode: falsereplicas: 1restartPolicy: Alwaysstrategy: {}resources:limits:cpu: 200mmemory: 150Mirequests:cpu: 20mmemory: 20MinodeSelector: {}tolerations: []affinity: {}podExtraLabels: {}podAnnotations: {}podSecurityContext: {}securityContext:runAsUser: 65534runAsGroup: 65534readOnlyRootFilesystem: truecapabilities:drop:- ALLsecretTypes:- type: kubernetes.io/tlskey: tls.crtincludeNamespaces: []excludeNamespaces: []includeLabels: []excludeLabels: []cache:enabled: truemaxDuration: 300
hostPathsExporter:debugMode: falserestartPolicy: AlwaysupdateStrategy: {}resources:limits:cpu: 100mmemory: 40Mirequests:cpu: 10mmemory: 20MinodeSelector: {}tolerations: []affinity: {}podExtraLabels: {}podAnnotations: {}podSecurityContext: {}securityContext:runAsUser: 0runAsGroup: 0readOnlyRootFilesystem: truecapabilities:drop:- ALLwatchDirectories: []watchFiles: []watchKubeconfFiles: []daemonSets:cp:nodeSelector:node-role.kubernetes.io/master: ''tolerations:- effect: NoSchedulekey: node-role.kubernetes.io/masteroperator: ExistswatchFiles:- /var/lib/kubelet/pki/kubelet-client-current.pem- /etc/kubernetes/pki/apiserver.crt- /etc/kubernetes/pki/apiserver-etcd-client.crt- /etc/kubernetes/pki/apiserver-kubelet-client.crt- /etc/kubernetes/pki/ca.crt- /etc/kubernetes/pki/front-proxy-ca.crt- /etc/kubernetes/pki/front-proxy-client.crt- /etc/kubernetes/pki/etcd/ca.crt- /etc/kubernetes/pki/etcd/healthcheck-client.crt- /etc/kubernetes/pki/etcd/peer.crt- /etc/kubernetes/pki/etcd/server.crtwatchKubeconfFiles:- /etc/kubernetes/admin.conf- /etc/kubernetes/controller-manager.conf- /etc/kubernetes/scheduler.confnodes:watchFiles:- /var/lib/kubelet/pki/kubelet-client-current.pem- /etc/kubernetes/pki/ca.crt
rbacProxy:enabled: false
podListenPort: 9793
hostNetwork: false
service:create: trueport: 9793annotations: {}extraLabels: {}
prometheusServiceMonitor:create: truescrapeInterval: 60sscrapeTimeout: 30sextraLabels: {}relabelings: {}
prometheusPodMonitor:create: false
prometheusRules:create: truealertOnReadErrors: truereadErrorsSeverity: warningalertOnCertificateErrors: truecertificateErrorsSeverity: warningcertificateRenewalsSeverity: warningcertificateExpirationsSeverity: criticalwarningDaysLeft: 30criticalDaysLeft: 14extraLabels: {}alertExtraLabels: {}rulePrefix: ''disableBuiltinAlertGroup: falseextraAlertGroups: []
extraDeploy: []

通过 Helm Chart 安装:

helm repo add enix https://charts.enix.io
helm install x509-certificate-exporter enix/x509-certificate-exporter

通过这个 Helm Chart 也会自动安装:

•ServiceMonitor•PrometheusRule

其监控指标为:

x509_cert_not_after

监控效果

该 Exporter 还提供了一个比较花哨的 Grafana Dashboard, 如下:

x509 Exporter Grafana Dashboard

Alert Rules 如下:

x509 Exporter Prometheus Rule

总结

为了监控 Kubernetes 集群的证书过期时间, 我们提供了 3 种方案, 各有优劣:

1.使用 Blackbox Exporter[5] 通过 Probe 监控 Kubernetes apiserver 证书过期时间;1.优势: 实现简单;2.劣势: 只能监控 https 的证书;2.使用 kube-prometheus-stack[6] 通过 apiserver 和 kubelet 组件监控获取相关证书过期时间;1.优势: 开箱即用, 安装 kube-prometheus-stack 后无需额外安装其他 exporter2.劣势: 只能监控 apiserver 和 kubelet 的证书;3.使用 enix 的 x509-certificate-exporter[7]监控集群所有node的 /etc/kubernetes/pki 和 /var/lib/kubelet 下的证书以及 kubeconfig 文件1.优势: 可以监控所有 node, 所有 kubeconfig 文件, 以及 所有 tls 格式的 secret 证书, 如果要监控 Kubernetes 集群以外的证书, 也可以如法炮制; 范围广而全;2.需要额外安装: x509-certificate-exporter, 对应有 1 个 Deployment 和 多个 DaemonSet, 对 Kubernetes 集群的资源消耗不少.

可以根据您的实际情况灵活进行选择.

三种监控 Kubernetes 集群证书过期方案相关推荐

  1. kubernetes集群证书过期处理

    1.kubernetes集群证书过期: 操作命令: # kubectl get nodes Unable to connect to the server: x509: certificate has ...

  2. 巧用 Prometheus 监控 Kubernetes 集群所有组件的证书

    KubeSphere 虽然提供了运维友好的向导式操作界面,简化了 Kubernetes 的运维操作,但它还是建立在底层 Kubernetes 之上的,Kubernetes 默认的证书有效期都是一年,即 ...

  3. 使用Prometheus监控kubernetes集群

    一键安装(网络可访问quay.io): kubectl apply --filename https://raw.githubusercontent.com/giantswarm/kubernetes ...

  4. Prometheus-使用Prometheus监控Kubernetes集群

      Prometheus是一个集数据收集存储.数据查询和数据图表显示于一身的开源监控组件.本文主要讲解如何搭建Prometheus,并使用它监控Kubernetes集群. 准备工作 Kubernete ...

  5. 使用ssl_exporter监控K8S集群证书

    使用kubeadm搭建的集群默认证书有效期是1年,续费证书其实是一件很快的事情.但是就怕出事了才发现,毕竟作为专业搬砖工程师,每天都很忙的. 鉴于此,监控集群证书有效期是一件不得不做的事情.Prome ...

  6. 如何处理 Kubeadm 搭建的集群证书过期问题

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  7. Kubernetes集群高可用方案

    Kubernetes作为容器应用的管理中心,通过对Pod的数量进行监控,并且根据主机或容器失效的状态将新的Pod调度到其他Node上,实现了应用层的高可用性.针对Kubernetes集群,高可用性还应 ...

  8. 【kubernetes】公有云上的kubernetes集群自动伸缩方案

    kubernetes集群自动伸缩 这里的集群自动伸缩指的是根据集群的资源使用状况,自动的调整集群节点的数目,目的是充分利用集群资源,节省成本.主要应用下面两个场景: 集群资源不足,导致pod部署失败, ...

  9. 史上最快最新最全倾斜摄影(ContextCapture)空三/建模、单机/集群硬件配置方案2018

    主要内容 本文结合最新计算处理技术,针对倾斜摄影的空三计算.三维建模应用,给出目前最快.最高性价比的台式工作站.移动工作站.并行集群的多种配置方案(截止2018年9月) 1. 相关机型介绍 2. 硬件 ...

最新文章

  1. 使用kubectl delete pods xxx删除对应的pod,提示删除成功,但是立马又会生成一个。为何?
  2. Graph cut [转]
  3. (Redis设计与实现-6) 频道的订阅与退订
  4. Organizational Data assignment block里value help的determine逻辑
  5. vue弹出alert_vue+webpack 实现简单的弹窗(alert)组件
  6. C++ 数据指针(-)
  7. MyLibrary --Qt + sqlite 图书馆管理系统
  8. 电脑版微信发消息转圈圈
  9. CPLEX仿真能力可行性分析
  10. Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法
  11. IOS Websocket (一) Starscream实现Websocket通讯
  12. 关于VLAN和VXLAN的理解
  13. OSChina 周五乱弹 —— 程序猿真是令人感到担忧!
  14. 银河麒麟服务器操作系统(Kylin) V10 arm64 飞腾/鲲鹏操作系统下载
  15. SitePoint播客#76:邪恶的WordPress主题
  16. Linux基础命令01(ls , cd,clear,cat等)
  17. dp主机_怎样设置显示器DP接口信号优先?
  18. ISCC2022--Writeup
  19. 从最硬核买家秀,读懂华为数据中心网络的智能纪元
  20. 数据挖掘BUC算法计算冰山立方体的python实现

热门文章

  1. php判断百度ua展示不同页面,通过UA或反查IP两种方法识别百度蜘蛛【官方说法】...
  2. 【愚公系列】2022年02月 微信小程序-Component组件的扩展
  3. 必不可少的数学基础-单调有界定理
  4. Android基础入门教程——1.1 背景相关与系统架构分析
  5. seo教程电子书(SEO搜索引擎优化基础教程)
  6. 每晚定时重启IIS和数据库服务可节省服务器资源
  7. 脱贫摘帽攻关年,“拼多多们”扎进三农
  8. UDK 脚本编译运行
  9. 安史之乱后大唐是怎样一步步衰败的
  10. D. Treasure Island