Ajout de services à l'aide d'une liaison de service IBM Cloud
Ajoutez des services IBM Cloud pour améliorer votre cluster Kubernetes en ajoutant des fonctionnalités supplémentaires dans des domaines tels que l'intelligence artificielle (AI) Watson, les données, la sécurité et Internet of Things (IoT).
A propos de la liaison de service
Reportez-vous aux questions fréquemment posées ci-dessous sur la liaison de service.
Quels types de services puis-je lier à mon cluster ?
Vous pouvez lier des services activés pour IBM Cloud Identity and Access Management (IAM). Les services activés par IAM offrent une contrôle d'accès plus fin et peuvent être gérés dans un groupe de ressources IBM Cloud. Pour plus d'informations, voir Gestion des accès aux ressources.
Pour obtenir la liste des services IBM Cloud pris en charge, voir le catalogue IBM Cloud.
Qu'est-ce qu'une liaison de service IBM Cloud ?
Une liaison de service est un moyen de créer rapidement des données d'identification de service pour un service IBM Cloud en utilisant son noeud final de service cloud public et de stocker ces données dans un secret Kubernetes dans votre cluster.
Pour lier un service à votre cluster, vous devez d'abord mettre à disposition une instance du service. Ensuite, vous utilisez le ibmcloud ks cluster service bind
commande pour créer les informations d'identification du service et le secret Kubernetes. Le secret Kubernetes est chiffré automatiquement dans etcd pour protéger vos données.
Vous voulez sécuriser davantage vos secrets ? Demandez à l'administrateur de votre cluster d'activer un fournisseur de service de gestion de clés dans votre cluster pour chiffrer les secrets nouveaux ou existants, par exemple le secret dans lequel sont stockées les données d'identification de vos instances de service IBM Cloud.
J'ai déjà un service IBM Cloud. Puis-je utiliser la liaison de service IBM Cloud ?
Oui, vous pouvez utiliser des services qui répondent aux exigences de désignation et réutiliser les données d'identification de service.
- Désignation : assurez-vous que le nom de service est au format regex ci-après. Les noms autorisés sont
myservice
ouexample.com
. Les caractères qui ne sont pas autorisés incluent des espaces et des traits de soulignement.[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*
- Informations d'identification de service: pour utiliser vos informations d'identification de service existantes, spécifiez les
--key
option dans leibmcloud ks cluster service bind
commandez et indiquez le nom de vos informations d'identification de service. La liaison de service IBM Cloud crée automatiquement un secret Kubernetes avec vos informations d'identification de service existantes.
Puis-je utiliser les données d'identification de service qui utilisent le noeud final de service cloud privé ?
Par défaut, la commande ibmcloud ks cluster service bind
crée des données d'identification de service avec le noeud final de service cloud public. Pour utiliser le noeud final de service cloud privé, vous devez créer manuellement
des données d'identification de service pour votre service qui utilisent le noeud final de service cloud privé, puis utiliser l'indicateur --key
pour spécifier le nom des données d'identification de service existantes.
Il se peut que votre service ne prenne pas encore en charge des noeuds finaux de service de cloud privé. Si vous disposez d'un cluster privé uniquement, vous devez utiliser les données d'identification de service qui utilisent le noeud final de service cloud privé, ou ouvrir l'adresse IP publique et le port pour vous connecter à votre service.
Puis-je utiliser tous les services IBM Cloud sur mon cluster ?
Vous pouvez utiliser une liaison de service uniquement pour vos services qui prennent en charge les clés de service de sorte que les données d'identification de service puissent être créées et stockées automatiquement dans un secret Kubernetes. Pour savoir comment connecter le service à une application, voir Connecter les services aux applications.
Les services qui ne prennent pas en charge les clés de service fournissent généralement une API que vous pouvez utiliser dans votre application. La méthode de liaison de service ne configure pas automatiquement l'accès API pour votre application. Prenez soin d'examiner la documentation d'API de votre service et d'implémenter l'API dans votre application.
Puis-je lier plusieurs services IBM Cloud à plusieurs clusters à la fois ?
La liaison de service IBM Cloud est effectuée par cluster et par service et fonctionne en créant un secret Kubernetes que vos pods peuvent monter.
Pour plusieurs clusters et services, vous pouvez utiliser des profils sécurisés IAM à la place. Dans IAM, vous créez un profil sécurisé avec des règles d'accès pour les services
IBM Cloud souhaités. Vous pouvez ensuite lier le profil sécurisé à autant de clusters que vous le souhaitez en fonction de certaines conditions, telles que tous les espaces de noms prod
Kubernetes sur les clusters d'un groupe
de ressources. Les pods montent alors le volume projeté de compte de service Kubernetes pour obtenir un jeton qui peut être échangé contre un jeton IAM utilisé parvos applications pour s'authentifier auprès des services IBM Cloud.
Ajout de services IBM Cloud à des clusters
Utilisez une liaison de service IBM Cloud pour créer automatiquement des données d'identification de service pour vos services IBM Cloud et stockez ces données d'identification dans un secret Kubernetes.
Avant de commencer :
- Vérifiez que vous disposez des rôles suivants :
- Éditeur ou Administrateur IBM Cloud Rôle d'accès à la plate-forme IAM pour le cluster auquel vous souhaitez lier un service.
- Écrivain ou gestionnaire IBM Cloud Rôle d'accès au service IAM pour l'espace de noms Kubernetes où vous souhaitez lier le service.
- Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
Pour ajouter un service IBM Cloud dans votre cluster :
-
Créez une instance du service IBM Cloud.
- Certains services IBM Cloud ne sont disponibles que dans des régions éligibles. Vous pouvez lier un service à votre cluster uniquement si ce service est disponible dans la même région que votre cluster. En outre, si vous souhaitez créer une instance de service dans la zone Washington DC, vous devez utiliser l'interface de ligne de commande.
- Pour les services activés par IAM : vous devez créer l'instance de service dans le même groupe de ressources que votre cluster. Un service peut être créé dans un seul groupe de ressources que vous ne pouvez plus modifier par la suite.
- Vérifiez que le nom de service est au format
myservice
ouexample.com
. Les espaces et les tirets bas ne sont pas autorisés.
-
Vérifiez le type de service que vous avez créé et notez le nom de l'instance de service.
ibmcloud resource service-instances
Exemple de sortie
NAME Location State Type Tags <iam_service_instance_name> <region> active service_instance
-
Identifiez l'espace de noms du cluster que vous souhaitez utiliser pour ajouter votre service.
kubectl get namespaces
-
Liez le service à votre cluster pour créer les données d'identification de service pour votre service qui utilisent le noeud final de service cloud public et stockez ces données d'identification dans un secret Kubernetes. Si vous disposez déjà d'identifiants de service, utilisez l'option
--key
pour spécifier le nom des identifiants. Pour les services compatibles IAM, les informations d'identification sont automatiquement créées avec le rôle d'accès au service Writer, mais vous pouvez utiliser l'option--role
pour spécifier un rôle d'accès au service différent. Si vous utilisez l'option--key
, n'incluez pas l'option--role
.Si votre service prend en charge les points de terminaison de service de cloud privé, vous pouvez créer manuellement les informations d'identification du service avec le point de terminaison de service de cloud privé, puis utiliser l'option
--key
pour spécifier le nom de vos informations d'identification.ibmcloud ks cluster service bind --cluster <cluster_name_or_ID> --namespace <namespace> --service <service_instance_name> [--key <service_instance_key>] [--role <IAM_service_role>]
Lorsque la création des données d'identification de service aboutit, un secret Kubernetes portant le nom
binding-<service_instance_name>
est créé.Exemple de sortie
ibmcloud ks cluster service bind --cluster mycluster --namespace mynamespace --service cleardb Binding service instance to namespace... OK Namespace: mynamespace Secret name: binding-<service_instance_name>
-
Vérifiez les données d'identification du service dans votre secret Kubernetes.
- Obtenez les détails du secret et notez la valeur de binding. La valeur de binding est codée en base64 et contient les données d'identification pour votre instance de service au format JSON.
Exemple de sortiekubectl get secrets binding-<service_instance_name> --namespace=<namespace> -o yaml
apiVersion: v1 data: binding: <binding> kind: Secret metadata: annotations: service-instance-id: 1111aaaa-a1aa-1aa1-1a11-111aa111aa11 service-key-id: 2b22bb2b-222b-2bb2-2b22-b22222bb2222 creationTimestamp: 2018-08-07T20:47:14Z name: binding-<service_instance_name> namespace: <namespace> resourceVersion: "6145900" selfLink: /api/v1/namespaces/default/secrets/binding-mycloudant uid: 33333c33-3c33-33c3-cc33-cc33333333c type: Opaque
- Décodez la valeur de liaison.
Exemple de sortieecho "<binding>" | base64 -D
{"apikey":"<API_key>","host":"<ID_string>-bluemix.cloudant.com","iam_apikey_description":"Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloudantnosqldb:us-south:a/<ID_string>::","iam_apikey_name":"auto-generated-apikey-<ID_string>","iam_role_crn":"crn:v1:bluemix:public:iam::::serviceRole:Writer","iam_serviceid_crn":"crn:v1:bluemix:public:iam-identity::a/1234567890brasge5htn2ec098::serviceid:ServiceId-<ID_string>","password":"<ID_string>","port":443,"url":"https://<ID_string>-bluemix.cloudant.com","username":"123b45da-9ce1-4c24-ab12-rinwnwub1294-bluemix"}
- Facultatif : comparez les données d'identification du service que vous avez décodées à l'étape précédente aux données d'identification du service que vous trouvez pour votre instance de service dans le tableau de bord IBM Cloud.
- Obtenez les détails du secret et notez la valeur de binding. La valeur de binding est codée en base64 et contient les données d'identification pour votre instance de service au format JSON.
-
Votre service étant désormais lié à votre cluster, vous devez configurer votre application pour accéder aux données d'identification du service dans le secret Kubernetes.
Ajout manuel des identifiants de service à votre cluster
Au lieu d'utiliser la commande service bind
, vous pouvez également ajouter manuellement des informations d'identification de service à votre cluster en suivant les étapes suivantes.
-
Obtenez le nom d'instance du service que vous souhaitez ajouter à votre cluster.
ibmcloud resource service-instances
-
Créer une clé de service.
ibmcloud resource service-key-create NAME [ROLE] --instance-name SERVICE_INSTANCE
-
Copiez la section
Credentials
et enregistrez-la dans un fichier sans extension appelécreds
. -
Créez un secret d' Kubernetes s qui utilise le fichier d'informations d'identification que vous avez créé.
kubectl create secret generic my-secret --from-file=path/to/creds
Accès aux données d'identification à partir de vos applications
Pour accéder à une instance de service IBM Cloud à partir de votre application, vous devez rendre les données d'identification stockées dans le secret Kubernetes accessibles à votre application.
Les données d'identification d'une instance de service sont codées en base64 et stockées au format JSON dans votre secret. Pour accéder aux données figurant dans votre secret, choisissez l'une des options suivantes :
- Monter la valeur confidentielle sous forme de volume sur votre pod
- Référencer la valeur confidentielle dans les variables d'environnement
Avant de commencer :
- Assurez-vous que vous disposez du rôle d'accès au service IAM Writer ou Manager IBM Cloud pour l'espace de noms
kube-system
. - Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
- Ajoutez un service IBM Cloud à votre cluster.
Montage du secret sous forme de volume dans votre pod
Lorsque vous montez le secret sous forme de volume dans votre pod, un fichier nommé binding
est stocké dans le répertoire de montage du volume. Le fichier binding
au format JSON comprend toutes les informations et
les données d'identification dont vous avez besoin pour accéder au service IBM Cloud.
-
Répertoriez les secrets disponibles dans votre cluster et notez le nom de la vôtre. Recherchez un secret de type Opaque. S'il existe plusieurs secrets, contactez l'administrateur de votre cluster pour identifier le secret approprié.
kubectl get secrets
Exemple de sortie
NAME TYPE DATA AGE binding-<service_instance_name> Opaque 1 3m
-
Créez un fichier YAML pour votre déploiement Kubernetes et montez le secret sous forme de volume sur votre pod.
apiVersion: apps/v1 kind: Deployment metadata: labels: app: secret-test name: secret-test namespace: <my_namespace> spec: selector: matchLabels: app: secret-test replicas: 1 template: metadata: labels: app: secret-test spec: containers: - image: icr.io/ibm/liberty:latest name: secret-test volumeMounts: - mountPath: <mount_path> name: <volume_name> volumes: - name: <volume_name> secret: defaultMode: 420 secretName: binding-<service_instance_name>
volumeMounts.mountPath
- Chemin absolu du répertoire où est monté le volume dans le conteneur.
volumeMounts.name
etvolumes.name
- Nom du volume à monter sur votre pod.
secret.defaultMode
- Droits d'accès en lecture et écriture au secret. Utilisez
420
pour définir les droits en lecture seule. secret.secretName
- Nom du secret que vous avez noté à l'étape précédente.
-
Créez le pod et montez le secret sous forme de volume.
kubectl apply -f secret-test.yaml
-
Vérifiez que le pod a bien été créé.
kubectl get pods
Exemple de sortie d'interface de ligne de commande :
NAME READY STATUS RESTARTS AGE secret-test-1111454598-gfx32 1/1 Running 0 1m
-
Accédez aux données d'identification pour le service.
-
Connectez-vous à votre pod.
kubectl exec <pod_name> -it bash
-
Accédez au chemin de montage du volume que vous avez défini précédemment et répertoriez les fichiers figurant dans ce chemin.
cd <volume_mountpath> && ls
Exemple de sortie
binding
Le fichier
binding
comprend les données d'identification pour le service que vous avez stockées dans le secret Kubernetes. -
Affichez les données d'identification du service. Ces données sont stockées sous forme de paires clé-valeur au format JSON.
cat binding
Exemple de sortie
{"apikey":"<API_key>","host":"<ID_string>-bluemix.cloudant.com","iam_apikey_description":"Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloudantnosqldb:us-south:a/<ID_string>:<ID_string>::","iam_apikey_name":"auto-generated-apikey-<ID_string>","iam_role_crn":"crn:v1:bluemix:public:iam::::serviceRole:Writer","iam_serviceid_crn":"crn:v1:bluemix:public:iam-identity::a/<ID_string>::serviceid:ServiceId-<ID_string>","password":"<ID_string>","port":443,"url":"https://<ID_string>-bluemix.cloudant.com","username":"123b45da-9ce1-4c24-ab12-rinwnwub1294-bluemix"}
-
Configurez votre application pour analyser le contenu JSON et extraire les informations dont vous avez besoin pour accéder à votre service.
-
Référencement du secret dans les variables d'environnement
Vous pouvez ajouter les données d'identification du service et d'autres paires clé-valeur figurant dans votre secret Kubernetes sous forme de variables d'environnement dans votre déploiement.
-
Répertoriez les secrets disponibles dans votre cluster et notez le nom de la vôtre. Recherchez un secret de type Opaque. S'il existe plusieurs secrets, contactez l'administrateur de votre cluster pour identifier le secret approprié.
kubectl get secrets
Exemple de sortie
NAME TYPE DATA AGE binding-<service_instance_name> Opaque 1 3m
-
Obtenez les détails de votre secret pour rechercher les paires clé-valeur potentielles que vous pouvez référencer sous forme de variables d'environnement dans votre pod. Les données d'identification du service sont stockées dans la clé
binding
de votre secret.kubectl get secrets binding-<service_instance_name> --namespace=<namespace> -o yaml
Exemple de sortie
apiVersion: v1 data: binding: <binding> kind: Secret metadata: annotations: service-instance-id: 7123acde-c3ef-4ba2-8c52-439ac007fa70 service-key-id: 9h30dh8a-023f-4cf4-9d96-d12345ec7890 creationTimestamp: 2018-08-07T20:47:14Z name: binding-<service_instance_name> namespace: <namespace> resourceVersion: "6145900" selfLink: /api/v1/namespaces/default/secrets/binding-mycloudant uid: 12345a31-9a83-11e8-ba83-cd49014748f type: Opaque
-
Créez un fichier YAML pour votre déploiement Kubernetes et indiquez une variable d'environnement qui référence la clé
binding
.apiVersion: apps/v1 kind: Deployment metadata: labels: app: secret-test name: secret-test namespace: <my_namespace> spec: selector: matchLabels: app: secret-test template: metadata: labels: app: secret-test spec: containers: - image: icr.io/ibm/liberty:latest name: secret-test env: - name: BINDING valueFrom: secretKeyRef: name: binding-<service_instance_name> key: binding
containers.env.name
- Nom de votre variable d'environnement.
env.valueFrom.secretKeyRef.name
- Nom du secret que vous avez noté à l'étape précédente.
env.valueFrom.secretKeyRef.key
- Clé faisant partie du secret que vous voulez référencer dans votre variable d'environnement. Pour faire référence aux données d'identification de service, vous devez utiliser la clé de liaison.
-
Créez le pod qui référence la clé
binding
de votre secret sous forme de variable d'environnement.kubectl apply -f secret-test.yaml
-
Vérifiez que le pod a bien été créé.
kubectl get pods
Exemple de sortie d'interface de ligne de commande :
NAME READY STATUS RESTARTS AGE secret-test-1111454598-gfx32 1/1 Running 0 1m
-
Vérifiez que la variable d'environnement est définie correctement.
- Connectez-vous à votre pod.
kubectl exec <pod_name> -it bash
- Répertoriez toutes les variables d'environnement dans le pod.
Exemple de sortieenv
BINDING={"apikey":"<API_key>","host":"<ID_string>-bluemix.cloudant.com","iam_apikey_description":"Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloudantnosqldb:us-south:a/<ID_string>::","iam_apikey_name":"auto-generated-apikey-<ID_string>","iam_role_crn":"crn:v1:bluemix:public:iam::::serviceRole:Writer","iam_serviceid_crn":"crn:v1:bluemix:public:iam-identity::a/1234567890brasge5htn2ec098::serviceid:ServiceId-<ID_string>","password":"<password>","port":443,"url":"https://<ID_string>-bluemix.cloudant.com","username":"<ID_string>-bluemix"}
- Connectez-vous à votre pod.
-
Configurez votre application pour lire la variable d'environnement et analyser le contenu JSON pour extraire les informations dont vous avez besoin pour accéder à votre service.
Exemple de code en Python :
if os.environ.get('BINDING'): credentials = json.loads(os.environ.get('BINDING'))
-
Facultatif : par précaution, ajoutez le traitement d'erreurs à votre application au cas où la variable d'environnement
BINDING
ne serait pas correctement définie.Exemple de code en Java :
if (System.getenv("BINDING") == null) { throw new RuntimeException("Environment variable 'SECRET' is not set!"); }
Exemple de code en Node.js :
if (!process.env.BINDING) { console.error('ENVIRONMENT variable "BINDING" is not set!'); process.exit(1); }
Retrait d'un service d'un cluster
Si vous ne souhaitez pas utiliser un service IBM Cloud lié à votre cluster, vous pouvez supprimer manuellement le secret Kubernetes et les pods qui accèdent au secret à partir de votre cluster.
-
Répertoriez les services liés à votre cluster et notez le nom de votre service ainsi que l'espace de noms auquel il est lié.
ibmcloud ks cluster service ls --cluster
Exemple de sortie
OK Service Instance GUID Key Namespace myservice 12345ab1-1234-1abc-a12b-12abc12a12ab kube-a1a12abcd12a123abc1a12ab1a1234ab7.abcdefg0p1abcd123lgg.default default
-
Répertoriez les secrets Kubernetes dans l'espace de nom auquel votre service est lié et recherchez le secret avec un nom ayant le format
binding-<service_name>
.kubectl get secrets -n <namespace> | grep Opaque
Exemple de sortie
binding-myservice Opaque 1 3d23h
-
Extrayez tous les pods qui accèdent au secret.
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.secret.secretName}{" "}{end}{end}' | grep "<secret_name>"
Si votre sortie CLI est vide, votre cluster ne contient aucun pod qui monte le secret.
-
Si vous avez des pods qui montent le secret, retirez le pod ou le déploiement qui gère le pod, ou mettez à jour le fichier YAML de pod ou de déploiement pour utiliser un autre secret à la place.
- Pour retirer un pod ou un déploiement :
kubectl delete pod <pod_name> -n <namespace>
kubectl delete deployment <deployment_name> -n <namespace>
- Pour mettre à jour un pod ou un déploiement existant :
- Obtenez le fichier YAML de pod ou de déploiement.
kubectl get pod <pod_name> -o yaml
kubectl get deployment <deployment_name> -o yaml
- Copiez le fichier YAML et dans la section
spec.volumes
, modifiez le nom du secret que vous souhaitez utiliser. - Appliquez la modification à votre cluster.
kubectl apply -f pod.yaml
kubectl apply -f deployment.yaml
- Vérifiez qu'un nouveau pod est créé avec la spécification de volume mise à jour.
kubectl get pods
kubectl describe pod <pod_name>
- Obtenez le fichier YAML de pod ou de déploiement.
- Pour retirer un pod ou un déploiement :
-
Supprimez le secret.
kubectl delete secret <secret_name> -n <namespace>
-
Vérifiez que votre secret est retiré.
kubectl get secrets -n <namespace>
-
Optionnel. Retirez l'instance de service IBM Cloud.
ibmcloud resource service-instance-delete <service_name>