web-dev-qa-db-fra.com

Kubernetes: certificat expiré

Notre cluster Kubernetes 1.6 avait des certificats générés lors de la génération du cluster le 13 avril 2017.

Le 13 décembre 2017, notre cluster a été mis à niveau vers la version 1.8 et de nouveaux certificats ont été générés [apparemment, un ensemble incomplet de certificats].

Le 13 avril 2018, nous avons commencé à voir ce message dans notre tableau de bord Kubernetes pour 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]

Essayé certificat client & clé client dans /etc/kubernetes/kubelet.conf aux certificats générés le 13 décembre [apiserver-kubelet-client.crt et apiserver-kubelet-client.crt], mais continuez à voir l'erreur ci-dessus.

Essayé certificat client & clé client dans /etc/kubernetes/kubelet.conf à différents certificats générés le 13 décembre [apiserver.crt et apiserver.crt] (Honnêtement, je ne comprends pas la différence entre ces 2 jeux de certificats/clés), mais continuez à voir l'erreur ci-dessus.

Essayé certificat client & clé client dans /etc/kubernetes/kubelet.conf sur des fichiers inexistants, et aucun des services kube * ne démarrerait, avec /var/log/syslog se plaindre:

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]

Des conseils sur la façon de surmonter cette erreur, ou même de la résoudre à un niveau plus granulaire? Envisageait de régénérer des certificats pour api-server (kubeadm alpha phase certs apiserver), sur la base des instructions contenues dans https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/#cmd-phase-certs ... mais je ne sais pas si Je ferais plus de dégâts.

Relativement nouveau pour Kubernetes, et le monsieur qui a mis cela en place n'est pas disponible pour consultation ... toute aide est appréciée. Merci.

7
NoobSkywalker

Chaque nœud du cluster Kubernetes contient un fichier de configuration pour l'exécution kubelet ... /etc/kubernetes/kubelet.conf ... et ce fichier est généré automatiquement par kubeadm. Au cours de cette génération automatique, kubeadm utilise /etc/kubernetes/ca.key pour créer un fichier spécifique au nœud, /etc/kubernetes/kubelet.conf, dans lequel se trouvent deux pièces très importantes ... client-certificate-data et client-key-data. Mon processus de réflexion original m'a amené à croire que je devais trouver le fichier de certificat et le fichier de clés correspondants, renouveler ces fichiers, les convertir en base64 et utiliser ces valeurs dans kubelet.conf fichiers à travers le cluster ... cette pensée n'était pas correcte.

Au lieu de cela, le correctif consistait à utiliser kubeadm pour régénérer kubectl.conf sur tous les nœuds, ainsi que admin.conf, controller-manager.conf, et scheduler.conf sur le nœud maître du cluster. Tu auras besoin /etc/kubernetes/pki/ca.key sur chaque nœud afin que vos fichiers de configuration incluent des données valides pour client-certificate-data et client-key-data.

Conseil de pro: utilisez le --apiserver-advertise-address paramètre pour vous assurer que vos nouveaux fichiers de configuration contiennent l'adresse IP correcte du nœud hébergeant le service kube-apiserver.

9
NoobSkywalker

Je pense que vous devez recréer le certificat apiserver /etc/kubernetes/pki/apiserver.crt vous pouvez voir la date d'expiration actuelle comme ceci.

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

Voici les étapes que j'ai utilisées pour régénérer les certificats sur le cluster v1.11.5. étapes compilées à partir d'ici https://github.com/kubernetes/kubeadm/issues/581


pour vérifier toutes les dates d'expiration des certificats:

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'

Renouveler le certificat sur le nœud Maser.

*) Renouveler le certificat

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

Redémarrez le nœud et vérifiez les journaux pour etcd, kubeapi et kubelet.

Remarque: N'oubliez pas de mettre à jour votre fichier kubeconfig de travail CI/CD. Si vous utilisez également le test de la commande de barre.

4
sfgroups

Sur k8s 1.7, j'ai rencontré un problème similaire (erreur expirée x509 incluse dans /var/log/kube-apiserver.log) et je n'ai trouvé aucun certificat expiré. Nous avons décidé de redémarrer uniquement le docker apiserver sur le nœud maître. Cela a résolu le problème.

$ 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
user3541649