IBM Cloud Docs
Ajout de services à l'aide d'une liaison de service IBM Cloud

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 le ibmcloud 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 :

Pour ajouter un service IBM Cloud dans votre cluster :

  1. 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 ou example.com. Les espaces et les tirets bas ne sont pas autorisés.
  2. 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
    
  3. Identifiez l'espace de noms du cluster que vous souhaitez utiliser pour ajouter votre service.

    kubectl get namespaces
    
  4. 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>
    
  5. Vérifiez les données d'identification du service dans votre secret Kubernetes.

    1. 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.
      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: 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
      
    2. Décodez la valeur de liaison.
      echo "<binding>" | base64 -D
      
      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>::","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"}
      
    3. 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.
  6. 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.

  1. Obtenez le nom d'instance du service que vous souhaitez ajouter à votre cluster.

    ibmcloud resource service-instances
    
  2. Créer une clé de service.

    ibmcloud resource service-key-create NAME [ROLE] --instance-name SERVICE_INSTANCE
    
  3. Copiez la section Credentials et enregistrez-la dans un fichier sans extension appelé creds.

  4. 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 :

Avant de commencer :

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.

  1. 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
    
  2. 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 et volumes.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.
  3. Créez le pod et montez le secret sous forme de volume.

    kubectl apply -f secret-test.yaml
    
  4. 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
    
  5. Accédez aux données d'identification pour le service.

    1. Connectez-vous à votre pod.

      kubectl exec <pod_name> -it bash
      
    2. 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.

    3. 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"}
      
    4. 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.

  1. 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
    
  2. 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
    
  3. 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.
  4. 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
    
  5. 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
    
  6. Vérifiez que la variable d'environnement est définie correctement.

    1. Connectez-vous à votre pod.
      kubectl exec <pod_name> -it bash
      
    2. Répertoriez toutes les variables d'environnement dans le pod.
      env
      
      Exemple de sortie
      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"}
      
  7. 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'))
    
  8. 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.

  1. 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  
    
  2. 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
    
  3. 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.

  4. 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 :
      1. Obtenez le fichier YAML de pod ou de déploiement.
        kubectl get pod <pod_name> -o yaml
        
        kubectl get deployment <deployment_name> -o yaml
        
      2. Copiez le fichier YAML et dans la section spec.volumes, modifiez le nom du secret que vous souhaitez utiliser.
      3. Appliquez la modification à votre cluster.
        kubectl apply -f pod.yaml
        
        kubectl apply -f deployment.yaml
        
      4. Vérifiez qu'un nouveau pod est créé avec la spécification de volume mise à jour.
        kubectl get pods
        
        kubectl describe pod <pod_name>
        
  5. Supprimez le secret.

    kubectl delete secret <secret_name> -n <namespace>
    
  6. Vérifiez que votre secret est retiré.

    kubectl get secrets -n <namespace>
    
  7. Optionnel. Retirez l'instance de service IBM Cloud.

    ibmcloud resource service-instance-delete <service_name>