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

Como corrigir

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

Ver toda a base de erros de assinatura