4.4. Fractionnement du trafic
4.4.1. Vue d'ensemble du fractionnement du trafic
Dans une application Knative, le trafic peut être géré en créant une division du trafic. Un partage de trafic est configuré comme une partie d'une route, qui est gérée par un service Knative.
La configuration d'une route permet d'envoyer des requêtes à différentes révisions d'un service. Ce routage est déterminé par la spécification traffic
de l'objet Service
.
Une déclaration de spécification traffic
consiste en une ou plusieurs révisions, chacune étant responsable de la gestion d'une partie du trafic global. Les pourcentages de trafic acheminés vers chaque révision doivent être égaux à 100 %, ce qui est garanti par une validation Knative.
Les révisions spécifiées dans une spécification traffic
peuvent être soit une révision fixe et nommée, soit pointer vers la "dernière" révision, qui suit la tête de la liste de toutes les révisions pour le service. La révision "la plus récente" est un type de référence flottante qui se met à jour si une nouvelle révision est créée. Chaque révision peut être associée à une balise qui crée une URL d'accès supplémentaire pour cette révision.
La spécification traffic
peut être modifiée par :
-
Éditer directement le YAML d'un objet
Service
. -
Utilisation de l'indicateur Knative (
kn
) CLI--traffic
. - Utilisation de la console web OpenShift Container Platform.
Lorsque vous créez un service Knative, il n'a pas de paramètres par défaut traffic
spec.
4.4.2. Exemples de spécifications de trafic
L'exemple suivant montre une spécification traffic
où 100 % du trafic est acheminé vers la dernière révision du service. Sous status
, vous pouvez voir le nom de la dernière révision à laquelle latestRevision
se réfère :
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: example-service namespace: default spec: ... traffic: - latestRevision: true percent: 100 status: ... traffic: - percent: 100 revisionName: example-service
L'exemple suivant montre une spécification traffic
où 100 % du trafic est acheminé vers la révision étiquetée current
, et le nom de cette révision est spécifié comme example-service
. La révision étiquetée latest
reste disponible, même si aucun trafic n'est acheminé vers elle :
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: example-service namespace: default spec: ... traffic: - tag: current revisionName: example-service percent: 100 - tag: latest latestRevision: true percent: 0
L'exemple suivant montre comment la liste des révisions de la spécification traffic
peut être étendue pour que le trafic soit réparti entre plusieurs révisions. Cet exemple envoie 50 % du trafic à la révision étiquetée current
, et 50 % du trafic à la révision étiquetée candidate
. La révision étiquetée latest
reste disponible, même si aucun trafic n'est acheminé vers elle :
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: example-service namespace: default spec: ... traffic: - tag: current revisionName: example-service-1 percent: 50 - tag: candidate revisionName: example-service-2 percent: 50 - tag: latest latestRevision: true percent: 0
4.4.3. Fractionnement du trafic à l'aide de la CLI Knative
L'utilisation de la CLI Knative (kn
) pour créer des scissions de trafic offre une interface utilisateur plus rationnelle et plus intuitive que la modification directe des fichiers YAML. Vous pouvez utiliser la commande kn service update
pour diviser le trafic entre les révisions d'un service.
4.4.3.1. Création d'une division du trafic à l'aide du CLI Knative
Conditions préalables
- L'opérateur OpenShift Serverless et Knative Serving sont installés sur votre cluster.
-
Vous avez installé le CLI Knative (
kn
). - Vous avez créé un service Knative.
Procédure
Spécifiez la révision de votre service et le pourcentage de trafic que vous voulez acheminer vers lui en utilisant la balise
--traffic
avec une commande standardkn service update
:Example command
$ kn service update <service_name> --traffic <revision>=<percentage>
Où ?
-
<service_name>
est le nom du service Knative pour lequel vous configurez le routage du trafic. -
<revision>
est la révision que vous souhaitez configurer pour recevoir un pourcentage du trafic. Vous pouvez spécifier soit le nom de la révision, soit une étiquette que vous avez attribuée à la révision en utilisant l'indicateur--tag
. -
<percentage>
est le pourcentage de trafic que vous souhaitez envoyer à la révision spécifiée.
-
Facultatif : L'indicateur
--traffic
peut être spécifié plusieurs fois dans une commande. Par exemple, si vous avez une révision étiquetée comme@latest
et une révision nomméestable
, vous pouvez spécifier le pourcentage de trafic que vous voulez répartir sur chaque révision comme suit :Example command
$ kn service update example-service --traffic @latest=20,stable=80
Si vous avez plusieurs révisions et que vous ne spécifiez pas le pourcentage de trafic qui doit être attribué à la dernière révision, l'indicateur
--traffic
peut le calculer automatiquement. Par exemple, si vous avez une troisième révision nomméeexample
, et que vous utilisez la commande suivante :Example command
$ kn service update example-service --traffic @latest=10,stable=60
Les 30 % restants du trafic sont répartis sur la révision
example
, même si elle n'a pas été spécifiée.
4.4.4. Indicateurs CLI pour la répartition du trafic
La CLI Knative (kn
) prend en charge les opérations de trafic sur le bloc de trafic d'un service dans le cadre de la commande kn service update
.
4.4.4.1. Drapeaux de division du trafic de la CLI Knative
Le tableau suivant présente un résumé des indicateurs de répartition du trafic, des formats de valeur et de l'opération effectuée par l'indicateur. La colonne Repetition indique si la répétition de la valeur particulière de l'indicateur est autorisée dans une commande kn service update
.
Drapeau | Valeur(s) | Fonctionnement | Répétition |
---|---|---|---|
|
|
Donne à | Oui |
|
|
Donne le trafic | Oui |
|
|
| Non |
|
|
Donne | Oui |
|
|
Donne | Non |
|
|
Supprime | Oui |
4.4.4.1.1. Drapeaux multiples et ordre de préséance
Tous les indicateurs relatifs au trafic peuvent être spécifiés à l'aide d'une seule commande kn service update
. kn
définit la priorité de ces indicateurs. L'ordre des indicateurs spécifiés lors de l'utilisation de la commande n'est pas pris en compte.
La priorité des drapeaux tels qu'ils sont évalués par kn
est la suivante :
-
--untag
: Toutes les révisions référencées avec cet indicateur sont supprimées du bloc de trafic. -
--tag
: Les révisions sont étiquetées comme spécifié dans le bloc de trafic. -
--traffic
: Les révisions référencées se voient attribuer une partie de la répartition du trafic.
Vous pouvez ajouter des balises aux révisions et diviser le trafic en fonction des balises que vous avez définies.
4.4.4.1.2. URL personnalisés pour les révisions
L'attribution de l'indicateur --tag
à un service à l'aide de la commande kn service update
crée une URL personnalisée pour la révision qui est créée lorsque vous mettez à jour le service. L'URL personnalisée suit le modèle https://<tag>-<service_name>-<namespace>.<domain>
ou http://<tag>-<service_name>-<namespace>.<domain>
.
Les drapeaux --tag
et --untag
utilisent la syntaxe suivante :
- Exiger une valeur.
- Indique une balise unique dans le bloc de trafic du service.
- Peut être spécifié plusieurs fois dans une même commande.
4.4.4.1.2.1. Exemple : Attribuer une étiquette à une révision
L'exemple suivant attribue l'étiquette latest
à une révision nommée example-revision
:
$ kn service update -YRFFGUNA nom_du_service> --tag @latest=example-tag
4.4.4.1.2.2. Exemple : Supprimer une balise d'une révision
Vous pouvez supprimer une balise pour supprimer l'URL personnalisée, en utilisant l'indicateur --untag
.
Si les balises d'une révision sont supprimées et que 0 % du trafic lui est attribué, la révision est entièrement supprimée du bloc de trafic.
La commande suivante supprime toutes les balises de la révision nommée example-revision
:
$ kn service update -YRFFGUNA nom_du_service> --untag exemple-tag
4.4.5. Diviser le trafic entre les révisions
Après avoir créé une application sans serveur, l'application est affichée dans la vue Topology de la perspective Developer dans la console web d'OpenShift Container Platform. La révision de l'application est représentée par le nœud, et le service Knative est indiqué par un quadrilatère autour du nœud.
Toute nouvelle modification du code ou de la configuration du service crée une nouvelle révision, qui est un instantané du code à un moment donné. Pour un service, vous pouvez gérer le trafic entre les révisions du service en le divisant et en l'acheminant vers les différentes révisions selon les besoins.
4.4.5.1. Gérer le trafic entre les révisions en utilisant la console web d'OpenShift Container Platform
Conditions préalables
- L'opérateur OpenShift Serverless et Knative Serving sont installés sur votre cluster.
- Vous vous êtes connecté à la console web de OpenShift Container Platform.
Procédure
Pour répartir le trafic entre plusieurs révisions d'une application dans la vue Topology:
- Cliquez sur le service Knative pour voir son aperçu dans le panneau latéral.
Cliquez sur l'onglet Resources pour obtenir une liste de Revisions et Routes pour le service.
Figure 4.1. Application sans serveur
- Cliquez sur le service, indiqué par l'icône S en haut du panneau latéral, pour obtenir une vue d'ensemble des détails du service.
-
Cliquez sur l'onglet YAML et modifiez la configuration du service dans l'éditeur YAML, puis cliquez sur Save. Par exemple, changez le
timeoutseconds
de 300 à 301 . Cette modification de la configuration déclenche une nouvelle révision. Dans la vue Topology, la dernière révision est affichée et l'onglet Resources du service affiche maintenant les deux révisions. Dans l'onglet Resources, cliquez sur pour afficher la boîte de dialogue de distribution du trafic :
- Ajoutez le pourcentage de trafic divisé pour les deux révisions dans le champ Splits.
- Ajoutez des balises pour créer des URL personnalisées pour les deux révisions.
Cliquez sur Save pour voir apparaître deux nœuds représentant les deux révisions dans la vue Topologie.
Figure 4.2. Révisions d'applications sans serveur
4.4.6. Reroutage du trafic à l'aide de la stratégie bleu-vert
Vous pouvez réacheminer en toute sécurité le trafic d'une version de production d'une application vers une nouvelle version, en utilisant une stratégie de déploiement bleu-vert.
4.4.6.1. Routage et gestion du trafic grâce à une stratégie de déploiement bleu-vert
Conditions préalables
- L'opérateur OpenShift Serverless et Knative Serving sont installés sur le cluster.
-
Installez le CLI OpenShift (
oc
).
Procédure
- Créer et déployer une application en tant que service Knative.
Trouvez le nom de la première révision qui a été créée lorsque vous avez déployé le service, en consultant la sortie de la commande suivante :
$ oc get ksvc <service_name> -o=jsonpath='{.status.latestCreatedRevisionName}'
Example command
$ oc get ksvc example-service -o=jsonpath='{.status.latestCreatedRevisionName}'
Exemple de sortie
$ example-service-00001
Ajoutez le fichier YAML suivant au service
spec
pour envoyer le trafic entrant à la révision :... spec: traffic: - revisionName: <first_revision_name> percent: 100 # All traffic goes to this revision ...
Vérifiez que vous pouvez voir votre application à l'URL que vous obtenez en exécutant la commande suivante :
oc get ksvc -YRFFGUNA nom_du_service>
-
Déployez une deuxième révision de votre application en modifiant au moins un champ de la spécification
template
du service et en le redéployant. Par exemple, vous pouvez modifier l'adresseimage
du service, ou une variable d'environnementenv
. Vous pouvez redéployer le service en appliquant le fichier YAML du service, ou en utilisant la commandekn service update
si vous avez installé le CLI Knative (kn
). Recherchez le nom de la deuxième révision, la plus récente, qui a été créée lorsque vous avez redéployé le service, en exécutant la commande :
$ oc get ksvc <service_name> -o=jsonpath='{.status.latestCreatedRevisionName}'
À ce stade, les première et deuxième révisions du service sont déployées et fonctionnent.
Mettez à jour votre service existant pour créer un nouveau point d'arrivée test pour la deuxième révision, tout en continuant à envoyer tout le reste du trafic vers la première révision :
Exemple de spécification de service mise à jour avec point final de test
... spec: traffic: - revisionName: <first_revision_name> percent: 100 # All traffic is still being routed to the first revision - revisionName: <second_revision_name> percent: 0 # No traffic is routed to the second revision tag: v2 # A named route ...
Après avoir redéployé ce service en réappliquant la ressource YAML, la deuxième révision de l'application est maintenant mise en scène. Aucun trafic n'est acheminé vers la deuxième révision à l'URL principale, et Knative crée un nouveau service nommé
v2
pour tester la nouvelle révision déployée.Obtenez l'URL du nouveau service pour la deuxième révision, en exécutant la commande suivante :
$ oc get ksvc <service_name> --output jsonpath="{.status.traffic[*].url}"
Vous pouvez utiliser cette URL pour vérifier que la nouvelle version de l'application se comporte comme prévu avant d'y acheminer du trafic.
Mettez à nouveau à jour votre service existant, de sorte que 50 % du trafic soit envoyé à la première révision et 50 % à la seconde :
Exemple de spécification de service actualisée divisant le trafic 50/50 entre les révisions
... spec: traffic: - revisionName: <first_revision_name> percent: 50 - revisionName: <second_revision_name> percent: 50 tag: v2 ...
Lorsque vous êtes prêt à acheminer tout le trafic vers la nouvelle version de l'application, mettez à nouveau à jour le service pour envoyer 100 % du trafic vers la deuxième révision :
Exemple de spécification de service mise à jour envoyant tout le trafic à la deuxième révision
... spec: traffic: - revisionName: <first_revision_name> percent: 0 - revisionName: <second_revision_name> percent: 100 tag: v2 ...
AstuceVous pouvez supprimer la première révision au lieu de la fixer à 0 % du trafic si vous ne prévoyez pas de revenir en arrière. Les objets de révision non acheminables sont alors mis au rebut.
- Visitez l'URL de la première révision pour vérifier qu'aucun trafic n'est plus envoyé vers l'ancienne version de l'application.