Usa certificados SSL administrados por Google

Descripción general

En Google Kubernetes Engine, puedes usar Ingresses para crear balanceadores de cargas de HTTPS con certificados SSL configurados de forma automática. Los certificados SSL administrados por Google se aprovisionan, renuevan y administran para tus nombres de dominio. Obtén más información sobre los certificados SSL administrados por Google aquí.

Crea un Ingress con un certificado administrado

Para configurar un certificado SSL administrado y asociarlo con un Ingress, debes seguir estos pasos:

  • Crea un objeto ManagedCertificate.
  • Agrega una anotación networking.gke.io/managed-certificates al Ingress para asociar el objeto ManagedCertificate. Esta anotación es una lista separada por comas de recursos ManagedCertificate, por ejemplo, cert1,cert2,cert3.

El recurso ManagedCertificate debe crearse en el mismo espacio de nombres que el Ingress.

Limitaciones

Los certificados administrados por Google son menos flexibles que los certificados que tú obtienes y administras. Los certificados administrados admiten un solo dominio sin comodines. Los certificados autoadministrados pueden admitir comodines y varios nombres alternativos de sujeto (SAN).

Si necesitas certificados autoadministrados o si ya posees certificados SSL que deseas configurar en tu Ingress, consulta la documentación de Ingress.

La cantidad y el tipo de certificados admitidos por un Ingress están definidos por los límites de los certificados SSL administrados de Google Cloud.

Requisitos previos

  • Debes ser dueño del nombre de dominio. El nombre de dominio no debe tener más de 63 caracteres. Puedes usar Google Domains o algún otro registrador.
  • Crea una dirección IP externa (estática) reservada. Reservar una dirección IP estática garantiza que seguirá siendo tuya, incluso si borras el Ingress. Si no reservas una dirección, esta puede cambiar y requerir que vuelvas a configurar los Registros DNS de tu dominio. Usa la herramienta de línea de comandos de gcloud o Cloud Console para crear una dirección IP reservada, llamada example-ip-address:

    gcloud

    gcloud compute addresses create example-ip-address --global
    

    Para buscar la dirección IP estática que creaste, sigue estos pasos:

    $ gcloud compute addresses describe example-ip-address --global
    address: 203.0.113.32
    ...
    

    Console

    1. Ve a la página de reserva de una dirección estática en Cloud Console.

      Ir a la página de reserva de una dirección estática

    2. Especifica example-ip-address, un nombre para esta dirección IP.
    3. Especifica si se trata de una dirección IPv4 o IPv6. En el siguiente ejemplo, se usa una dirección IPv4.
    4. Selecciona la opción global para el tipo de dirección.
    5. Haz clic en Reservar si deseas reservar la IP.
    6. La dirección IP aparecerá en la columna Dirección externa.

    Config Connector

    Nota: En este paso, se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

    apiVersion: compute.cnrm.cloud.google.com/v1alpha2
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global
    Para implementar este manifiesto, descárgalo en tu máquina como compute-address.yaml y ejecuta lo siguiente:
    kubectl apply -f compute-address.yaml

Configura el certificado administrado

  1. Crea un recurso ManagedCertificate. Este recurso especifica el dominio para el que se creará el certificado SSL. Los dominios de comodín no son compatibles. La lista spec.domains debe contener solo un dominio.

    Guarda el siguiente ejemplo de manifiesto de ManagedCertificate en un archivo con nombre example-certificate.yaml. Reemplaza example.com por tu nombre de dominio:

    apiVersion: networking.gke.io/v1beta1
    kind: ManagedCertificate
    metadata:
      name: example-certificate
    spec:
      domains:
        - example.com
    

    Usa kubectl para crear el recurso:

    kubectl apply -f example-certificate.yaml
    
  2. Crea un servicio NodePort para exponer tu aplicación en Internet. El siguiente es un ejemplo de un archivo de manifiesto de servicio, example-service.yaml.

    apiVersion: v1
    kind: Service
    metadata:
      name: example-nodeport-service
    spec:
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    

    En esta especificación de ejemplo, no se selecciona ningún pod para incluir en el servicio. Esto es suficiente para demostrar cómo configurar los certificados administrados. Sin embargo, en el uso práctico, una especificación de servicio debe incluir un selector.

    Consulta la documentación de NodePort para obtener detalles sobre cómo configurar el servicio.

    Usa kubectl para crear el servicio:

    kubectl apply -f example-service.yaml
    
  3. Crea un Ingress y vincúlalo al ManagedCertificate que creaste antes.

    • Establece la anotación networking.gke.io/managed-certificates en el nombre de tu certificado.
    • Para el campo spec.backend.serviceName, usa el nombre del servicio que creaste en el paso anterior.
    • Establece el campo spec.backend.servicePort en el puerto que especificaste en el manifiesto de servicio.
    • Configura la anotación kubernetes.io/ingress.global-static-ip-name con el nombre de tu dirección IP reservada.

    El siguiente es un ejemplo de manifiesto de Ingress, example-ingress.yaml:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: example-ip-address
        networking.gke.io/managed-certificates: example-certificate
    spec:
      backend:
        serviceName: example-nodeport-service
        servicePort: 80
    

    Usa kubectl para crear el Ingress:

    kubectl apply -f example-ingress.yaml
    
  4. Busca la dirección IP del balanceador de cargas creado en el paso anterior. Usa el siguiente comando para obtener la dirección IP del balanceador de cargas:

    $ kubectl get ingress
    NAME              HOSTS     ADDRESS         PORTS     AGE
    example-ingress   *         203.0.113.32     80        54s
    

    La dirección IP del balanceador de cargas aparece en la columna ADDRESS, 203.0.113.32 en este ejemplo. Si usas una dirección IP estática reservada, esa será la dirección del balanceador de cargas.

    Si la dirección no aparece en la lista, espera a que Ingress termine de configurarse.

  5. Configura los Registros DNS de tu dominio para que apunten a la dirección IP del balanceador de cargas. Si usas Cloud DNS, puedes consultar la guía sobre cómo administrar registros para obtener más información.

  6. Espera a que se aprovisione el certificado administrado. Este proceso puede tardar hasta 15 minutos. Puedes comprobar el estado del certificado con el siguiente comando:

    kubectl describe managedcertificate
    

    Una vez que un certificado se aprovisiona de forma correcta, el valor del campo Status.CertificateStatus será Active. En el siguiente ejemplo, se muestra el resultado de kubectl describe después de que el certificado de ejemplo se aprovisione de manera correcta:

    Name:         example-certificate
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1beta1
    Kind:         ManagedCertificate
    (...)
    Spec:
      Domains:
        example.com
    Status:
      CertificateStatus: Active
    (...)
    
  7. Verifica que SSL esté en funcionamiento. Para ello, visita tu dominio con el prefijo https://. Tu navegador indicará que la conexión es segura y podrás ver los detalles del certificado.

Migra a certificados administrados por Google desde certificados autoadministrados

Cuando migras un Ingress desde el uso de certificados SSL autoadministrados a certificados SSL administrados por Google, no debes borrar ningún certificado SSL autoadministrado antes de que los certificados SSL administrados por Google se activen. Una vez que los certificados SSL administrados por Google se aprovisionan de forma correcta, estos se activan de forma automática. Cuando los certificados SSL administrados por Google están activos, puedes borrar tus certificados SSL autoadministrados.

Usa estas instrucciones para migrar desde los certificados autoadministrados hasta los SSL administrados por Google.

  1. Agrega un nuevo certificado administrado al Ingress, como se describe en la sección sobre cómo configurar el certificado administrado.
  2. Espera hasta que el estado del recurso del certificado administrado por Google esté Activo. Verifica el estado del certificado con kubectl describe managedcertificate.
  3. Cuando el estado sea Activo, actualiza Ingress para quitar las referencias al certificado autoadministrado.

Quita un certificado administrado

Para quitar un certificado administrado de tu clúster, debes borrar el recurso ManagedCertificate y quitar la anotación de Ingress que hace referencia a él.

  1. Borra el recurso ManagedCertificate con kubectl:

    kubectl delete -f example-certificate.yaml
    

    Obtendrás el siguiente resultado:

    managedcertificate.networking.gke.io "example-certificate" deleted
    
  2. Quita la anotación del Ingress:

    kubectl annotate ingress example-ingress networking.gke.io/managed-certificates-
    

    Observa el signo menos, “-”, al final del comando.

  3. Libera la dirección IP estática que reservaste para tu balanceador de cargas:

gcloud

Con la herramienta de línea de comandos de gcloud, ejecuta el siguiente comando:

gcloud compute addresses delete [ADDRESS_NAME] --global

En el ejemplo anterior, [ADDRESS_NAME] es el nombre de la dirección IP.

Console

  1. Ve a la página de direcciones IP externas en Cloud Console.

    Ir a la página Direcciones IP externas

  2. Marca la casilla que aparece junto a la dirección IP que deseas liberar.
  3. Haz clic en Liberar dirección IP.

Config Connector

Nota: En este paso, se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

apiVersion: compute.cnrm.cloud.google.com/v1alpha2
kind: ComputeAddress
metadata:
  name: example-ip-address
spec:
  location: global
Para implementar este manifiesto, descárgalo en tu máquina como compute-address.yaml y ejecuta lo siguiente:
kubectl delete -f compute-address.yaml

Solución de problemas

Las definiciones de ManagedCertificate se validan antes de crear el recurso ManagedCertificate. Si la validación falla, el recurso ManagedCertificate no se crea y se imprime un mensaje de error. Las diferentes razones del error se explican a continuación:

spec.domains in body should have at most 1 items

Tu manifiesto de ManagedCertificate enumera más de un dominio en el campo spec.domains. Los certificados administrados solo admiten un dominio.

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]\.?$'

Especificaste un nombre de dominio no válido o un nombre de dominio comodín en el campo spec.domains. Los certificados administrados no admiten dominios comodín, como *.example.com

spec.domains in body should be at most 63 chars long

Especificaste un nombre de dominio que es demasiado largo. Los certificados administrados admiten nombres de dominio con un máximo de 63 caracteres.

Próximos pasos

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Kubernetes Engine