En esta página se muestra cómo puedes usar certificados SSL gestionados por Google para proteger el acceso Ingress en GKE. Aprenderás a usar el servicio de gestión de certificados automatizado de Google para simplificar el cifrado HTTPS de tus aplicaciones.
Estos certificados son certificados de validación de dominio (DV) que Google proporciona, renueva y gestiona para tus nombres de dominio. Estos certificados no demuestran tu identidad personal ni la de tu organización.
Esta página está dirigida a especialistas en redes y seguridad que planifican e implementan la seguridad de la red, así como a quienes desarrollan y mantienen políticas de seguridad. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas de usuario habituales de GKE.Google Cloud
Antes de leer esta página, asegúrate de que tienes conocimientos prácticos sobre GKE y un buen conocimiento de las redes y la seguridad de la red.
Para saber cómo crear certificados gestionados por Google con Google Cloud, consulta Certificados gestionados por Google.
Crear un Ingress con un certificado gestionado por Google
Para configurar un certificado SSL gestionado por Google y asociarlo a un Ingress, debes hacer lo siguiente:
- Crea un objeto
ManagedCertificate
en el mismo espacio de nombres que el Ingress. - Asocia el objeto
ManagedCertificate
a un Ingress añadiendo la anotaciónnetworking.gke.io/managed-certificates
al Ingress. Esta anotación es una lista de objetosManagedCertificate
separada por comas.
Limitaciones
Los certificados gestionados por Google son menos flexibles que los que obtienes y gestionas tú mismo. Los certificados gestionados por Google admiten hasta 100 dominios que no sean comodín. A diferencia de los certificados autogestionados, los certificados gestionados por Google no admiten dominios comodín.
Si necesitas certificados autogestionados o ya tienes certificados SSL que quieres configurar en tu Ingress, consulta Configurar HTTPS (TLS) entre el cliente y el balanceador de carga.
El número y el tipo de certificados admitidos por un Ingress se definen en los límites de los certificados SSL gestionados por Google.
No se admiten las actualizaciones de los certificados gestionados por Google. Para obtener más información, consulta Actualizar manualmente un certificado gestionado por Google.
Si el certificado se revoca directamente con la autoridad de certificación, Google no lo rota automáticamente. Debes eliminar el ManagedCertificate y crear otro.
Requisitos previos
- Debes ser el propietario del nombre de dominio. El nombre de dominio no puede tener más de 63 caracteres. Puedes usar Google Domains u otro registrador.
- Si usas un clúster Estándar de GKE, debes habilitar el complemento
HttpLoadBalancing
. - Tu
ingressClassName
debe ser"gce"
. - Debes aplicar los recursos
Ingress
yManagedCertificate
en el mismo proyecto y espacio de nombres. Crea una dirección IP externa estática (reservada). Reservar una dirección IP estática asegura que siga siendo tuya, aunque elimines el recurso Ingress. Si no reservas una dirección IP, es posible que cambie, por lo que tendrás que volver a configurar los registros DNS de tu dominio. Usa la CLI de Google Cloud o la consola para crear una dirección IP reservada. Google Cloud
gcloud
Para crear una dirección IP reservada, ejecuta el siguiente comando:
gcloud compute addresses create ADDRESS_NAME --global
Sustituye
ADDRESS_NAME
por el nombre de la dirección IP reservada que vas a crear.Para encontrar la dirección IP estática que has creado, ejecuta el siguiente comando:
gcloud compute addresses describe ADDRESS_NAME --global
El resultado debería ser similar al siguiente:
address: 203.0.113.32 ...
Consola
Para crear una dirección IP reservada, sigue estos pasos:
Ve a la página Direcciones IP externas de la Google Cloud consola.
Especifica un nombre para la dirección IP (por ejemplo,
example-ip-address
).Especifica si quieres una dirección IPv4 o IPv6.
En Tipo, seleccione la opción Global.
Haz clic en Reservar. La dirección IP se indica en la columna Dirección externa.
Config Connector
Nota: Para este paso se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.
Para implementar este manifiesto, descárgalo en tu máquina comocompute-address.yaml
y ejecuta el siguiente comando:kubectl apply -f compute-address.yaml
Configurar un certificado gestionado por Google
Crea un objeto
ManagedCertificate
. Este recurso especifica los dominios del certificado SSL. No se admiten dominios comodín.El siguiente manifiesto describe un objeto
ManagedCertificate
. Guarda el manifiesto comomanaged-cert.yaml
.apiVersion: networking.gke.io/v1 kind: ManagedCertificate metadata: name: managed-cert spec: domains: - FQDN_1 - FQDN_2
Haz los cambios siguientes:
FQDN_1
,FQDN_2
: Nombres de dominio completos que te pertenecen. Por ejemplo,example.com
ywww.example.com
.
Aplica el manifiesto a tu clúster:
kubectl apply -f managed-cert.yaml
Crea un servicio de tipo
NodePort
para exponer tu aplicación a Internet.El siguiente manifiesto describe un servicio de tipo
NodePort
. Guarda el manifiesto comomc-service.yaml
.apiVersion: v1 kind: Service metadata: name: mc-service spec: selector: app: mc-service type: NodePort ports: - protocol: TCP port: 80 targetPort: 8080
Aplica el manifiesto a tu clúster:
kubectl apply -f mc-service.yaml
Crea un objeto Ingress.
El siguiente manifiesto describe un Ingress que usa el
ManagedCertificate
que has creado. Guarda el manifiesto comomanaged-cert-ingress.yaml
.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: managed-cert-ingress annotations: kubernetes.io/ingress.global-static-ip-name: ADDRESS_NAME networking.gke.io/managed-certificates: managed-cert kubernetes.io/ingress.class: "gce" # Updated annotation spec: defaultBackend: service: name: mc-service port: number: SERVICE_PORT
Haz los cambios siguientes:
ADDRESS_NAME
: el nombre de tu dirección IP reservada.SERVICE_PORT
: el valor deports.port
en el archivo de manifiesto de tu servicio.
Aplica el manifiesto a tu clúster:
.kubectl apply -f managed-cert-ingress.yaml
Obtén la dirección IP del balanceador de carga:
kubectl get ingress
El resultado debería ser similar al siguiente:
NAME HOSTS ADDRESS PORTS AGE managed-cert-ingress * 203.0.113.32 80 54s
La dirección IP del balanceador de carga se muestra en la columna
ADDRESS
. Si usas una dirección IP estática reservada, será la dirección del balanceador de carga.Si la dirección no aparece, espera a que Ingress termine de configurarse.
Configura los registros DNS de tus dominios para que apunten a la dirección IP del balanceador de carga. Si usas Cloud DNS, consulta Gestión de registros para obtener más información.
Espera a que termine el aprovisionamiento del certificado gestionado por Google. Este proceso puede tardar hasta 60 minutos. Puedes comprobar el estado del certificado con el siguiente comando:
kubectl describe managedcertificate managed-cert
El resultado debería ser similar al siguiente:
Name: managed-cert Namespace: default Labels: <none> Annotations: <none> API Version: networking.gke.io/v1 Kind: ManagedCertificate (...) Spec: Domains: FQDN_1 FQDN_2 Status: CertificateStatus: Active (...)
El valor del campo
Status.CertificateStatus
indica que el certificado se ha aprovisionado. SiStatus.CertificateStatus
no esActive
, el certificado aún no se ha aprovisionado.Para comprobar los eventos de un Ingress, usa el siguiente comando:
kubectl describe ingress INGRESS_NAME
Sustituye
INGRESS_NAME
por el nombre de tu Ingress.Para verificar que SSL funciona, visita tus dominios con el prefijo
https://
. Tu navegador indica que la conexión es segura y puedes ver los detalles del certificado.
Migrar de certificados autogestionados a certificados gestionados por Google
Cuando migres un Ingress de certificados SSL autogestionados a certificados SSL gestionados por Google, no elimines ningún certificado SSL autogestionado antes de que los certificados SSL gestionados por Google estén activos. Una vez que se hayan aprovisionado correctamente los certificados SSL gestionados por Google, se activarán automáticamente. Cuando los certificados SSL gestionados por Google estén activos, podrás eliminar tus certificados SSL autogestionados.
Sigue estas instrucciones para migrar de certificados SSL autogestionados a certificados SSL gestionados por Google.
- Añade un certificado gestionado por Google al Ingress, tal como se describe en la sección Configurar un certificado gestionado por Google.
Espera hasta que el estado del recurso de certificado gestionado por Google sea Activo. Comprueba el estado del certificado con el siguiente comando:
kubectl describe managedcertificate managed-cert
Cuando el estado sea
Active
, actualiza el Ingress para quitar las referencias al certificado autogestionado.
Eliminar un certificado gestionado por Google
Para quitar un certificado gestionado por Google de tu clúster, debes eliminar el objeto ManagedCertificate
y quitar la anotación de entrada que lo haga referencia.
Elimina el objeto
ManagedCertificate
:kubectl delete -f managed-cert.yaml
El resultado debería ser similar al siguiente:
managedcertificate.networking.gke.io "managed-cert" deleted
Elimina la anotación de Ingress:
kubectl annotate ingress managed-cert-ingress networking.gke.io/managed-certificates-
Fíjate en el signo menos (
-
) que aparece al final del comando.Libera la dirección IP estática que has reservado para tu balanceador de carga.
Puedes usar la CLI de Google Cloud, la Google Cloud consola o Config Connector para liberar una dirección IP reservada.
gcloud
Usa el siguiente comando para liberar la dirección IP reservada:
gcloud compute addresses delete ADDRESS_NAME --global
Sustituye
ADDRESS_NAME
por el nombre de la dirección IP.Consola
Para liberar la dirección IP reservada, sigue estos pasos:
Ve a la página Direcciones IP externas de la Google Cloud consola.
Seleccione la casilla situada junto a la dirección IP que quiera liberar.
Haz clic en Liberar dirección IP.
Config Connector
Nota: Para este paso se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.
Para implementar este manifiesto, descárgalo en tu máquina como
compute-address.yaml
y ejecuta el siguiente comando:kubectl delete -f compute-address.yaml
Solución de problemas
En esta sección se explica cómo solucionar problemas con los certificados gestionados por Google.
Comprobar eventos en ManagedCertificate
y recursos de Ingress
Si supera el número de certificados permitidos, se añade un evento con el motivo TooManyCertificates
al ManagedCertificate
. Puedes consultar los eventos de un objeto ManagedCertificate
con el siguiente comando:
kubectl describe managedcertificate CERTIFICATE_NAME
Sustituye CERTIFICATE_NAME
por el nombre de tu ManagedCertificate
.
Si adjuntas un ManagedCertificate
que no existe a un Ingress, se añade un evento con el motivo MissingCertificate
al Ingress. Puedes consultar los eventos de un Ingress con el siguiente comando:
kubectl describe ingress INGRESS_NAME
Sustituye INGRESS_NAME
por el nombre de tu Ingress.
No se aprovisiona el certificado gestionado cuando el dominio se resuelve en direcciones IP de varios balanceadores de carga
Si tu dominio se resuelve en direcciones IP de varios balanceadores de carga (varios objetos Ingress), debes crear un solo objeto ManagedCertificate
y adjuntarlo a todos los objetos Ingress. Si creas muchos objetos ManagedCertificate
y los asocias a un objeto Ingress independiente, es posible que la autoridad de certificación no pueda verificar la propiedad de tu dominio y que no se aprovisionen algunos de tus certificados. Para que la verificación se realice correctamente, el certificado debe estar visible en todas las direcciones IP a las que se resuelva tu dominio.
En concreto, cuando tu dominio se resuelva en direcciones IPv4 e IPv6 que estén configuradas con objetos Ingress diferentes, debes crear un solo objeto ManagedCertificate
y adjuntarlo a ambos Ingresses.
Se ha interrumpido la comunicación entre los certificados gestionados por Google y el recurso Ingress
Los certificados gestionados se comunican con Ingress mediante la anotación ingress.gcp.kubernetes.io/pre-shared-cert
. Puedes interrumpir esta comunicación si, por ejemplo:
- Ejecuta un proceso automatizado que borre la
ingress.gcp.kubernetes.io/pre-shared-cert
anotación. - Almacena una captura de Ingress, elimínala y restáurala a partir de la captura. Mientras tanto, es posible que se haya eliminado un recurso
SslCertificate
que figura en la anotacióningress.gcp.kubernetes.io/pre-shared-cert
. Ingress no funciona si falta algún certificado asociado.
Si se interrumpe la comunicación entre los certificados gestionados por Google y el Ingress, elimina el contenido de la anotación ingress.gcp.kubernetes.io/pre-shared-cert
y espera a que el sistema se reconcilie. Para evitar que vuelva a ocurrir, asegúrate de que la anotación no se modifique ni se elimine por error.
Errores de validación al crear un certificado gestionado por Google
Las definiciones de ManagedCertificate
se validan antes de que se cree el objeto ManagedCertificate
. Si no se puede realizar la validación, no se crea el objeto ManagedCertificate
y se muestra un mensaje de error. A continuación, se explican los diferentes mensajes de error y motivos:
spec.domains in body should have at most 100 items
Tu manifiesto ManagedCertificate
incluye más de 100 dominios en el campo spec.domains
. Los certificados gestionados por Google solo admiten hasta 100 dominios.
spec.domains in body should match '^(([a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)+[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\.?$'
Has especificado un nombre de dominio no válido o un nombre de dominio comodín en el campo spec.domains
. El objeto ManagedCertificate
no admite dominios comodín (por ejemplo, *.example.com
).
spec.domains in body should be at most 63 chars long
Has especificado un nombre de dominio demasiado largo. Los certificados gestionados por Google admiten nombres de dominio de 63 caracteres como máximo.
Actualizar manualmente un certificado gestionado por Google
Para actualizar manualmente el certificado de forma que el certificado del dominio antiguo siga funcionando hasta que se aprovisione el certificado del nuevo dominio, sigue estos pasos:
- Crea un
ManagedCertificate
para el nuevo dominio. - Añade el nombre del
ManagedCertificate
a la anotaciónnetworking.gke.io/managed-certificates
en el Ingress mediante una lista separada por comas. No elimine el nombre del certificado antiguo. - Espera hasta que
ManagedCertificate
se active. - Desasocia el certificado antiguo del Ingress y elimínalo.
Cuando creas un ManagedCertificate
, Google Cloud crea un certificado SSL gestionado por Google. No puedes actualizar este certificado. Si actualizas el ManagedCertificate
, Google Cloud se elimina y se vuelve a crear el certificado SSL gestionado por Google.
Para proporcionar un Ingress cifrado HTTPS seguro para tus clústeres de GKE, consulta el ejemplo Ingress seguro.
Siguientes pasos
- Más información sobre los certificados gestionados por Google
- Consulta cómo configurar un balanceador de carga de aplicación externo con Ingress.
- Consulta cómo usar varios certificados SSL con balanceadores de carga de aplicaciones externos con Ingress.
- Implementa un Ingress seguro.