Pular para o conteúdo
ecdsa.com
kubectl (client-go)Docker e Kubernetes

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

Como corrigir

  1. 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. 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. 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

Erros relacionados

Ver toda a base de erros de assinatura