Utiliser vos propres certificats TLS

Découvrez comment configurer Knative serving pour utiliser vos propres certificats SSL/TLS.

Vous pouvez également utiliser la fonctionnalité de certificats TLS gérés, qui crée et renouvelle automatiquement les certificats TLS via Let's Encrypt.

Pour utiliser vos propres certificats, stockez vos certificats TLS dans un secret Kubernetes, puis configurez la passerelle d'entrée de Cloud Service Mesh pour qu'elle utilise ce secret.

Avant de commencer

  • Dans ces instructions, nous partons du principe que vous avez déjà obtenu vos certificats TLS.
  • Vous devez configurer un domaine personnalisé (pour en savoir plus, consultez la page Mapper des domaines personnalisés)
  • Vous devez configurer chacun de vos services Knative serving qui utilisent la passerelle d'entrée pour diffuser le trafic externe. Si ces services externes ne sont pas configurés pour utiliser vos certificats TLS, ils ne pourront pas valider une connexion HTTPS et n'atteindront jamais l'état ready.

Stocker des certificats TLS dans un secret Kubernetes

Pour stocker des certificats dans un secret, procédez comme suit :

  1. Ouvrez un terminal et accédez au répertoire dans lequel se trouvent vos certificats TLS.

  2. Utilisez la commande suivante pour créer un secret qui stocke vos certificats :

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

    Remplacez :

    • INGRESS_NAMESPACE par l'espace de noms de votre service d'entrée, istio-ingressgateway. Spécifiez l'espace de noms istio-system si vous avez installé Cloud Service Mesh à l'aide de la configuration par défaut.
    • SECRET_NAME par le nom que vous souhaitez utiliser pour votre secret Kubernetes.
    • PRIVATE_KEY.pem par le nom du fichier contenant votre clé privée de certificat.
    • FULL_CHAIN.pem par le nom du fichier contenant votre certificat public.

Vous pouvez maintenant configurer la passerelle d'entrée pour qu'elle utilise le secret que vous venez de créer pour votre certificat TLS.

Configurer la passerelle d'entrée pour qu'elle utilise vos certificats

Modifiez la passerelle d'entrée de Cloud Service Mesh pour qu'elle utilise le secret que vous avez créé pour vos certificats TLS :

  1. Ouvrez le fichier YAML de la passerelle d'entrée en mode Édition en exécutant la commande suivante :

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

    Exemple de configuration de passerelle d'entrée par défaut :

    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. Configurez la passerelle d'entrée pour qu'elle utilise votre secret en ajoutant les attributs hosts, port et tls au fichier YAML existant.

    • Pour configurer tous les services de sorte qu'ils utilisent le même code secret : ajoutez les éléments suivants à votre configuration YAML et spécifiez "*" comme valeur d'attribut hosts :

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

      Remplacez SECRET_NAME par le nom du secret que vous avez créé.

      Voir l'exemple

    • Pour configurer individuellement chacun de vos services : ajoutez les éléments suivants à votre configuration YAML et spécifiez les valeurs des attributs hosts à l'aide du nom et de l'espace de noms du service :

      Pour chaque service, vous spécifiez des valeurs pour les attributs hosts, port et 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
      

      Remplacez :

      • SERVICE_NAME par le nom du service Knative serving. Chaque service utilisant la passerelle d'entrée pour diffuser le trafic externe doit être configuré individuellement.
      • SERVICE_NAMESPACE par le nom de l'espace de noms dans lequel le service est exécuté.
      • CUSTOM_DOMAIN par le domaine personnalisé pour lequel vous avez configuré le service à utiliser.
      • SECRET_NAME par le nom du secret que vous souhaitez que le service utilise. Si vous avez créé plusieurs secrets pour différents ensembles de certificats TLS, vous pouvez spécifier le secret utilisé par chaque service.

      Voir l'exemple

  3. Enregistrez les modifications.

Vous pouvez désormais utiliser le protocole HTTPS pour accéder à vos services Knative serving déployés.

Exemples

Configurez tous les services :

Cet exemple montre comment configurer tous les services pour qu'ils utilisent le secret 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
Configurez les services individuels :

Cet exemple montre comment configurer individuellement les trois services qui diffusent le trafic 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