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 is valid for 10.96.0.1, 192.168.1.10, not 127.0.0.1

Les listes d’adresses proviennent de votre certificat et de votre kubeconfig. Pour les noms DNS, le message est « x509: certificate is valid for kubernetes, kubernetes.default, …, not k8s.example.com ».

kubectl (client-go) — the API server address in the kubeconfig is not among the API server certificate's SANs

Ce que cela signifie

Le certificat du serveur d’API est reconnu comme fiable (sa chaîne remonte à l’AC du cluster), mais l’adresse de l’URL du serveur dans votre kubeconfig ne figure pas parmi les noms ou les IP de ses noms alternatifs du sujet (SAN). Go liste les SAN de type IP qu’il a trouvés et l’adresse qu’il attendait. kubeadm émet le certificat du serveur d’API pour l’IP du service, les adresses des nœuds et quelques noms DNS ; tout autre moyen de le joindre nécessite un SAN supplémentaire.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Lister les SAN du certificat

    Comparez-les avec l’URL du serveur dans le kubeconfig.

    bash
    # On a control-plane node: the names and addresses the API server certificate covers
    sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -ext subjectAltName
  2. 2.

    Régénérer le certificat du serveur d’API avec des SAN supplémentaires

    kubeadm init phase certs apiserver émet un nouveau certificat avec --apiserver-cert-extra-sans ; l’ancienne paire doit d’abord être déplacée ailleurs, et kube-apiserver redémarré pour charger le nouveau certificat.

    bash
    # kubeadm: add the missing address/name to the API server certificate
    sudo mv /etc/kubernetes/pki/apiserver.{crt,key} /root/
    sudo kubeadm init phase certs apiserver --apiserver-cert-extra-sans=203.0.113.20,k8s.example.com
    # then restart the kube-apiserver static pod (e.g. move its manifest out of /etc/kubernetes/manifests and back)
  3. 3.

    Tunnels : définir tls-server-name

    Avec l’option tls-server-name, kubectl se connecte à l’adresse du tunnel tout en vérifiant un nom que le certificat couvre bien, plutôt que de recourir à insecure-skip-tls-verify.

    bash
    # Through a tunnel or port-forward: keep verifying the name the certificate has
    kubectl config set-cluster my-cluster --server=https://127.0.0.1:6443 --tls-server-name=kubernetes

Erreurs associées

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