Aller au contenu
ecdsa.com
kubectl (client-go)Docker et Kubernetes

Message d’erreur

Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed by unknown authority

Avant cette ligne, kubectl 1.37 journalise aussi l’échec de la requête de découverte de l’API sous la forme d’une ligne de niveau error contenant « Couldn't get current server API group list » et la même erreur TLS. Lorsque l’AC du kubeconfig porte le même nom que la vraie, le texte se poursuit par « (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

Ce que cela signifie

kubectl vérifie le certificat du serveur d’API par rapport à l’autorité de certification (AC) du cluster enregistrée dans votre kubeconfig (certificate-authority ou certificate-authority-data), et non par rapport aux racines publiques du système. « Unknown authority » signifie que la chaîne du certificat présenté ne remonte pas à cette AC : le kubeconfig ne contient aucune AC, ou celle d’un autre cluster, ou bien un élément situé entre vous et le serveur d’API présente son propre certificat.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Examiner l’AC et le serveur indiqués dans votre kubeconfig

    Décodez certificate-authority-data et comparez son sujet et ses dates avec l’émetteur du certificat du serveur d’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.

    Intégrer la bonne AC du cluster

    Définissez l’entrée du cluster avec l’AC du cluster (pour kubeadm, /etc/kubernetes/pki/ca.crt) et intégrez-la au 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.

    Régénérer le kubeconfig des clusters gérés

    Les CLI des fournisseurs cloud écrivent une nouvelle entrée de cluster avec le point de terminaison et l’AC actuels.

    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.

    Contourner le proxy pour le serveur d’API

    Ajoutez l’hôte ou le réseau du serveur d’API à NO_PROXY au lieu de désactiver la vérification 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

Erreurs associées

Parcourir toute la base de données des erreurs de signature