我们的Kubernetes 1.6群集在2017年4月13日生成群集时生成了证书。
2017年12月13日,我们的群集升级到1.8版,并生成了新证书[显然,证书不完整]。
2018年4月13日,我们开始在我们的Kubernetes仪表板中看到api-server的消息:
[authentication.go:64] Unable to authenticate the request due to an error: [x509: certificate has expired or is not yet valid, x509: certificate has expired or is not yet valid]
尝试指向客户端证书& 12月13日[/etc/kubernetes/kubelet.conf
和apiserver-kubelet-client.crt
]生成的证书在apiserver-kubelet-client.crt
内的客户密钥,但继续看到上述错误。
尝试指向客户端证书& 12月13日{/etc/kubernetes/kubelet.conf
和apiserver.crt
生成的不同证书apiserver.crt
内的客户密钥(老实说我不明白这两组证书/密钥之间的差异,但继续看到上述错误。
尝试指向客户端证书& /etc/kubernetes/kubelet.conf
内不存在的文件中的客户端密钥,并且没有任何kube *服务会启动,/var/log/syslog
会抱怨:
Apr 17 17:50:08 kuber01 kubelet[2422]: W0417 17:50:08.181326 2422 server.go:381] invalid kubeconfig: invalid configuration: [unable to read client-cert /tmp/this/cert/does/not/exist.crt for system:node:node01 due to open /tmp/this/cert/does/not/exist.crt: no such file or directory, unable to read client-key /tmp/this/key/does/not/exist.key for system:node:node01 due to open /tmp/this/key/does/not/exist.key: no such file or directory]
有关如何克服此错误,甚至在更细粒度级别对其进行故障排除的任何建议?正在考虑根据https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/#cmd-phase-certs中的说明重新生成api-server(kubeadm alpha phase certs apiserver
)的证书......但不确定我是否会造成更多的伤害。
对Kubernetes来说相对较新,设置此内容的绅士无法咨询......任何帮助都表示赞赏。感谢。
答案 0 :(得分:5)
Kubernetes群集中的每个节点都包含用于运行 kubelet ... /etc/kubernetes/kubelet.conf
的配置文件...此文件由 kubeadm 自动生成。在此自动生成期间, kubeadm 使用/etc/kubernetes/ca.key
创建特定于节点的文件/etc/kubernetes/kubelet.conf
,其中有两个非常重要的文件... 客户端证书-data 和客户端密钥数据。我原来的思维过程让我相信我需要找到相应的证书文件&密钥文件,更新这些文件,将两者都转换为base64,并在群集中的kubelet.conf
个文件中使用这些值...这种想法不正确。
相反,修复方法是使用 kubeadm 在所有节点上重新生成kubectl.conf
,以及admin.conf
,controller-manager.conf
和scheduler.conf
在群集的主节点上。您需要在每个节点上/etc/kubernetes/pki/ca.key
,以便配置文件包含客户端证书数据和客户端密钥数据的有效数据。
专业提示:使用--apiserver-advertise-address
参数确保您的新配置文件包含托管 kube-apiserver 服务的节点的正确IP地址。
答案 1 :(得分:3)
我认为你需要重新生成apiserver证书/etc/kubernetes/pki/apiserver.crt
,你可以像这样查看当前的过期日期。
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
Not Before: Dec 20 14:32:00 2017 GMT
Not After : Dec 20 14:32:00 2018 GMT
我相信这是重新生成证书所需要做的:
使用现有私钥创建CSR。
运行此命令并获取所有DNS。 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep DNS
通过包含所有DNS
openssl req -new -sha256 \ -key /etc/kubernetes/pki/apiserver.key \ -days 36500 \ -subj "CN=kubernetes" \ -reqexts SAN \ -config <(cat /etc/pki/tls/openssl.cnf \ <(printf "\n[SAN]\nsubjectAltName=DNS:kubernetes,DNS:kubernetes.default,DNS:kubernetes.default.svc,DNS:kubernetes.default.svc.cluster.local")) \ -out apiserver.csr
使用CA证书签署CSR请求。
使用/etc/kubernetes/pki/ca.key
文件对apiserver.csr
进行签名并创建apiserver.crt
将新证书复制到/etc/kubernetes/pki/apiserver.crt位置。
注意: 我自己没试过。在做任何事情之前备份现有证书。
希望这有帮助。
答案 2 :(得分:2)
在k8s 1.7上,我遇到了类似的问题(/var/log/kube-apiserver.log中包含x509过期错误),并且找不到任何过期的证书。我们决定仅在主节点上重新启动apiserver泊坞窗。它解决了问题。
$ sudo docker ps -a | grep apiserver
af99f816c7ec gcr.io/google_containers/kube-apiserver@sha256:53b987e5a2932bdaff88497081b488e3b56af5b6a14891895b08703129477d85 "/bin/sh -c '/usr/loc" 15 months ago Up 19 hours k8s_kube-apiserver_kube-apiserver-ip-xxxxxc_0
40f3a18050c3 gcr.io/google_containers/pause-amd64:3.0 "/pause" 15 months ago Up 15 months k8s_POD_kube-apiserver-ip-xxxc_0
$ sudo docker restart af99f816c7ec
af99f816c7ec
$
答案 3 :(得分:0)
如果您已经更新了证书或它已自动更新,则必须在所有主节点上重新启动 kube-apiserver。
去大师那里找docker ps | grep -i kube-apiserver
用 docker kill
容器杀死它们并等待 10-15 秒它应该开始工作。
对我来说它解决了它。
答案 4 :(得分:-1)
在以下主题中也讨论了该主题:
Kubernetes v1.15 提供了“使用kubeadm进行证书管理”的文档:
kubeadm alpha certs check-expiration
kubeadm alpha certs renew
命令手动续订证书。对于 Kubernetes v1.14 ,我发现此过程最有用:
$ cd /etc/kubernetes/pki/
$ mv {apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front-proxy-client.crt,front-proxy-client.key,front-proxy-ca.key,apiserver-kubelet-client.key,apiserver.key,apiserver-etcd-client.crt} ~/
$ kubeadm init phase certs all --apiserver-advertise-address <IP>
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,mv kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all
$ reboot
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config