Questo documento descrive come rinnovare manualmente i certificati scaduti per il tuo Google Distributed Cloud. I certificati TLS (Transport Layer Security) sono utilizzati da i componenti del piano di controllo di Google Distributed Cloud. Quando questi certificati scadono, la capacità di gestire i carichi di lavoro e i cicli di vita dei cluster viene bloccata fino al rinnovo dei certificati. Per ulteriori informazioni sull'impatto certificati scaduti, consulta Scadenza del certificato:
Per impostazione predefinita, i certificati TLS hanno una scadenza di 1 anno. Google Distributed Cloud rinnova questi certificati automaticamente durante il cluster upgrade e quando Ruota le autorità di certificazione. I nostri suggerimenti eseguire regolarmente l'upgrade dei cluster per mantenerli sicuri, supportati impediscono la scadenza dei certificati TLS.
Se hai bisogno di ulteriore assistenza, contatta Assistenza clienti Google Cloud.Errori causati dalla scadenza del certificato
Se i certificati TLS del cluster scadono, i controller principali non possono stabilire connessioni TLS con il server API Kubernetes. Questa mancanza di di connettività causa i seguenti errori:
Impossibile connettersi al server: x509
Quando utilizzi
kubectl
per ottenere i nodi del cluster, la risposta include una errore che indica che i certificati sono scaduti, come nell'esempio seguente :Unable to connect to the server: x509: certificate has expired or is not yet valid
Impossibile connettersi: x509 o connessione rifiutata
I certificati scaduti bloccano l'accesso al cluster etcd, in quanto i peer non possono comunicare tra loro. I log etcd potrebbero contenere voci di errore quali le seguenti:
W | rafthttp: health check for peer 6221a1d241bb2d0a could not connect: x509: certificate has expired or is not yet valid I | embed: rejected connection from "10.200.0.4:46108" (error "remote error: tls: bad certificate", ServerName "")
Controllare le date di scadenza dei certificati
Per controllare le date di scadenza dei certificati, segui questi passaggi su ogni nodo del piano di controllo:
Accedi a una delle macchine nodo del piano di controllo ed esegui questo comando :
sudo kubeadm certs check-expiration
L'output comando elenca i certificati creati da
kubeadm
per i componenti del piano di controllo e la relativa scadenza, come mostrato nell'esempio seguente :CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Nov 28, 2021 19:09 UTC 53m no apiserver Nov 28, 2021 19:09 UTC 53m ca no apiserver-etcd-client Nov 28, 2021 19:09 UTC 53m etcd-ca no apiserver-kubelet-client Nov 28, 2021 19:09 UTC 53m ca no controller-manager.conf Nov 28, 2021 19:09 UTC 53m no etcd-healthcheck-client Nov 28, 2021 19:09 UTC 53m etcd-ca no etcd-peer Nov 28, 2021 19:09 UTC 53m etcd-ca no etcd-server Nov 28, 2021 19:09 UTC 53m etcd-ca no front-proxy-client Nov 28, 2021 19:09 UTC 53m front-proxy-ca no scheduler.conf Nov 28, 2021 19:09 UTC 53m no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca Nov 26, 2031 18:06 UTC 9y no etcd-ca Nov 26, 2031 18:06 UTC 9y no front-proxy-ca Nov 26, 2031 18:06 UTC 9y no
Esegui questo comando per controllare le scadenze per
kubelet
certificati:sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text | grep Validity -A2 sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -text | grep Validity -A2
La risposta per ogni comando è simile al seguente output di esempio:
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMT
Se il bootstrapping di tutti i nodi del piano di controllo è stato eseguito contemporaneamente, di scadenza del certificato sono a pochi minuti l'uno dall'altro. Questo tempo si applica a tutti i nodi del piano di controllo. Puoi verificare di scadenza eseguendo i comandi precedenti su ciascun nodo del piano di controllo.
Esegui il comando seguente sulla workstation di amministrazione per controllare la scadenza ora del certificato client nel file kubeconfig del cluster:
grep 'client-certificate-data' KUBECONFIG_PATH | \ awk '{print $2}' | base64 -d | openssl x509 -text | grep Validity -A2
La risposta è simile al seguente output di esempio:
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMT
Esegui questo comando per controllare la scadenza del certificato kubeconfig nel cluster di amministrazione:
kubectl get secret/CLUSTER_NAME-kubeconfig -n CLUSTER_NAMESPACE -o --kubeconfig=ADMIN_KUBECONFIG jsonpath='{.data.value}' | base64 --decode | grep client-certificate-data | awk '{print $2}' | base64 -d | openssl x509 -text | grep Validity -A2
La risposta è simile al seguente output di esempio:
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMT
il certificato kubeconfig nel cluster di amministrazione e il certificato nel il file kubeconfig sulla workstation di amministrazione è lo stesso. Pertanto, per questo comando e il comando del passaggio precedente deve corrispondere.
Rinnova i certificati manualmente
Per rinnovare manualmente i certificati TLS per un cluster, segui le istruzioni fornite nella le sezioni seguenti.
Rinnova i certificati su ciascun nodo del piano di controllo
Esegui questi passaggi su ciascun nodo del piano di controllo del cluster interessato:
Esegui il backup della cartella
/etc/kubernetes
.Esegui questo comando
kubeadm
per rinnovare tutti i certificati. La rinnova i certificati utilizzando le autorità di certificazione esistenti (CA) sulla macchina:sudo kubeadm certs renew all
L'output comando è simile all'esempio seguente:
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed certificate for serving the Kubernetes API renewed certificate the apiserver uses to access etcd renewed certificate for the API server to connect to kubelet renewed certificate embedded in the kubeconfig file for the controller manager to use renewed certificate for liveness probes to healthcheck etcd renewed certificate for etcd nodes to communicate with each other renewed certificate for serving etcd renewed certificate for the front proxy client renewed certificate embedded in the kubeconfig file for the scheduler manager to use renewed
Verifica che i certificati abbiano una nuova scadenza eseguendo il seguente comando :
sudo kubeadm certs check-expiration
Non tutti i componenti del piano di controllo supportano il ricaricamento dinamico dei certificati. Per scegliere i certificati rinnovati, i passaggi seguenti riavviano container:
kube-apiserver
,kube-scheduler
,kube-controller-manager
, eetcd
.Ripeti questi passaggi per ognuno dei quattro contenitori:
Trova l'ID contenitore per ciascun contenitore:
sudo crictl ps | grep CONTAINER_NAME
Sostituisci
CONTAINER_NAME
con il nome dei seguenti container:kube-apiserver
,kube-scheduler
,kube-controller-manager
oetcd
(nonetcd-defrag
).La risposta è simile al seguente output:
c331ade490cb6 28df10594cd92 26 hours ago Running kube-apiserver ...
L'ID contenitore è il valore nella prima colonna.
Arresta ogni container:
sudo crictl stop CONTAINER_ID
Sostituisci CONTAINER_ID con l'ID container del passaggio precedente.
Quando il container arrestato viene chiuso, kubelet crea un nuovo container nella sua luogo ed elimina quello interrotto. Se si verifica un errore, ad esempio
context deadline exceeded
(codice di erroreDeadlineExceeded
), esegui di nuovo .
Verifica che la connettività venga ripristinata
I certificati kubeadm ora dovrebbero essere rinnovati su tutti i nodi del piano di controllo. Se devi rinnovare certificati scaduti, procedi nel seguente modo:
Per verificare la connessione con il server API Kubernetes, esegui questo comando:
kubectl
su qualsiasi nodo del piano di controllo:kubectl get nodes --kubeconfig=/etc/kubernetes/admin.conf
La risposta dovrebbe restituire l'elenco di nodi per il cluster. Se le tue i certificati vengono rinnovati correttamente, non vengono restituiti errori di TLS o di certificato.
Sostituisci il file kubeconfig del cluster
a sostituire il file kubeconfig per il tuo cluster con uno che ha il rinnovo segui questi passaggi:
Per creare il nuovo file kubeconfig, esegui questo comando
kubectl
la workstation di amministrazione:kubectl --kubeconfig="ADMIN_KUBECONFIG" get secret/CLUSTER_NAME-kubeconfig \ -n "CLUSTER_NAMESPACE" -o jsonpath='{.data.value}' | base64 --decode > new_kubeconfig.conf
Sostituisci quanto segue:
ADMIN_KUBECONFIG: il valore percorso del file kubeconfig del cluster di amministrazione.
CLUSTER_NAME: il nome del cluster per cui stai rinnovando i certificati.
CLUSTER_NAMESPACE: lo spazio dei nomi del cluster per cui stai rinnovando i certificati.
Il file
new_kubeconfig.conf
contiene i dati del certificato aggiornati.Verifica che il nuovo kubeconfig funzioni eseguendo un qualsiasi comando
kubectl
, utilizzando le nuove credenziali:kubectl get nodes --kubeconfig new_kubeconfig.conf
Sostituisci i contenuti del vecchio file kubeconfig salvato nel del cluster sulla workstation di amministrazione con i contenuti File kubeconfig
new-kubeconfig.conf
.Per impostazione predefinita, il percorso del file di configurazione del cluster
bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
.
Verifica i certificati kubelet e riavvia etcd-defrag
Per completare il processo di rinnovo manuale dei certificati del cluster, esegui la per ciascun nodo del piano di controllo:
Accedi al nodo del piano di controllo e verifica il client kubelet e per la data di scadenza del certificato eseguendo i seguenti comandi:
I certificati kubelet vengono ruotati automaticamente finché il piano di controllo sia raggiungibile. Il periodo per il rinnovo automatico dei certificati kubelet è più breve del periodo di scadenza per i certificati dei componenti del piano di controllo. Di conseguenza, è probabile che i certificati kubelet siano stati rinnovati prima:
sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text | grep Validity -A2 sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -text | grep Validity -A2
L'output di entrambi i comandi è simile all'esempio seguente:
Validity Not Before: Nov 28 18:04:57 2022 GMT Not After : Nov 28 19:04:57 2023 GMT
Utilizza il seguente comando per riavviare il container
etcd-defrag
:Il container
etcd-defrag
utilizza il certificato clientapiserver-etcd
per comunica con etcd e deve essere riavviato per recuperare i certificati aggiornati.kubectl rollout restart daemonset etcd-defrag -n kube-system --kubeconfig KUBECONFIG_PATH
Dopo aver completato questi passaggi manuali per rinnovare i certificati del cluster, verifica che tutti i pod siano in esecuzione correttamente e non vengano segnalati errori TLS per il controllo del piano di controllo.