Usar tus propios certificados TLS

Consulta cómo configurar Knative Serving para usar tus propios certificados SSL/TLS.

También puedes usar la función de certificados TLS gestionados, que crea y renueva automáticamente los certificados TLS a través de Let's Encrypt.

Para usar tus propios certificados, almacena tus certificados TLS en un secreto de Kubernetes y, a continuación, configura la pasarela de entrada de Cloud Service Mesh para que use ese secreto.

Antes de empezar

  • En estas instrucciones se da por hecho que ya has obtenido tus certificados TLS.
  • Debes configurar un dominio personalizado. Para obtener más información, consulta el artículo Asignar dominios personalizados.
  • Debes configurar cada uno de tus servicios de Knative Serving que usen la puerta de enlace de entrada para servir tráfico externo. Si estos servicios orientados al exterior no están configurados para usar tus certificados TLS, no podrán verificar una conexión HTTPS y, por lo tanto, nunca alcanzarán el estado ready.

Almacenar certificados TLS en un secreto de Kubernetes

Para almacenar los certificados en un secreto, sigue estos pasos:

  1. Abre un terminal y ve al directorio donde se encuentran tus certificados TLS.

  2. Usa el siguiente comando para crear un secreto que almacene tus certificados:

    kubectl create --namespace INGRESS_NAMESPACE secret tls SECRET_NAME \
      --key PRIVATE_KEY.pem \
      --cert FULL_CHAIN.pem

    Sustituye:

    • INGRESS_NAMESPACE con el espacio de nombres de tu servicio de entrada, istio-ingressgateway. Especifica el espacio de nombres istio-system si has instalado Cloud Service Mesh con la configuración predeterminada.
    • SECRET_NAME con el nombre que quieras usar para tu secreto de Kubernetes.
    • PRIVATE_KEY.pem con el nombre del archivo que contiene la clave privada de tu certificado.
    • FULL_CHAIN.pem con el nombre del archivo que contiene tu certificado público.

Ahora puedes configurar la puerta de enlace de entrada para que use el secreto que acabas de crear para tu certificado TLS.

Configurar la pasarela de entrada para usar tus certificados

Modifica la pasarela de entrada de Cloud Service Mesh para que use el secreto que has creado para tus certificados TLS:

  1. Abre el archivo YAML de la pasarela de entrada en modo de edición ejecutando el siguiente comando:

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving

    Ejemplo de configuración de la pasarela de entrada predeterminada:

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      ...
      # other skipped configuration
      ...
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - '*'
        port:
          name: http
          number: 80
          protocol: HTTP
    
  2. Configura la puerta de enlace de entrada para que use tu secreto añadiendo los atributos hosts, port y tls al archivo YAML.

    • Para configurar todos los servicios de forma que usen el mismo secreto, añade lo siguiente a tu configuración YAML y especifica "*" como valor del atributo hosts:

      ...
      # other skipped configuration
      ...
      - hosts:
        - "*"
        port:
          name: https
          number: 443
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      Sustituye SECRET_NAME por el nombre del secreto que has creado.

      Consulta un ejemplo.

    • Para configurar cada uno de tus servicios individualmente, añade lo siguiente a tu configuración YAML y especifica los valores de los atributos hosts con el nombre y el espacio de nombres del servicio:

      Para cada servicio, especifique los valores de los atributos hosts, port y tls:

      ...
      # other skipped configuration
      ...
      - hosts:
        - SERVICE_NAME.SERVICE_NAMESPACE.CUSTOM_DOMAIN
        port:
          number: 443
          name: https-SERVICE_NAME
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      Sustituye:

      • SERVICE_NAME con el nombre del servicio de Knative. Cada servicio que use la pasarela de entrada para servir tráfico externo debe configurarse individualmente.
      • SERVICE_NAMESPACE con el nombre del espacio de nombres en el que se ejecuta el servicio.
      • CUSTOM_DOMAIN con el dominio personalizado para el que has configurado el servicio.
      • SECRET_NAME con el nombre del secreto que quieras que use el servicio. Si has creado varios secretos para diferentes conjuntos de certificados TLS, puedes especificar qué secreto usa cada servicio.

      Consulta un ejemplo.

  3. Guarda los cambios.

Ahora puedes usar el protocolo HTTPS para acceder a los servicios de Knative Serving que hayas desplegado.

Ejemplos

Configurar todos los servicios:

En este ejemplo se muestra cómo configurar todos los servicios para que usen el secreto TLSsecret:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
      - "*"
      port:
        name: http
        number: 80
        protocol: HTTP
    - hosts:
      - "*"
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: TLSsecret
Configura servicios concretos:

En este ejemplo se muestra cómo configurar individualmente los tres servicios que sirven tráfico de Internet:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - "*"
    port:
      name: http
      number: 80
      protocol: HTTP
  - hosts:
    - prodservice.prodnamespace.my-custom-domain.com
    port:
      number: 443
      name: https-prodservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - experiment.namespace.my-custom-domain.com
    port:
      number: 443
      name: https-experiment
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - fallbackservice.anothernamespace.my-custom-domain.com
    port:
      number: 443
      name: https-fallbackservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: anotherTLSsecret