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
Accès via un répartiteur de charge ou une IP publique
fréquenteUn répartiteur de charge, une IP flottante ou une adresse NAT placés devant le plan de contrôle et non transmis comme SAN supplémentaire lors de kubeadm init.
Tunnels SSH et redirections de port
fréquenteJoindre le serveur d’API à l’adresse https://127.0.0.1:6443 via un tunnel revient à demander 127.0.0.1, que le certificat ne couvre pas.
L’adresse IP du nœud a changé
occasionnelleLes clusters à nœud unique sur DHCP, ou sur des VM déplacées vers un autre réseau, conservent un certificat émis pour l’ancienne adresse.
Comment corriger l’erreur
- 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.
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.
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