4.5. Routage externe et entrant
4.5.1. Aperçu du routage Copier lienLien copié sur presse-papiers!
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.2. Personnalisation des étiquettes et des annotations Copier lienLien copié sur presse-papiers!
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 Copier lienLien copié sur presse-papiers!
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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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>
$ kn service create <service_name> \ --image=<image> \ --annotation <annotation_name>=<annotation_value> \ --label <label_value>=<label_value>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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> \ -l serving.knative.openshift.io/ingressNamespace=<service_namespace> \ -n knative-serving-ingress -o yaml \ | grep -e "<label_name>: \"<label_value>\"" -e "<annotation_name>: <annotation_value>"
$ 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 Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5.3. Configuration des routes pour les services Knative Copier lienLien copié sur presse-papiers!
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.
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 Copier lienLien copié sur presse-papiers!
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
Créer un service Knative qui inclut l'annotation
serving.knative.openshift.io/disableRoute=true
:ImportantL'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 deReady
. 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.Créer une ressource Knative
Service
:Exemple de ressource
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Appliquer la ressource
Service
:oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ kn service create <service_name> \ --image=gcr.io/knative-samples/helloworld-go \ --annotation serving.knative.openshift.io/disableRoute=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
$ $ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vous obtiendrez le résultat suivant :
No resources found in knative-serving-ingress namespace.
No resources found in knative-serving-ingress namespace.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer une ressource
Route
dans l'espace de nomsknative-serving-ingress
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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.
Appliquer la ressource
Route
:oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5.4. Redirection HTTPS globale Copier lienLien copié sur presse-papiers!
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 Copier lienLien copié sur presse-papiers!
Exemple KnativeServing
CR qui active la redirection HTTPS
4.5.5. Schéma d'URL pour les routes externes Copier lienLien copié sur presse-papiers!
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 Copier lienLien copié sur presse-papiers!
Spécification par défaut
Vous pouvez remplacer la spécification par défaut d'utiliser HTTP en modifiant la clé default-external-scheme
:
Spécification d'annulation HTTP
4.5.6. Redirection HTTPS par service Copier lienLien copié sur presse-papiers!
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 Copier lienLien copié sur presse-papiers!
L'exemple suivant montre comment utiliser cette annotation dans un objet YAML Knative Service
:
4.5.7. Disponibilité locale du cluster Copier lienLien copié sur presse-papiers!
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.
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 Copier lienLien copié sur presse-papiers!
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
oc label ksvc <service_name> networking.knative.dev/visibility=cluster-local
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
$ oc get ksvc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME URL LATESTCREATED LATESTREADY READY REASON hello http://hello.default.svc.cluster.local hello-tx2g7 hello-tx2g7 True
NAME URL LATESTCREATED LATESTREADY READY REASON hello http://hello.default.svc.cluster.local hello-tx2g7 hello-tx2g7 True
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5.7.2. Activation de l'authentification TLS pour les services locaux du cluster Copier lienLien copié sur presse-papiers!
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
Déployer les certificats de serveur dans l'espace de noms
knative-serving-ingress
:export san="knative"
$ export san="knative"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NoteLa validation du nom alternatif du sujet (SAN) est nécessaire pour que ces certificats puissent transmettre la demande à
<app_name>.<namespace>.svc.cluster.local
.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
$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=Example/CN=Example' \ -keyout ca.key \ -out ca.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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"
$ openssl req -out tls.csr -newkey rsa:2048 -nodes -keyout tls.key \ -subj "/CN=Example/O=Example" \ -addext "subjectAltName = DNS:$san"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ openssl x509 -req -extfile <(printf "subjectAltName=DNS:$san") \ -days 365 -in tls.csr \ -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurez un secret pour la passerelle locale de Kourier :
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 -
$ oc create -n knative-serving-ingress secret tls server-certs \ --key=tls.key \ --cert=tls.crt --dry-run=client -o yaml | oc apply -f -
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Mettre à jour la spécification de la ressource personnalisée (CR)
KnativeServing
pour utiliser le secret créé par la passerelle Kourier :Exemple KnativeServing CR
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 Copier lienLien copié sur presse-papiers!
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
4.5.8.1. Définition du type de service de la passerelle Kourier Copier lienLien copié sur presse-papiers!
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
4.5.9. Utilisation de HTTP2 et gRPC Copier lienLien copié sur presse-papiers!
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 Copier lienLien copié sur presse-papiers!
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
Ajoutez l'annotation
serverless.openshift.io/default-enable-http2=true
à la ressource personnaliséeKnativeServing
:oc annotate knativeserving <your_knative_CR> -n knative-serving serverless.openshift.io/default-enable-http2=true
oc annotate knativeserving <your_knative_CR> -n knative-serving serverless.openshift.io/default-enable-http2=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Après l'ajout de l'annotation, vous pouvez vérifier que la valeur
appProtocol
du service Kourier esth2c
:oc get svc -n knative-serving-ingress kourier -o jsonpath="{.spec.ports[0].appProtocol}"
$ oc get svc -n knative-serving-ingress kourier -o jsonpath="{.spec.ports[0].appProtocol}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
h2c
h2c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vous pouvez désormais utiliser le cadre gRPC sur le protocole HTTP/2 pour le trafic externe, par exemple :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5.9.2. Interagir avec une application sans serveur en utilisant HTTP2 et gRPC dans OpenShift Container Platform 4.9 et plus Copier lienLien copié sur presse-papiers!
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
:
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
- Trouvez l'hôte de l'application. Voir les instructions dans Verifying your serverless application deployment.
Recherchez l'adresse publique de la passerelle d'entrée :
oc -n knative-serving-ingress get svc kourier
$ oc -n knative-serving-ingress get svc kourier
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow L'adresse publique apparaît dans le champ
EXTERNAL-IP
et, dans ce cas, il s'agit dea83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com
.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
$ curl -H "Host: hello-default.example.com" a83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Hello Serverless!
Hello Serverless!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vous pouvez également effectuer une requête gRPC directe auprès de la passerelle d'entrée :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NoteVeillez à ajouter le port correspondant, 80 par défaut, aux deux hôtes, comme indiqué dans l'exemple précédent.