Saltar al contenido
ecdsa.com
kubectl (client-go)Docker y Kubernetes

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

Cómo solucionarlo

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

Errores relacionados

Explorar toda la base de datos de errores de firma