4.5. Routage externe et entrant


4.5.1. Aperçu du routage

Knative exploite la terminaison TLS de OpenShift Container Platform pour assurer le routage des services Knative. Lorsqu'un service Knative est créé, une route OpenShift Container Platform est automatiquement créée pour le service. Cette route est gérée par l'opérateur OpenShift Serverless. La route OpenShift Container Platform expose le service Knative à travers le même domaine que le cluster OpenShift Container Platform.

Vous pouvez désactiver le contrôle par l'opérateur du routage d'OpenShift Container Platform afin de configurer une route Knative pour utiliser directement vos certificats TLS à la place.

Les routes Knative peuvent également être utilisées avec la route OpenShift Container Platform pour fournir des capacités de routage plus fines, telles que la division du trafic.

4.5.1.1. Ressources supplémentaires

4.5.2. Personnalisation des étiquettes et des annotations

Les routes OpenShift Container Platform prennent en charge l'utilisation d'étiquettes et d'annotations personnalisées, que vous pouvez configurer en modifiant la spécification metadata d'un service Knative. Les labels et annotations personnalisés sont propagés du service à la route Knative, puis à l'ingress Knative et enfin à la route OpenShift Container Platform.

4.5.2.1. Personnaliser les étiquettes et les annotations pour les routes de OpenShift Container Platform

Conditions préalables

  • Vous devez avoir l'OpenShift Serverless Operator et Knative Serving installés sur votre cluster OpenShift Container Platform.
  • Installez le CLI OpenShift (oc).

Procédure

  1. Créez un service Knative qui contient l'étiquette ou l'annotation que vous souhaitez propager à la route OpenShift Container Platform :

    • Pour créer un service en utilisant YAML :

      Exemple de service créé à l'aide de YAML

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: <service_name>
        labels:
          <label_name>: <label_value>
        annotations:
          <annotation_name>: <annotation_value>
      ...

    • Pour créer un service en utilisant le CLI Knative (kn), entrez :

      Exemple de service créé à l'aide d'une commande kn

      $ kn service create <service_name> \
        --image=<image> \
        --annotation <annotation_name>=<annotation_value> \
        --label <label_value>=<label_value>

  2. Vérifiez que la route OpenShift Container Platform a été créée avec l'annotation ou l'étiquette que vous avez ajoutée en inspectant la sortie de la commande suivante :

    Exemple de commande de vérification

    $ oc get routes.route.openshift.io \
         -l serving.knative.openshift.io/ingressName=<service_name> \ 1
         -l serving.knative.openshift.io/ingressNamespace=<service_namespace> \ 2
         -n knative-serving-ingress -o yaml \
             | grep -e "<label_name>: \"<label_value>\""  -e "<annotation_name>: <annotation_value>" 3

    1
    Utilisez le nom de votre service.
    2
    Utilisez l'espace de noms dans lequel votre service a été créé.
    3
    Utilisez vos valeurs pour les noms et valeurs de l'étiquette et de l'annotation.

4.5.3. Configuration des routes pour les services Knative

Si vous souhaitez configurer un service Knative pour utiliser votre certificat TLS sur OpenShift Container Platform, vous devez désactiver la création automatique d'une route pour le service par OpenShift Serverless Operator et créer manuellement une route pour le service.

Note

Lorsque vous effectuez la procédure suivante, la route par défaut d'OpenShift Container Platform dans l'espace de noms knative-serving-ingress n'est pas créée. Cependant, la route Knative pour l'application est toujours créée dans cet espace de noms.

4.5.3.1. Configurer les routes de OpenShift Container Platform pour les services Knative

Conditions préalables

  • L'opérateur OpenShift Serverless et le composant Knative Serving doivent être installés sur votre cluster OpenShift Container Platform.
  • Installez le CLI OpenShift (oc).

Procédure

  1. Créer un service Knative qui inclut l'annotation serving.knative.openshift.io/disableRoute=true:

    Important

    L'annotation serving.knative.openshift.io/disableRoute=true indique à OpenShift Serverless de ne pas créer automatiquement une route pour vous. Cependant, le service affiche toujours une URL et atteint un statut de Ready. Cette URL ne fonctionne pas en externe jusqu'à ce que vous créiez votre propre route avec le même nom d'hôte que le nom d'hôte dans l'URL.

    1. Créer une ressource Knative Service:

      Exemple de ressource

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: <service_name>
        annotations:
          serving.knative.openshift.io/disableRoute: "true"
      spec:
        template:
          spec:
            containers:
            - image: <image>
      ...

    2. Appliquer la ressource Service:

      $ oc apply -f <filename>
    3. Facultatif. Créez un service Knative à l'aide de la commande kn service create:

      Exemple de commande kn

      $ kn service create <service_name> \
        --image=gcr.io/knative-samples/helloworld-go \
        --annotation serving.knative.openshift.io/disableRoute=true

  2. Vérifiez qu'aucune route OpenShift Container Platform n'a été créée pour le service :

    Example command

    $ $ oc get routes.route.openshift.io \
      -l serving.knative.openshift.io/ingressName=$KSERVICE_NAME \
      -l serving.knative.openshift.io/ingressNamespace=$KSERVICE_NAMESPACE \
      -n knative-serving-ingress

    Vous obtiendrez le résultat suivant :

    No resources found in knative-serving-ingress namespace.
  3. Créer une ressource Route dans l'espace de noms knative-serving-ingress:

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      annotations:
        haproxy.router.openshift.io/timeout: 600s 1
      name: <route_name> 2
      namespace: knative-serving-ingress 3
    spec:
      host: <service_host> 4
      port:
        targetPort: http2
      to:
        kind: Service
        name: kourier
        weight: 100
      tls:
        insecureEdgeTerminationPolicy: Allow
        termination: edge 5
        key: |-
          -----BEGIN PRIVATE KEY-----
          [...]
          -----END PRIVATE KEY-----
        certificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----
        caCertificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE----
      wildcardPolicy: None
    1
    La valeur du délai d'attente pour la route OpenShift Container Platform. Vous devez définir la même valeur que le paramètre max-revision-timeout-seconds (600s par défaut).
    2
    Le nom de la route OpenShift Container Platform.
    3
    L'espace de noms pour la route OpenShift Container Platform. Il doit s'agir de knative-serving-ingress.
    4
    Le nom d'hôte pour l'accès externe. Vous pouvez le définir sur <service_name>-<service_namespace>.<domain>.
    5
    Les certificats que vous souhaitez utiliser. Actuellement, seule la terminaison edge est prise en charge.
  4. Appliquer la ressource Route:

    $ oc apply -f <filename>

4.5.4. Redirection HTTPS globale

La redirection HTTPS permet de rediriger les requêtes HTTP entrantes. Ces requêtes HTTP redirigées sont cryptées. Vous pouvez activer la redirection HTTPS pour tous les services du cluster en configurant la spécification httpProtocol pour la ressource personnalisée (CR) KnativeServing.

4.5.4.1. Paramètres globaux de la redirection HTTPS

Exemple KnativeServing CR qui active la redirection HTTPS

apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
spec:
  config:
    network:
      httpProtocol: "redirected"
...

4.5.5. Schéma d'URL pour les routes externes

Le schéma d'URL des itinéraires externes est par défaut HTTPS pour une meilleure sécurité. Ce schéma est déterminé par la clé default-external-scheme dans la spécification des ressources personnalisées (CR) KnativeServing.

4.5.5.1. Définition du schéma d'URL pour les itinéraires externes

Spécification par défaut

...
spec:
  config:
    network:
      default-external-scheme: "https"
...

Vous pouvez remplacer la spécification par défaut d'utiliser HTTP en modifiant la clé default-external-scheme:

Spécification d'annulation HTTP

...
spec:
  config:
    network:
      default-external-scheme: "http"
...

4.5.6. Redirection HTTPS par service

Vous pouvez activer ou désactiver la redirection HTTPS pour un service en configurant l'annotation networking.knative.dev/http-option.

4.5.6.1. Redirection de HTTPS pour un service

L'exemple suivant montre comment utiliser cette annotation dans un objet YAML Knative Service:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example
  namespace: default
  annotations:
    networking.knative.dev/http-option: "redirected"
spec:
  ...

4.5.7. Disponibilité locale du cluster

Par défaut, les services Knative sont publiés sur une adresse IP publique. Le fait d'être publié sur une adresse IP publique signifie que les services Knative sont des applications publiques et qu'ils ont une URL accessible au public.

Les URL accessibles au public sont accessibles depuis l'extérieur du cluster. Cependant, les développeurs peuvent avoir besoin de construire des services back-end qui ne sont accessibles que depuis l'intérieur du cluster, connus sous le nom de private services. Les développeurs peuvent étiqueter des services individuels dans le cluster avec l'étiquette networking.knative.dev/visibility=cluster-local pour les rendre privés.

Important

Pour OpenShift Serverless 1.15.0 et les versions plus récentes, le label serving.knative.dev/visibility n'est plus disponible. Vous devez mettre à jour les services existants pour utiliser le label networking.knative.dev/visibility à la place.

4.5.7.1. Paramétrage de la disponibilité du cluster sur le cluster local

Conditions préalables

  • L'opérateur OpenShift Serverless et Knative Serving sont installés sur le cluster.
  • Vous avez créé un service Knative.

Procédure

  • Définissez la visibilité de votre service en ajoutant le label networking.knative.dev/visibility=cluster-local:

    oc label ksvc <service_name> networking.knative.dev/visibility=cluster-local

Vérification

  • Vérifiez que l'URL de votre service est maintenant au format http://<service_name>.<namespace>.svc.cluster.local, en entrant la commande suivante et en examinant la sortie :

    $ oc get ksvc

    Exemple de sortie

    NAME            URL                                                                         LATESTCREATED     LATESTREADY       READY   REASON
    hello           http://hello.default.svc.cluster.local                                      hello-tx2g7       hello-tx2g7       True

4.5.7.2. Activation de l'authentification TLS pour les services locaux du cluster

Pour les services locaux du cluster, la passerelle locale Kourier kourier-internal est utilisée. Si vous souhaitez utiliser le trafic TLS avec la passerelle locale Kourier, vous devez configurer vos propres certificats de serveur dans la passerelle locale.

Conditions préalables

  • Vous avez installé OpenShift Serverless Operator et Knative Serving.
  • Vous avez des droits d'administrateur.
  • Vous avez installé le CLI OpenShift (oc).

Procédure

  1. Déployer les certificats de serveur dans l'espace de noms knative-serving-ingress:

    $ export san="knative"
    Note

    La validation du nom alternatif du sujet (SAN) est nécessaire pour que ces certificats puissent transmettre la demande à <app_name>.<namespace>.svc.cluster.local.

  2. Générer une clé racine et un certificat :

    $ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \
        -subj '/O=Example/CN=Example' \
        -keyout ca.key \
        -out ca.crt
  3. Générer une clé de serveur qui utilise la validation SAN :

    $ openssl req -out tls.csr -newkey rsa:2048 -nodes -keyout tls.key \
      -subj "/CN=Example/O=Example" \
      -addext "subjectAltName = DNS:$san"
  4. Créer des certificats de serveur :

    $ openssl x509 -req -extfile <(printf "subjectAltName=DNS:$san") \
      -days 365 -in tls.csr \
      -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt
  5. Configurez un secret pour la passerelle locale de Kourier :

    1. Déployer un secret dans l'espace de noms knative-serving-ingress à partir des certificats créés lors des étapes précédentes :

      $ oc create -n knative-serving-ingress secret tls server-certs \
          --key=tls.key \
          --cert=tls.crt --dry-run=client -o yaml | oc apply -f -
    2. Mettre à jour la spécification de la ressource personnalisée (CR) KnativeServing pour utiliser le secret créé par la passerelle Kourier :

      Exemple KnativeServing CR

      ...
      spec:
        config:
          kourier:
            cluster-cert-secret: server-certs
      ...

Le contrôleur Kourier établit le certificat sans redémarrer le service, de sorte qu'il n'est pas nécessaire de redémarrer le pod.

Vous pouvez accéder au service interne de Kourier avec TLS via le port 443 en montant et en utilisant le site ca.crt à partir du client.

4.5.8. Type de service de la passerelle Kourier

La passerelle Kourier est exposée par défaut en tant que type de service ClusterIP. Ce type de service est déterminé par la spécification d'entrée service-type dans la ressource personnalisée (CR) KnativeServing.

Spécification par défaut

...
spec:
  ingress:
    kourier:
      service-type: ClusterIP
...

4.5.8.1. Définition du type de service de la passerelle Kourier

Vous pouvez remplacer le type de service par défaut par un type de service d'équilibreur de charge en modifiant la spécification service-type:

Spécification de l'override LoadBalancer

...
spec:
  ingress:
    kourier:
      service-type: LoadBalancer
...

4.5.9. Utilisation de HTTP2 et gRPC

OpenShift Serverless ne prend en charge que les itinéraires non sécurisés ou terminés par des bords. Les routes non sécurisées ou terminées par un bord ne supportent pas HTTP2 sur OpenShift Container Platform. Ces itinéraires ne prennent pas non plus en charge gRPC, car gRPC est transporté par HTTP2. Si vous utilisez ces protocoles dans votre application, vous devez appeler l'application en utilisant directement la passerelle d'entrée. Pour ce faire, vous devez trouver l'adresse publique de la passerelle d'entrée et l'hôte spécifique de l'application.

4.5.9.1. Interagir avec une application sans serveur en utilisant HTTP2 et gRPC

Important

Cette méthode s'applique à OpenShift Container Platform 4.10 et aux versions ultérieures. Pour les versions antérieures, voir la section suivante.

Conditions préalables

  • Installez OpenShift Serverless Operator et Knative Serving sur votre cluster.
  • Installez le CLI OpenShift (oc).
  • Créer un service Knative.
  • Mettez à jour OpenShift Container Platform 4.10 ou une version ultérieure.
  • Activer HTTP/2 sur le contrôleur OpenShift Ingress.

Procédure

  1. Ajoutez l'annotation serverless.openshift.io/default-enable-http2=true à la ressource personnalisée KnativeServing:

    oc annotate knativeserving <your_knative_CR> -n knative-serving serverless.openshift.io/default-enable-http2=true
  2. Après l'ajout de l'annotation, vous pouvez vérifier que la valeur appProtocol du service Kourier est h2c:

    $ oc get svc -n knative-serving-ingress kourier -o jsonpath="{.spec.ports[0].appProtocol}"

    Exemple de sortie

    h2c

  3. Vous pouvez désormais utiliser le cadre gRPC sur le protocole HTTP/2 pour le trafic externe, par exemple :

    import "google.golang.org/grpc"
    
    grpc.Dial(
       YOUR_URL, 1
       grpc.WithTransportCredentials(insecure.NewCredentials())), 2
    )
    1
    Votre URL ksvc.
    2
    Votre certificat.

4.5.9.2. Interagir avec une application sans serveur en utilisant HTTP2 et gRPC dans OpenShift Container Platform 4.9 et plus

Important

Cette méthode doit exposer la passerelle Kourier en utilisant le type de service LoadBalancer. Vous pouvez configurer cela en ajoutant le fichier YAML suivant à votre définition de ressource personnalisée (CRD) KnativeServing:

...
spec:
  ingress:
    kourier:
      service-type: LoadBalancer
...

Conditions préalables

  • Installez OpenShift Serverless Operator et Knative Serving sur votre cluster.
  • Installez le CLI OpenShift (oc).
  • Créer un service Knative.

Procédure

  1. Trouvez l'hôte de l'application. Voir les instructions dans Verifying your serverless application deployment.
  2. Recherchez l'adresse publique de la passerelle d'entrée :

    $ oc -n knative-serving-ingress get svc kourier

    Exemple de sortie

    NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                                             PORT(S)                                                                                                                                      AGE
    kourier   LoadBalancer   172.30.51.103   a83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com   80:31380/TCP,443:31390/TCP   67m

    L'adresse publique apparaît dans le champ EXTERNAL-IP et, dans ce cas, il s'agit de a83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com.

  3. Définissez manuellement l'en-tête host de votre requête HTTP sur l'hôte de l'application, mais dirigez la requête elle-même vers l'adresse publique de la passerelle d'entrée.

    $ curl -H "Host: hello-default.example.com" a83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com

    Exemple de sortie

    Hello Serverless!

    Vous pouvez également effectuer une requête gRPC directe auprès de la passerelle d'entrée :

    import "google.golang.org/grpc"
    
    grpc.Dial(
        "a83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com:80",
        grpc.WithAuthority("hello-default.example.com:80"),
        grpc.WithInsecure(),
    )
    Note

    Veillez à ajouter le port correspondant, 80 par défaut, aux deux hôtes, comme indiqué dans l'exemple précédent.

Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.