Mensagem de erro
Unable to connect to the server: tls: failed to verify certificate: x509: certificate has expired or is not yet valid
O Go acrescenta os dois instantes: “…: current time <client time> is after <notAfter>” (ou “is before <notBefore>” para certificados que ainda não são válidos), o que mostra qual dos lados está errado.
kubectl (client-go) — the API server certificate (often after a year without kubeadm upgrades) is outside its validity period
O que significa
O servidor de API apresentou um certificado fora do período de validade, segundo o horário local do kubectl. Em clusters kubeadm, os certificados do plano de controle são emitidos por um ano e só são renovados automaticamente durante as atualizações com o kubeadm, então clusters que ficam um ano sem manutenção falham exatamente assim. Um relógio errado no cliente produz o mesmo erro.
Por que acontece
Os certificados do plano de controle do kubeadm expiraram depois de um ano
comumOs certificados do apiserver, do front-proxy e do etcd (e os certificados de cliente em admin.conf) valem por um ano por padrão; eles são renovados no kubeadm upgrade ou com kubeadm certs renew.
O certificado de cliente do seu kubeconfig expirou
ocasionalDepois que os certificados do servidor foram renovados, um admin.conf antigo com um certificado de cliente expirado falha na autenticação (com outra mensagem, “You must be logged in to the server (Unauthorized)”).
Desvio de relógio
ocasionalUm “is before” na mensagem completa indica que o relógio do cliente está atrasado em relação ao notBefore do certificado.
Como corrigir
- 1.
Listar as datas de expiração dos certificados
O kubeadm certs check-expiration mostra cada certificado do plano de controle com a validade restante.
bash # On a control-plane node sudo kubeadm certs check-expiration - 2.
Renovar e reiniciar o plano de controle
O kubeadm certs renew all grava novos certificados; os pods estáticos precisam ser reiniciados para carregá-los, e os kubeconfigs com certificados de cliente embutidos precisam ser atualizados.
bash sudo kubeadm certs renew all # restart the control-plane static pods so they load the new certificates, # then refresh your kubeconfig (the embedded client certificate was renewed too): sudo cp /etc/kubernetes/admin.conf "$HOME/.kube/config" - 3.
Verificar o horário do cliente
Sincronize o relógio se a mensagem completa disser “is before”.
bash date -u; timedatectl status | grep -i synchronized