Mensagem de erro
Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed by unknown authority
Antes dessa linha, o kubectl 1.37 também registra a requisição de descoberta da API que falhou, em uma linha de nível error que contém “Couldn't get current server API group list” e o mesmo erro TLS. Quando a CA do kubeconfig tem o mesmo nome da verdadeira, o texto continua com “(possibly because of … while trying to verify candidate authority certificate \"kubernetes\")”.
kubectl (client-go) — the API server's certificate does not chain to the kubeconfig's certificate-authority-data
O que significa
O kubectl verifica o certificado do servidor de API com a CA do cluster armazenada no seu kubeconfig (certificate-authority ou certificate-authority-data), e não com as raízes públicas do sistema. “Unknown authority” significa que a cadeia do certificado apresentado não leva a essa CA: o kubeconfig não tem CA ou tem a CA de outro cluster, ou algo entre você e o servidor de API apresenta o próprio certificado.
Por que acontece
O kubeconfig não tem a CA do cluster ou tem a de outro cluster
comumArquivos kubeconfig editados à mão, contextos mesclados que apontam para a entrada de cluster errada, ou uma URL do servidor trocada para um balanceador de carga que apresenta outro certificado.
Um proxy com inspeção de TLS reassina a conexão com o servidor de API
comumO kubectl usa HTTPS_PROXY; proxies corporativos apresentam o próprio certificado, que não foi emitido pela CA do cluster.
O endpoint de um cluster gerenciado mudou
ocasionalClusters EKS, GKE ou AKS recriados (ou CAs de cluster rotacionadas) deixam no kubeconfig entradas antigas com uma CA que não corresponde mais.
Como corrigir
- 1.
Examinar a CA e o servidor no seu kubeconfig
Decodifique o certificate-authority-data e compare o titular e as datas dele com o emissor do certificado do servidor de API.
bash kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' \ | base64 -d | openssl x509 -noout -subject -enddate kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}' - 2.
Embutir a CA correta do cluster
Configure a entrada do cluster com a CA do cluster (no kubeadm, /etc/kubernetes/pki/ca.crt) e embuta-a no kubeconfig.
bash # kubeadm clusters: the cluster CA is /etc/kubernetes/pki/ca.crt on a control-plane node kubectl config set-cluster my-cluster --server=https://k8s.example.com:6443 \ --certificate-authority=ca.crt --embed-certs=true - 3.
Gerar de novo o kubeconfig de clusters gerenciados
As CLIs dos provedores de nuvem gravam uma entrada de cluster nova com o endpoint e a CA atuais.
bash # Managed clusters: regenerate the kubeconfig entry from the provider aws eks update-kubeconfig --name my-cluster --region eu-central-1 gcloud container clusters get-credentials my-cluster --region europe-west1 az aks get-credentials --resource-group rg --name my-cluster - 4.
Contornar o proxy no acesso ao servidor de API
Adicione o host ou a rede do servidor de API a NO_PROXY em vez de desativar a verificação TLS (insecure-skip-tls-verify).
bash # kubectl honours HTTPS_PROXY; exclude the API server so a TLS-inspecting proxy is bypassed export NO_PROXY=k8s.example.com,10.0.0.0/8
Erros relacionados
x509: certificate signed by unknown authority (possibly because of "crypto/rsa:…kubectl and other Go clientsUnable to connect to the server: tls: failed to verify certificate: x509: certi…kubectl (client-go)x509: certificate signed by unknown authorityGo crypto/x509Error response from daemon: Get "https://registry.example.com:5000/v2/": tls: f…Docker Engine (dockerd)