Kubernetes:过期的证书

时间:2018-04-17 19:01:08

标签: kubernetes x509certificate kubernetes-apiserver

我们的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.confapiserver-kubelet-client.crt]生成的证书在apiserver-kubelet-client.crt内的客户密钥,但继续看到上述错误。

尝试指向客户端证书& 12月13日{/etc/kubernetes/kubelet.confapiserver.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来说相对较新,设置此内容的绅士无法咨询......任何帮助都表示赞赏。感谢。

5 个答案:

答案 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.confcontroller-manager.confscheduler.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

我相信这是重新生成证书所需要做的:

  1. 使用现有私钥创建CSR。

    运行此命令并获取所有DNS。 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep DNS

    通过包含所有DNS

  2. 来创建CSR
    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
    
    1. 使用CA证书签署CSR请求。

      使用/etc/kubernetes/pki/ca.key文件对apiserver.csr进行签名并创建apiserver.crt

    2. 将新证书复制到/etc/kubernetes/pki/apiserver.crt位置。

    3. 重新启动API服务器以获取新服务器。
    4. 注意:   我自己没试过。在做任何事情之前备份现有证书。

      希望这有帮助。

答案 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在控制平面升级期间续订所有证书。
  • 手动证书续订:
    • 您可以随时使用kubeadm alpha certs renew命令手动续订证书。
    • 此命令使用存储在/ etc / kubernetes / pki中的CA(或front-proxy-CA)证书和密钥执行更新。

对于 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>
  • 备份并重新生成所有kubeconfig文件:
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,mv kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all
$ reboot
  • 复制新的admin.conf:
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config