Usa certificados SSL que administra Google

En esta página, se muestra cómo puedes usar Ingress para crear balanceadores de cargas externos con certificados SSL que administra Google. Los certificados se aprovisionan, renuevan y administran para tus nombres de dominio. Si deseas obtener información sobre cómo crear uno, consulta la descripción general de certificados SSL.

Presentamos la API de v1beta2

Los certificados administrados son una función Beta que está disponible en todas las versiones de GKE. En los clústeres con instancias principales que ejecutan Kubernetes anteriores a la versión 1.16.5-gke.1, los certificados administrados están disponibles en la versión v1beta1 y no admiten varios nombres alternativos de asunto (SAN) por certificado.

En GKE 1.16.5-gke.1 y versiones posteriores, los certificados administrados están disponibles en la versión v1beta2 y son compatibles con hasta 100 SAN por certificado. La versión v1beta1 también está disponible.

Migra de la API de v1beta1 a la de v1beta2

La diferencia entre v1beta1 y v1beta2 solo está en la validación que permite más nombres de dominio por certificado. El número de versión se actualiza para destacar la diferencia de forma clara y evitar cambiar de manera silenciosa las reglas de validación y los malentendidos a los que podría conducir.

Los recursos de v1beta1 se migran de forma automática a la versión v1beta2 cuando se actualizan. Los recursos se actualizan de forma automática. Una vez que se quita la versión v1beta1, ya no se pueden crear recursos nuevos en esta versión.

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.

Limitaciones

Los certificados administrados por Google son menos flexibles que los certificados que tú obtienes y administras. Los certificados administrados admiten hasta 100 dominios sin comodines, mientras que los certificados autoadministrados pueden admitir comodines.

Si necesitas certificados autoadministrados o si ya posees certificados SSL que deseas configurar en el 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 te pertenece, incluso si borras el Ingress. Si no reservas una dirección, es posible que esta cambie y requiera 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.

    gcloud

    Para crear una dirección IP reservada, ejecuta el siguiente comando:

    gcloud compute addresses create address-name --global
    

    en el que address-name es el nombre de la dirección IP reservada que creas.

    Para encontrar la dirección IP estática que creaste, ejecuta el siguiente comando:

    gcloud compute addresses describe address-name --global
    

    El resultado es similar a lo siguiente:

    address: 203.0.113.32
    ...
    

    Console

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

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

    2. Especifica un nombre para esta dirección IP (por ejemplo, example-ip-address).
    3. Especifica si se trata de una dirección IPv4IPv6. 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 aparece 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 el clúster.

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    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 los dominios para los que se creará el certificado SSL. Los dominios de comodín no son compatibles.

    Este es un manifiesto de ManagedCertificate de muestra:

    apiVersion: networking.gke.io/v1beta2
    kind: ManagedCertificate
    metadata:
      name: certificate-name
    spec:
      domains:
        - domain-name1
        - domain-name2
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • certificate-name es el nombre del recurso ManagedCertificate.
    • domain-name1 y domain-name2 son los nombres de dominio.

    Guarda el manifiesto como un archivo llamado certificate-name.yaml y, luego, crea el recurso con el siguiente comando:

    kubectl apply -f certificate-name.yaml
    
  2. Crea un servicio NodePort para exponer tu aplicación en Internet.

    El siguiente es un ejemplo de un archivo de manifiesto de Service:

    apiVersion: v1
    kind: Service
    metadata:
      name: service-name
    spec:
      selector:
        key: value
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    

    En esta especificación de ejemplo, se seleccionan los pods para incluir en el objeto Service mediante selector. Consulta la documentación de NodePort para obtener detalles sobre cómo configurar Service.

    Guarda el manifiesto como un archivo llamado service-name.yaml y, luego, crea el objeto Service con el siguiente comando:

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

    El siguiente es un manifiesto de Ingress de muestra:

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

    En el ejemplo anterior, se ilustra lo siguiente:

    • ingress-name es el nombre del Ingress.
    • address-name es el nombre de la dirección IP reservada.
    • certificate-name es el nombre del certificado.
    • service-name es el nombre del servicio que creaste en el paso anterior.
    • service-port es el puerto que especificaste en tu manifiesto de Service.

    Guarda el manifiesto como un archivo llamado ingress-name.yaml y, luego, crea el Ingress con el siguiente comando:

    kubectl apply -f ingress-name.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
    

    El resultado es similar a lo siguiente:

    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. 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 el Ingress termine de configurarse.

  5. Configura los registros DNS de tus dominios 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 certificate-name
    

    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 se aprovisiona con éxito:

    Name:         certificate-name
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1beta1
    Kind:         ManagedCertificate
    (...)
    Spec:
      Domains:
        domain-name1
        domain-name2
    Status:
      CertificateStatus: Active
    (...)
    
  7. Para verificar que SSL funcione, visita los dominios 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 sea Activo. Verifica el estado del certificado con el siguiente comando:

    kubectl describe managedcertificate certificate-name
    
  3. Cuando el estado sea Activo, actualiza el 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 certificate-name.yaml
    

    Obtendrás el siguiente resultado:

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

    kubectl annotate ingress ingress-name 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 que address-name es el nombre de la dirección IP.

    Console

    1. Ve a la página 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 el clúster.

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    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

Soluciona problemas

En esta sección, se proporciona información sobre cómo resolver problemas con los certificados administrados.

El certificado administrado no se aprovisiona cuando el dominio se resuelve en direcciones IP de varios balanceadores de cargas

Cuando tu dominio se resuelve en direcciones IP de varios balanceadores de cargas (varios Ingress), debes crear un solo recurso ManagedCertificate y adjuntarlo a todos los Ingress. Si, en cambio, creas muchos recursos ManagedCertificate y adjuntas cada uno a un Ingress distinto, es posible que la autoridad certificada no pueda verificar la propiedad del dominio y que algunos de tus certificados no se aprovisionen. Para que la verificación sea exitosa, el certificado debe estar visible en todas las direcciones IP a las que se resuelve el dominio.

De manera específica, cuando el dominio se resuelve en una dirección IPv4 y otra IPv6 configuradas con diferentes recursos del Ingress, debes crear un solo recurso ManagedCertificate y adjuntarlo a ambos Ingress.

Comunicación interrumpida entre los certificados administrados y el Ingress

Los certificados administrados se comunican con el Ingress mediante la anotación kubernetes.io/pre-shared-cert. Puedes interrumpir esta comunicación en los siguientes casos:

  • Ejecutas un proceso automatizado que borre la anotación kubernetes.io/pre-shared-cert.
  • Almacenas una instantánea del Ingress, la borras y restableces el Ingress desde la instantánea. Mientras tanto, es posible que se haya borrado un recurso SslCertificate que aparece en la anotación del certificado ya compartido del Ingress. Ingress tiene una semántica de todo o nada y no funcionará si faltan certificados adjuntos.

Errores de validación cuando se crea un certificado administrado

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. A continuación, se explican los diferentes mensajes de error y los motivos:

spec.domains in body should have at most 100 items

El manifiesto de ManagedCertificate enumera más de 100 dominios en el campo spec.domains. Los certificados administrados solo admiten hasta 100 dominios. Los certificados administrados en clústeres anteriores a la versión 1.16.5-gke.1 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 con comodín en el campo spec.domains. Los certificados administrados no admiten dominios con 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