Kubernetes: expired certificate

前端 未结 4 1677
-上瘾入骨i
-上瘾入骨i 2020-12-02 21:20

Our Kubernetes 1.6 cluster had certificates generated when the cluster was built on April 13th, 2017.

On December 13th, 2017, our cluster was upgraded to version 1.8

相关标签:
4条回答
  • 2020-12-02 21:55

    This topic is also discussed in:

    • https://github.com/kubernetes/kubeadm/issues/581
      • after 1.15 kubeadm upgrade automatically will renewal the certificates for you!
      • also 1.15 added a command to check cert expiration in kubeadm
    • Renew kubernetes pki after expired

    Kubernetes v1.15 provides docs for "Certificate Management with kubeadm":

    • https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
    • Check certificate expiration:
    kubeadm alpha certs check-expiration
    
    • Automatic certificate renewal:
      • kubeadm renews all the certificates during control plane upgrade.
    • Manual certificate renewal:
      • You can renew your certificates manually at any time with the kubeadm alpha certs renew command.
      • This command performs the renewal using CA (or front-proxy-CA) certificate and key stored in /etc/kubernetes/pki.

    For Kubernetes v1.14 I find this procedure the most helpful:

    • https://stackoverflow.com/a/56334732/1147487
    • backup and re-generate all certs:
    $ 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>
    
    • backup and re-generate all kubeconfig files:
    $ cd /etc/kubernetes/
    $ mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/
    $ kubeadm init phase kubeconfig all
    $ reboot
    
    • copy new admin.conf:
    $ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    
    0 讨论(0)
  • 2020-12-02 22:01

    I think you need re-generate the apiserver certificate /etc/kubernetes/pki/apiserver.crt you can view current expire date like this.

    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
    

    Here is the steps I used to regenerate the certificates on v1.11.5 cluster. compiled steps from here https://github.com/kubernetes/kubeadm/issues/581


    to check all certificate expire date:

    find /etc/kubernetes/pki/ -type f -name "*.crt" -print|egrep -v 'ca.crt$'|xargs -L 1 -t  -i bash -c 'openssl x509  -noout -text -in {}|grep After'
    

    Renew certificate on Master node.

    *) Renew certificate

    mv /etc/kubernetes/pki/apiserver.key /etc/kubernetes/pki/apiserver.key.old
    mv /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.crt.old
    mv /etc/kubernetes/pki/apiserver-kubelet-client.crt /etc/kubernetes/pki/apiserver-kubelet-client.crt.old
    mv /etc/kubernetes/pki/apiserver-kubelet-client.key /etc/kubernetes/pki/apiserver-kubelet-client.key.old
    mv /etc/kubernetes/pki/front-proxy-client.crt /etc/kubernetes/pki/front-proxy-client.crt.old
    mv /etc/kubernetes/pki/front-proxy-client.key /etc/kubernetes/pki/front-proxy-client.key.old
    
    
    kubeadm alpha phase certs apiserver  --config /root/kubeadm-kubetest.yaml
    kubeadm alpha phase certs apiserver-kubelet-client
    kubeadm alpha phase certs front-proxy-client
    
    mv /etc/kubernetes/pki/apiserver-etcd-client.crt /etc/kubernetes/pki/apiserver-etcd-client.crt.old
    mv /etc/kubernetes/pki/apiserver-etcd-client.key /etc/kubernetes/pki/apiserver-etcd-client.key.old
    kubeadm alpha phase certs  apiserver-etcd-client
    
    
    mv /etc/kubernetes/pki/etcd/server.crt /etc/kubernetes/pki/etcd/server.crt.old
    mv /etc/kubernetes/pki/etcd/server.key /etc/kubernetes/pki/etcd/server.key.old
    kubeadm alpha phase certs  etcd-server --config /root/kubeadm-kubetest.yaml
    
    mv /etc/kubernetes/pki/etcd/healthcheck-client.crt /etc/kubernetes/pki/etcd/healthcheck-client.crt.old
    mv /etc/kubernetes/pki/etcd/healthcheck-client.key /etc/kubernetes/pki/etcd/healthcheck-client.key.old
    kubeadm alpha phase certs  etcd-healthcheck-client --config /root/kubeadm-kubetest.yaml
    
    
    mv /etc/kubernetes/pki/etcd/peer.crt /etc/kubernetes/pki/etcd/peert.crt.old
    mv /etc/kubernetes/pki/etcd/peer.key /etc/kubernetes/pki/etcd/peer.key.old
    kubeadm alpha phase certs  etcd-peer --config /root/kubeadm-kubetest.yaml
    
    *)  Backup old configuration files
    mv /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.old
    mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.old
    mv /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.old
    mv /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.old
    
    kubeadm alpha phase kubeconfig all  --config /root/kubeadm-kubetest.yaml
    
    mv $HOME/.kube/config .$HOMEkube/config.old
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    chmod 777 $HOME/.kube/config
    export KUBECONFIG=.kube/config
    

    Reboot the node and check the logs for etcd, kubeapi and kubelet.

    Note: Remember to update your CI/CD job kubeconfig file. If you’re using helm command test that also.

    0 讨论(0)
  • 2020-12-02 22:05

    On k8s 1.7 I faced a similar problem (x509 expired error included inside /var/log/kube-apiserver.log) and could not find any certificate expired. We decided to restart only the apiserver docker on the master node. It resolved the problem.

    $ 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
    $ 
    
    0 讨论(0)
  • 2020-12-02 22:07

    Each node within the Kubernetes cluster contains a config file for running kubelet ... /etc/kubernetes/kubelet.conf ... and this file is auto-generated by kubeadm. During this auto-generation, kubeadm uses /etc/kubernetes/ca.key to create a node-specific file, /etc/kubernetes/kubelet.conf, within which are two very important pieces ... client-certificate-data and client-key-data. My original thought process led me to believe that I needed to find the corresponding certificate file & key file, renew those files, convert both to base64, and use those values within kubelet.conf files across the cluster ... this thinking was not correct.

    Instead, the fix was to use kubeadm to regenerate kubectl.conf on all nodes, as well as admin.conf, controller-manager.conf, and scheduler.conf on the cluster's master node. You'll need /etc/kubernetes/pki/ca.key on each node in order for your config files to include valid data for client-certificate-data and client-key-data.

    Pro tip: make use of the --apiserver-advertise-address parameter to ensure your new config files contain the correct IP address of the node hosting the kube-apiserver service.

    0 讨论(0)
提交回复
热议问题