Sobre el problema de los dispositivos de red externos que acceden a un clúster de kubernetes creado en la red interna cuya dirección de publicidad es la IP de la red interna
Descripción del entorno
- Kubernetes versión 1.22
- Cliente de prueba centos7
Descripción del problema
- Copie el archivo /etc/kubernetes/admin.conf del clúster de kubernetes integrado en el entorno de red de intranet/nube en un dispositivo equipado con kubectl en la red externa y coloque el contenido del archivo en ~/.kube del dispositivo de red externo/ archivo de configuración
- Luego modifique el servidor en el archivo de configuración: https://${ip}:6443 La ip que contiene es la IP de la red pública del nodo maestro del clúster de kubernetes
- Luego use métodos como kubectl get pods para acceder al clúster de kubernetes
- El resultado devuelto es No se puede conectar al servidor: x509: el certificado es válido para ${la lista de direcciones IP de la red interna del clúster de kubernetes}, no para ${la dirección IP de la red externa del dispositivo maestro del clúster de kubernetes}
causas del problema
La dirección de anuncio de servidor ap de nuestros kubernetes es una IP de intranet. De forma predeterminada, la CA de kubernetes creada por sí misma emitirá un certificado para el servidor ap. El certificado accesible predeterminado es la IP de intranet, kubernetes, kubernetes.default kubernetes.default. svc y kubernetes.default.svc.cluster.local no incluyen la IP pública del nodo maestro. Por lo tanto, es imposible acceder a kubernetes directamente a través de admin.conf.
Puede ejecutar el siguiente comando en el nodo maestro para obtener la información de la dirección que permite el acceso al servidor analizando el certificado del servidor ap
openssl x509 -noout -text -in /etc/kubernetes/pki/apiserver.crt |grep IP
solución
Elimine el certificado y la clave del servidor ap en el clúster de kubernetes actual
rm /etc/kubernetes/pki/apiserver.*
Generar nuevo certificado y clave de apserver
Lo instalé a través de un sellador, por lo que necesito agregar la dirección del servidor configurada en el archivo de configuración del nodo del plano de control a la segunda cadena de direcciones IP: apiserver.cluster.local
kubeadm init phase certs apiserver \
--apiserver-advertise-address ${原来的advertise ip} \
--apiserver-cert-extra-sans ${master的外网ip}
Actualizar admin.conf
kubeadm alpha certs renew admin.conf
volver a aplicar un servidor
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
En este momento, mediante el análisis de openssl para obtener el contenido del certificado, podemos encontrar que se ha agregado la dirección que queremos expandir
Cómo conectar directamente el programa al apserver de forma remota
También tomado del archivo kubeconfig en el paso 2. de la descripción del problema, podemos usar go-client para compilar rest.Config y modificar la variable miembro Insecure de rest.Config a true para omitir la verificación del certificado.
config.Insecure = true
Continúe ejecutando, el comentario es que el archivo ca no admite el parámetro de bandera de inseguro, para esto, necesitamos eliminar los datos ca en el archivo de configuración, continúe intentándolo y puede acceder normalmente. La idea aquí también se refiere al código fuente de kubectl.