6.8. Lier les charges de travail à l'aide de l'opérateur de liaison de services
Les développeurs d'applications doivent lier une charge de travail à un ou plusieurs services d'appui en utilisant un secret de liaison. Ce secret est généré dans le but de stocker des informations qui seront consommées par la charge de travail.
Prenons l'exemple d'un service auquel vous souhaitez vous connecter et qui expose déjà les données de liaison. Dans ce cas, vous aurez également besoin d'une charge de travail à utiliser avec la ressource personnalisée (CR) ServiceBinding. En utilisant cette CR ServiceBinding, la charge de travail envoie une demande de liaison avec les détails des services à lier.
Exemple de ServiceBinding CR
Comme le montre l'exemple précédent, vous pouvez également utiliser directement un site ConfigMap ou un site Secret en tant que ressource de service à utiliser comme source de données de liaison.
6.8.1. Stratégies de dénomination Copier lienLien copié sur presse-papiers!
Les stratégies de dénomination ne sont disponibles que pour le groupe binding.operators.coreos.com API.
Les stratégies de nommage utilisent les modèles Go pour vous aider à définir des noms de liaison personnalisés par le biais de la demande de liaison de service. Les stratégies de dénomination s'appliquent à tous les attributs, y compris les correspondances dans la ressource personnalisée (CR) ServiceBinding.
Un service d'appui projette les noms de liaison sous forme de fichiers ou de variables d'environnement dans la charge de travail. Si une charge de travail attend les noms de liaison projetés dans un format particulier, mais que les noms de liaison à projeter à partir du service d'appui ne sont pas disponibles dans ce format, vous pouvez modifier les noms de liaison à l'aide de stratégies d'attribution de noms.
Fonctions de post-traitement prédéfinies
Lors de l'utilisation des stratégies de dénomination, en fonction des attentes ou des exigences de votre charge de travail, vous pouvez utiliser les fonctions de post-traitement prédéfinies suivantes, dans n'importe quelle combinaison, pour convertir les chaînes de caractères :
-
upper: Convertit les chaînes de caractères en lettres capitales ou majuscules. -
lower: Convertit les chaînes de caractères en lettres minuscules. -
title: Convertit les chaînes de caractères où la première lettre de chaque mot est en majuscule, à l'exception de certains mots mineurs.
Stratégies de dénomination prédéfinies
Les noms de liens déclarés par le biais d'annotations sont traités pour leur changement de nom avant leur projection dans la charge de travail selon les stratégies de dénomination prédéfinies suivantes :
none: Lorsqu'il est appliqué, il n'y a pas de changement dans les noms des liaisons.Exemple
Après la compilation du modèle, les noms de la liaison prennent la forme
{{ .name }}.host: hippo-pgbouncer port: 5432
host: hippo-pgbouncer port: 5432Copy to Clipboard Copied! Toggle word wrap Toggle overflow upper: Appliqué lorsqu'aucunnamingStrategyn'est défini. Lorsqu'il est appliqué, il convertit toutes les chaînes de caractères de la clé du nom de la liaison en lettres capitales ou majuscules.Exemple
Après la compilation du modèle, les noms des liens prennent la forme
{{ .service.kind | upper}}_{{ .name | upper }}.DATABASE_HOST: hippo-pgbouncer DATABASE_PORT: 5432
DATABASE_HOST: hippo-pgbouncer DATABASE_PORT: 5432Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si votre charge de travail nécessite un format différent, vous pouvez définir une stratégie de dénomination personnalisée et modifier le nom de la liaison à l'aide d'un préfixe et d'un séparateur, par exemple
PORT_DATABASE.
-
Lorsque les noms des liens sont projetés sous forme de fichiers, la stratégie de dénomination prédéfinie
noneest appliquée par défaut et les noms des liens ne changent pas. -
Lorsque les noms des liens sont projetés en tant que variables d'environnement et qu'aucun
namingStrategyn'est défini, la stratégie de dénomination prédéfinieuppercaseest appliquée par défaut. - Vous pouvez remplacer les stratégies de dénomination prédéfinies en définissant des stratégies de dénomination personnalisées utilisant différentes combinaisons de noms de liaison personnalisés et de fonctions de post-traitement prédéfinies.
6.8.2. Options de reliure avancées Copier lienLien copié sur presse-papiers!
Vous pouvez définir la ressource personnalisée (CR) ServiceBinding pour qu'elle utilise les options de liaison avancées suivantes :
-
Modifier les noms des liens : Cette option n'est disponible que pour le groupe
binding.operators.coreos.comAPI. -
Composer des données de liaison personnalisées : Cette option n'est disponible que pour le groupe
binding.operators.coreos.comAPI. -
Lier les charges de travail à l'aide de sélecteurs d'étiquettes : Cette option est disponible pour les groupes d'API
binding.operators.coreos.cometservicebinding.io.
6.8.2.1. Modifier les noms des liaisons avant de les projeter dans la charge de travail Copier lienLien copié sur presse-papiers!
Vous pouvez spécifier les règles de modification des noms de liaison dans l'attribut .spec.namingStrategy du CR ServiceBinding. Par exemple, considérons un exemple d'application Spring PetClinic qui se connecte à la base de données PostgreSQL. Dans ce cas, le service de base de données PostgreSQL expose les champs host et port de la base de données à utiliser pour la liaison. L'exemple d'application Spring PetClinic peut accéder à ces données de liaison exposées par le biais des noms de liaison.
Exemple : Exemple d'application Spring PetClinic sur le site ServiceBinding CR
Exemple : Service de base de données PostgreSQL dans le CR ServiceBinding
Si namingStrategy n'est pas défini et que les noms des liens sont projetés en tant que variables d'environnement, la valeur host: hippo-pgbouncer dans le service d'appui et la variable d'environnement projetée apparaîtront comme indiqué dans l'exemple suivant :
Exemple
DATABASE_HOST: hippo-pgbouncer
DATABASE_HOST: hippo-pgbouncer
où :
|
|
Spécifie le service backend |
|
| Spécifie le nom de la liaison. |
Après avoir appliqué la stratégie de nommage POSTGRESQL_{{ .service.kind | upper }}_{{ .name | upper }}_ENV, la liste des noms de liaison personnalisés préparée par la demande de liaison de service apparaît comme le montre l'exemple suivant :
Exemple
POSTGRESQL_DATABASE_HOST_ENV: hippo-pgbouncer POSTGRESQL_DATABASE_PORT_ENV: 5432
POSTGRESQL_DATABASE_HOST_ENV: hippo-pgbouncer
POSTGRESQL_DATABASE_PORT_ENV: 5432
Les éléments suivants décrivent les expressions définies dans la stratégie de dénomination POSTGRESQL_{{ .service.kind | upper }}_{{ .name | upper }}_ENV:
-
.name: Fait référence au nom de la liaison exposée par le service d'appui. Dans l'exemple précédent, les noms de liaison sontHOSTetPORT. -
.service.kind: Désigne le type de ressource de service dont les noms de liaison sont modifiés par la stratégie de dénomination. -
upper: Fonction de chaîne utilisée pour post-traiter la chaîne de caractères lors de la compilation de la chaîne du modèle Go. -
POSTGRESQL: Préfixe du nom de la liaison personnalisée. -
ENV: Suffixe du nom de la liaison personnalisée.
Comme dans l'exemple précédent, vous pouvez définir les modèles de chaînes dans namingStrategy pour définir comment chaque clé des noms de liaison doit être préparée par la demande de liaison de service.
6.8.2.2. Composer des données de liaison personnalisées Copier lienLien copié sur presse-papiers!
En tant que développeur d'applications, vous pouvez composer des données de liaison personnalisées dans les circonstances suivantes :
- Le service de soutien n'expose pas les données de liaison.
- Les valeurs exposées ne sont pas disponibles dans le format requis par la charge de travail.
Par exemple, considérons un cas où le service de soutien CR expose l'hôte, le port et l'utilisateur de la base de données en tant que données de liaison, mais la charge de travail exige que les données de liaison soient consommées en tant que chaîne de connexion. Vous pouvez composer des données de liaison personnalisées à l'aide d'attributs dans la ressource Kubernetes représentant le service d'appui.
Exemple
- 1
- Nom de la ressource du service de soutien.
- 2
- Identifiant facultatif.
- 3
- Nom JSON généré par le Service Binding Operator. Le Service Binding Operator projette ce nom JSON comme le nom d'un fichier ou d'une variable d'environnement.
- 4
- Valeur JSON générée par l'opérateur de liaison de services. Le Service Binding Operator projette cette valeur JSON dans un fichier ou une variable d'environnement. La valeur JSON contient les attributs du champ spécifié de la ressource personnalisée du service d'appui.
6.8.2.3. Lier les charges de travail à l'aide d'un sélecteur d'étiquettes Copier lienLien copié sur presse-papiers!
Vous pouvez utiliser un sélecteur d'étiquettes pour spécifier la charge de travail à lier. Si vous déclarez une liaison de service en utilisant les sélecteurs d'étiquettes pour récupérer des charges de travail, l'opérateur de liaison de service tente périodiquement de trouver et de lier de nouvelles charges de travail qui correspondent au sélecteur d'étiquettes donné.
Par exemple, en tant qu'administrateur de cluster, vous pouvez lier un service à chaque Deployment dans un espace de noms avec l'étiquette environment: production en définissant un champ labelSelector approprié dans le CR ServiceBinding. Cela permet à l'opérateur de liaison de services de lier chacune de ces charges de travail à un CR ServiceBinding.
Exemple ServiceBinding CR dans l'API binding.operators.coreos.com/v1alpha1
- 1
- Spécifie la charge de travail qui est liée.
Exemple ServiceBinding CR dans l'API servicebinding.io
- 1
- Spécifie la charge de travail qui est liée.
Si vous définissez les paires de champs suivantes, Service Binding Operator refuse l'opération de liaison et génère une erreur :
-
Les champs
nameetlabelSelectordans l'APIbinding.operators.coreos.com/v1alpha1. -
Les champs
nameetselectordans l'APIservicebinding.io(Spec API).
Comprendre le comportement du rebinding
Prenons le cas où, après une liaison réussie, vous utilisez le champ name pour identifier une charge de travail. Si vous supprimez et recréez cette charge de travail, l'outil de réconciliation ServiceBinding ne lie pas à nouveau la charge de travail et l'opérateur ne peut pas projeter les données de liaison sur la charge de travail. Toutefois, si vous utilisez le champ labelSelector pour identifier une charge de travail, le programme de rapprochement ServiceBinding lie à nouveau la charge de travail et l'opérateur projette les données de liaison.
6.8.3. Lier des charges de travail secondaires qui ne sont pas conformes à PodSpec Copier lienLien copié sur presse-papiers!
Un scénario typique de liaison de service implique la configuration du service de soutien, de la charge de travail (déploiement) et de l'opérateur de liaison de service. Considérons un scénario impliquant une charge de travail secondaire (qui peut également être un opérateur d'application) qui n'est pas conforme à PodSpec et qui se trouve entre la charge de travail principale (déploiement) et l'opérateur de liaison de service.
Pour ces ressources de charge de travail secondaire, l'emplacement du chemin d'accès au conteneur est arbitraire. Pour la liaison de service, si la charge de travail secondaire d'une CR n'est pas conforme à la PodSpec, vous devez spécifier l'emplacement du chemin du conteneur. Cela permet de projeter les données de liaison dans le chemin du conteneur spécifié dans la charge de travail secondaire de la ressource personnalisée (CR) ServiceBinding, par exemple lorsque vous ne voulez pas que les données de liaison se trouvent dans un pod.
Dans Service Binding Operator, vous pouvez configurer le chemin d'accès des conteneurs ou des secrets au sein d'une charge de travail et lier ces chemins d'accès à un emplacement personnalisé.
6.8.3.1. Configuration de l'emplacement personnalisé du chemin d'accès au conteneur Copier lienLien copié sur presse-papiers!
Cet emplacement personnalisé est disponible pour le groupe API binding.operators.coreos.com lorsque Service Binding Operator projette les données de liaison en tant que variables d'environnement.
Considérons une charge de travail secondaire CR, qui n'est pas conforme à la PodSpec et dont les conteneurs sont situés sur le chemin spec.containers:
Exemple : Charge de travail secondaire CR
Procédure
Configurez le chemin d'accès
spec.containersen spécifiant une valeur dans le CRServiceBindinget liez ce chemin d'accès à un emplacement personnaliséspec.application.bindingPath.containersPath:Exemple :
ServiceBindingCR avec le chemin d'accèsspec.containersdans un emplacement personnaliséCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Après avoir spécifié l'emplacement du chemin du conteneur, Service Binding Operator génère les données de liaison, qui deviennent disponibles dans le chemin du conteneur spécifié dans la charge de travail secondaire de la CR ServiceBinding.
L'exemple suivant montre le chemin spec.containers avec les champs envFrom et secretRef:
Exemple : Charge de travail secondaire CR avec les champs envFrom et secretRef
6.8.3.2. Configuration de l'emplacement personnalisé du chemin d'accès secret Copier lienLien copié sur presse-papiers!
Cet emplacement personnalisé est disponible pour le groupe API binding.operators.coreos.com lorsque Service Binding Operator projette les données de liaison en tant que variables d'environnement.
Considérons une charge de travail secondaire CR, qui n'est pas conforme à la PodSpec, avec seulement le secret sur le chemin spec.secret:
Exemple : Charge de travail secondaire CR
Procédure
Configurer le chemin d'accès
spec.secreten spécifiant une valeur dans le CRServiceBindinget lier ce chemin d'accès à un emplacement personnaliséspec.application.bindingPath.secretPath:Exemple :
ServiceBindingCR avec le chemin d'accèsspec.secretdans un emplacement personnaliséCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Après avoir spécifié l'emplacement du chemin secret, Service Binding Operator génère les données de liaison, qui deviennent disponibles dans le chemin secret spécifié dans la charge de travail secondaire du CR ServiceBinding.
L'exemple suivant montre le chemin spec.secret avec la valeur binding-request:
Exemple : Charge de travail secondaire CR avec la valeur binding-request
- 1
- Nom unique de la ressource
Secretgénérée par le Service Binding Operator.
6.8.3.3. Cartographie des ressources de la charge de travail Copier lienLien copié sur presse-papiers!
-
Le mappage des ressources de charge de travail est disponible pour les charges de travail secondaires de la ressource personnalisée (CR)
ServiceBindingpour les deux groupes API :binding.operators.coreos.cometservicebinding.io. -
Vous devez définir les ressources
ClusterWorkloadResourceMappinguniquement dans le groupe d'APIservicebinding.io. Cependant, les ressourcesClusterWorkloadResourceMappinginteragissent avec les ressourcesServiceBindingsous les groupes d'APIbinding.operators.coreos.cometservicebinding.io.
Si vous ne pouvez pas configurer des emplacements de chemin d'accès personnalisés en utilisant la méthode de configuration du chemin d'accès du conteneur, vous pouvez définir exactement où les données de liaison doivent être projetées. Spécifiez où projeter les données de liaison pour un type de charge de travail donné en définissant les ressources ClusterWorkloadResourceMapping dans le groupe API servicebinding.io.
L'exemple suivant montre comment définir un mappage pour les ressources CronJob.batch/v1.
Exemple : Cartographie des ressources CronJob.batch/v1
- 1
- Nom de la ressource
ClusterWorkloadResourceMapping, qui doit être qualifié deplural.groupde la ressource de charge de travail mappée. - 2
- Version de la ressource en cours de mappage. Toute version non spécifiée peut être remplacée par le caractère générique "*".
- 3
- Facultatif : Identifiant du champ
.annotationsdans un pod, spécifié avec un JSONPath fixe. La valeur par défaut est.spec.template.spec.annotations. - 4
- Identifiant des champs
.containerset.initContainersdans un module, spécifié par un chemin JSONPath. Si aucune entrée sous le champcontainersn'est définie, l'opérateur de liaison de services utilise par défaut deux chemins :.spec.template.spec.containers[*]et.spec.template.spec.initContainers[\*], tous les autres champs étant définis par défaut. Toutefois, si vous spécifiez une entrée, vous devez définir le champ.path. - 5
- Facultatif : Identifiant du champ
.namedans un conteneur, spécifié avec un chemin JSONPath fixe. La valeur par défaut est.name. - 6
- Facultatif : Identifiant du champ
.envdans un conteneur, spécifié avec un chemin JSONPath fixe. La valeur par défaut est.env. - 7
- Facultatif : Identifiant du champ
.volumeMountsdans un conteneur, spécifié avec un chemin JSONPath fixe. La valeur par défaut est.volumeMounts. - 8
- Facultatif : Identifiant du champ
.volumesdans un pod, spécifié avec un JSONPath fixe. La valeur par défaut est.spec.template.spec.volumes.
Dans ce contexte, un chemin JSONPath fixe est un sous-ensemble de la grammaire JSONPath qui n'accepte que les opérations suivantes :
-
Recherche de champ :
.spec.template -
Indexation des tableaux :
.spec['template']
Toutes les autres opérations ne sont pas acceptées.
-
Recherche de champ :
-
La plupart de ces champs sont facultatifs. Lorsqu'ils ne sont pas spécifiés, l'opérateur de liaison de services prend des valeurs par défaut compatibles avec les ressources
PodSpec. -
L'opérateur de liaison de services exige que chacun de ces champs soit structurellement équivalent au champ correspondant dans un déploiement de pods. Par exemple, le contenu du champ
.envdans une ressource de charge de travail doit pouvoir accepter la même structure de données que le champ.envdans une ressource Pod. Dans le cas contraire, la projection de données de liaison dans une telle charge de travail pourrait entraîner un comportement inattendu de la part de l'opérateur de liaison de services.
Comportement spécifique au groupe d'API binding.operators.coreos.com
Vous pouvez vous attendre aux comportements suivants lorsque les ressources ClusterWorkloadResourceMapping interagissent avec les ressources ServiceBinding dans le cadre du groupe API binding.operators.coreos.com:
-
Si une ressource
ServiceBindingavec la valeur de l'indicateurbindAsFiles: falseest créée avec l'un de ces mappages, les variables d'environnement sont projetées dans le champ.envFromsous chaque champpathspécifié dans la ressourceClusterWorkloadResourceMappingcorrespondante. En tant qu'administrateur de cluster, vous pouvez spécifier à la fois une ressource
ClusterWorkloadResourceMappinget le champ.spec.application.bindingPath.containersPathdans une ressourceServiceBinding.bindings.coreos.comà des fins de liaison.L'opérateur de liaison de services tente de projeter les données de liaison dans les emplacements spécifiés à la fois dans une ressource
ClusterWorkloadResourceMappinget dans le champ.spec.application.bindingPath.containersPath. Ce comportement équivaut à l'ajout d'une entrée de conteneur à la ressourceClusterWorkloadResourceMappingcorrespondante avec l'attributpath: $containersPath, toutes les autres valeurs prenant leur valeur par défaut.
6.8.4. Délier les charges de travail d'un service d'appui Copier lienLien copié sur presse-papiers!
Vous pouvez délier une charge de travail d'un service de soutien à l'aide de l'outil oc.
Pour délier une charge de travail d'un service d'appui, supprimez la ressource personnalisée (CR)
ServiceBindingqui lui est liée :oc delete ServiceBinding <.metadata.name> $ oc delete ServiceBinding <.metadata.name>
oc delete ServiceBinding <.metadata.name> $ oc delete ServiceBinding <.metadata.name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple
oc delete ServiceBinding spring-petclinic-pgcluster
$ oc delete ServiceBinding spring-petclinic-pgclusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow où :
spring-petclinic-pgclusterSpécifie le nom du CR
ServiceBinding.