x509: certificate has expired or is not yet valid
当对一正常运行中的k8s集群某个node kubelet重启后,发现kubelet启动失败,报错为
E1224 13:55:55.339147 46610 reflector.go:125] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:47: Failed to list *v1.Pod: Get https://192.168.177.224:6443/api/v1/pods?fieldSelector=spec.nodeName%3Dtes
t-node1&limit=500&resourceVersion=0: x509: certificate has expired or is not yet valid
原因
k8s证书已过期,可通过下述命令查看证书详细信息
[root@test-node2 k8s]# openssl x509 -in ca.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=192.168.177.224@1544090516
Validity
Not Before: Dec 6 10:01:56 2018 GMT
Not After : Dec 6 10:01:56 2019 GMT
Subject: CN=192.168.177.224@1544090516
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d3:8e:76:00:74:70:97:10:87:f2:64:b8:8d:46:
15:37:e7:0d:9f:64:2c:85:87:40:53:fd:c7:c6:62:
03:55:c4:2c:06:df:ca:34:94:a0:ae:d2:5a:0a:7e:
6b:6e:fc:a3:92:2c:dd:72:41:60:60:ec:3f:9c:04:
ef:26:da:b3:af:68:5d:58:60:7a:60:5a:6d:6b:22:
ed:89:4b:af:dd:5e:06:60:6b:93:1a:66:50:b1:26:
20:83:46:e0:ff:0b:aa:b9:76:ff:b2:4e:6a:a9:ee:
05:e9:d2:82:05:ba:11:9d:6e:f9:93:ae:9a:ef:8a:
0e:ae:30:5a:5a:b5:b7:d7:20:33:1c:85:a9:47:02:
e4:1e:0e:54:ea:4c:ec:ba:34:1c:75:cf:71:29:dc:
b4:43:9d:27:f7:f4:68:21:cb:89:c4:aa:1d:33:28:
f2:a9:82:52:36:09:de:8f:75:1e:73:97:76:8c:25:
82:90:6a:e7:78:b8:19:32:9a:99:65:4e:4a:e9:11:
cd:58:a3:dc:4f:9d:8f:63:63:00:24:06:fd:ce:07:
c9:3d:8c:84:55:7b:31:49:81:a0:ca:3e:b2:06:e3:
bd:07:4a:f2:b7:c3:4c:d2:92:45:1a:9d:56:38:7e:
ab:15:31:16:85:fb:d1:41:3e:89:31:45:cc:d1:80:
81:3f
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment, Certificate Sign
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Subject Alternative Name:
DNS:kubernetes.default.svc, DNS:kubernetes.default, DNS:kubernetes, DNS:localhost, IP Address:192.168.177.224, IP Address:169.169.0.1
Signature Algorithm: sha256WithRSAEncryption
99:cd:d4:8a:54:d4:63:69:af:20:7e:1b:dc:03:a9:eb:14:99:
5a:50:15:6d:e7:6d:42:60:53:7d:41:87:29:a0:7a:34:61:21:
60:e7:18:f3:25:83:75:f7:53:ba:d9:03:05:f5:1c:93:ec:53:
76:6d:7c:50:fa:1a:ce:2a:31:f5:26:1d:03:2c:63:2d:9d:e9:
ab:1d:d1:61:8f:e0:46:f6:5c:cc:8d:93:70:dd:24:ee:fa:90:
e9:29:cb:88:61:e5:99:0d:87:0b:b5:55:91:cc:6c:aa:d8:e3:
1b:f2:d3:4e:9a:59:fe:ce:7e:a2:75:e4:73:b8:1f:e5:63:ae:
55:25:37:82:15:b3:5f:e7:14:f7:37:a4:ed:ca:a8:f7:0c:b7:
dc:9c:de:a0:6c:00:fa:00:b7:fe:94:14:9d:d8:91:7b:d4:1b:
50:89:2a:ab:92:9b:1b:3d:b0:cb:83:55:b1:47:ff:ce:5e:a8:
ef:73:8d:0b:ff:1d:ff:4c:8d:fc:e1:e8:30:27:89:d4:39:78:
2d:a8:c7:06:68:e0:57:bb:67:3c:c0:6b:55:02:3b:75:c8:2c:
37:ff:93:08:d1:a5:7b:f1:93:ec:7a:cd:c4:1f:39:cc:4b:65:
b4:02:3a:ae:ad:06:a3:68:5c:d1:c0:77:89:a3:c1:0b:00:6a:
bb:ba:99:cb
解决方案,升级证书
- 删除服务端证书
rm /var/run/kubernetes/apiserver.crt
rm /var/run/kubernetes/apiserver.key
- 重启apiserver
systemctl restart kube-apiserver
重启后,发现重新生成了服务端证书,并且证书有效
- 查看账号对应的证书
kubectl get secret kube-node-token-wz588 -o json
cat ca.source |base64 -d > ca.crt
- 替换kube-config中的crt
token不变
启动node节点的 kubelet 报以下错误
[invalid bearer token, [invalid bearer token, crypto/rsa: verification error]]
这个问题是在master节点生成了不同的 server.key 引起,由于 server.key 需要在 apiserver 启动时指定,在生成 service account 时会采用公钥认证。
在pod创建后,默认会在目录/var/run/secrets/kubernetes.io/serviceaccount/生成token及 ca.crt 等
解决方案,然后替换 token及crt文件
删除sa 重新创建