Mensaje de error
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
Las listas de direcciones salen de tu certificado y de tu kubeconfig. Con nombres DNS, el mensaje dice «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
Qué significa
El certificado del servidor de API es de confianza (su cadena llega a la CA del clúster), pero la dirección de la URL del servidor en tu kubeconfig no es ninguno de los nombres ni de las IP de sus nombres alternativos del sujeto (SAN). Go enumera los SAN de tipo IP que encontró y la dirección que buscaba. kubeadm emite el certificado del servidor de API para la IP del servicio, las direcciones de los nodos y unos pocos nombres DNS; cualquier otra forma de llegar a él necesita un SAN adicional.
Por qué ocurre
Acceso a través de un balanceador de carga o de una IP pública
frecuenteUn balanceador de carga, una IP flotante o una dirección NAT delante del plano de control que no se pasó como SAN adicional en kubeadm init.
Túneles SSH y reenvíos de puertos
frecuenteSi accedes al servidor de API como https://127.0.0.1:6443 a través de un túnel, se solicita 127.0.0.1, una dirección que el certificado no cubre.
Cambió la dirección IP del nodo
ocasionalLos clústeres de un solo nodo con DHCP o las VM trasladadas a otra red conservan un certificado para la dirección antigua.
Cómo solucionarlo
- 1.
Listar los SAN del certificado
Compáralos con la URL del servidor del 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.
Volver a generar el certificado del servidor de API con SAN adicionales
kubeadm init phase certs apiserver emite un certificado nuevo con --apiserver-cert-extra-sans; antes hay que mover a otra ubicación el par antiguo, y después reiniciar kube-apiserver para que lo cargue.
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.
Túneles: establecer tls-server-name
Con tls-server-name, kubectl verifica un nombre que el certificado sí cubre mientras se conecta a la dirección del túnel, en lugar de recurrir a 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