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
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>
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
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.
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
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
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: <service_name> annotations: serving.knative.openshift.io/disableRoute: "true" spec: template: spec: containers: - image: <image> ...
Appliquer la ressource
Service
:$ oc apply -f <filename>
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
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.
Créer une ressource
Route
dans l'espace de nomsknative-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.
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.
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
Déployer les certificats de serveur dans l'espace de noms
knative-serving-ingress
:$ export san="knative"
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
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"
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
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 -
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
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
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}"
Exemple de sortie
h2c
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 )
Ressources supplémentaires
4.5.9.2. Interagir avec une application sans serveur en utilisant HTTP2 et gRPC dans OpenShift Container Platform 4.9 et plus
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
- 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
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 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
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(), )
NoteVeillez à ajouter le port correspondant, 80 par défaut, aux deux hôtes, comme indiqué dans l'exemple précédent.