prometheus rule
客户端访问 APIServer 证书快过期问题
KubeClientCertificateExpiration (1 active)
name: KubeClientCertificateExpiration
expr: apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0 and on(job) histogram_quantile(0.01, sum by(job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 604800
labels:
severity: warning
annotations:
description: A client certificate used to authenticate to the apiserver is expiring in less than 7.0 days.
runbook_url: https://runbooks.prometheus-operator.dev/runbooks/kubernetes/kubeclientcertificateexpiration
summary: Client certificate is about to expire.
今天突然报警k8s 证书剩余时间少于7天 明明前几天刚更新了证书呢
使用kubeadm certs check-expiration 查看所有证书发现全部都有1年+时间
查看prometheus 结果很明显了 就是定位不出那个证书过期了
百度无果
google也这只发现了一篇同样问题的文章 没有解决方案。
我也一度怀疑这个指标是否有问题apiserver_client_certificate_expiration_seconds_count
值是seconds,count 应该就会越来越大吧 哪有离到期时间越来越远的呢
咨询了朋友 朋友发给了我这个 并且让我删除告警
最后研究下来发现查询的结果是这样出来的这里有去研究学习了prometheus语法
开始排查
kubeadm certs check-expiration 没问题就代表admin所管理的证书都没问题
但还是全扫了一遍
for crt in $(find /etc/kubernetes/pki/ -name "*.crt"); do openssl x509 -in $crt -noout -dates; done for crt in $(find /etc/kubernetes/pki/ -name "*.pem"); do openssl x509 -in $crt -noout -dates; done for crt in $(find /etc/kubernetes/ssl/ -name "*.pem"); do openssl x509 -in $crt -noout -dates; done for crt in $(find /etc/kubernetes/ssl/ -name "*.crt"); do openssl x509 -in $crt -noout -dates; done for crt in $(find /etc/kubernetes/pki/ -name "*.pem"|grep -v "key"); do openssl x509 -in $crt -noout -dates; done
CERT_DIR=${CERT_DIR:-/etc/kubernetes/pki}
for i in $(find $CERT_DIR -name '*.crt' -o -name '*.pem'); do
echo $i
openssl x509 -enddate -in $i -noout
done
for f in $(ls /etc/kubernetes/{admin,controller-manager,scheduler}.conf); do
echo $f
kubectl --kubeconfig $f config view --raw -o jsonpath='{range .users[*]}{.user.client-certificate-data}{end}' | base64 -d | openssl x509 -enddate -noout
done
k8s的 secrets也全扫了 临时写的太low这里就不贴出来了
最后连node的kubectl证书也都扫了依旧没发现问题
心想再去更新一下kube-api证书怎么样
看文档的时候发现有一个证书cp操作
我们运维团队都用的mac 由于k8s集群比较多 都是把证书文件拷到自己电脑上连接的
这才想到本地的证书没有更新,5分钟内不连就会恢复告警,连了就会记录到集群触发证书快过期告警
更新自己电脑证书后就此问题解决。
后续的解决方案, 目前没找到k8s能查看客户端证书的方法不过既然是通过api通信的可以使用抓包工具查看那个客户端在连接证书时间等。
tcpdump "tcp port 6443 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x16) && (tcp[((tcp[12] & 0xf0) >>2)+5] = 0x01)" -w client-hello.pcap
就此告一段落
踩坑记录



