Vinculación de las credenciales de servicio a su clúster

Añada servicios de IBM Cloud para mejorar el clúster de Kubernetes con prestaciones adicionales en áreas como, por ejemplo, Watson AI, datos, seguridad e Internet de las cosas (IoT).

A partir del 4 de agosto de 2025, IBM Cloud convertirá la vista única en el comportamiento predeterminado para todas las credenciales de recursos en las nuevas instancias de servicio. En lugar de utilizar el service bind CLI para agregar credenciales de servicio a su clúster, siga los pasos para agregar manualmente las credenciales de servicio a su clúster. Para más información, consulte Credenciales únicas.

¿Qué es el enlace de servicios de IBM Cloud?
El enlace de servicios es una forma rápida de crear credenciales de servicio para un servicio de IBM Cloud utilizando su punto final de servicio en la nube público y almacenando estas credenciales en un secreto de Kubernetes en el clúster. Para enlazar un servicio al clúster, primero debe suministrar una instancia del servicio. A continuación, puede vincular los servicios manualmente a su clúster o puede utilizar la CLI service bind comando para crear las credenciales de servicio y el secreto Kubernetes.
¿Qué tipos de servicios puedo enlazar a mi clúster?
Puede enlazar servicios que estén habilitados para IBM Cloud Identity and Access Management (IAM). Los servicios habilitados para IAM ofrecen un control de acceso más preciso y se pueden gestionar en un grupo de recursos de IBM Cloud. Para obtener más información, consulte Gestión del acceso a recursos. Para buscar una lista de servicios de IBM Cloud admitidos, consulte el catálogo de IBM Cloud.
¿Cómo puedo hacer que los secretos de mi clúster sean aún más seguros?
Solicite al administrador del clúster que habilite un proveedor de servicios de gestión de claves en el clúster para cifrar secretos nuevos y existentes, como el secreto que almacena las credenciales de las instancias del servicio IBM Cloud.
¿Puedo utilizar todos los servicios de IBM Cloud en mi clúster?
Puede utilizar el enlace de servicios sólo para los servicios que admiten claves de servicio de forma que las credenciales de servicio se puedan crear y almacenar automáticamente en un secreto de Kubernetes. Para saber cómo conectar el servicio a una aplicación, consulte Conexión de servicios a aplicaciones.
Los servicios que no dan soporte a las claves de servicio suelen proporcionar una API que puede utilizar en la aplicación. El método de enlace de servicios no configura automáticamente el acceso de API para la app. Asegúrese de revisar la documentación de la API del servicio e implementar la interfaz de API en la app.
¿Puedo vincular una instancia de servicio IBM Cloud existente a mi clúster?
Sí, puede utilizar servicios que cumplan los requisitos de nomenclatura y reutilizar las credenciales de servicio al vincularlos a su clúster. Asegúrese de que el nombre del servicio tiene el siguiente formato regex. [a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?). Nombres permitidos de ejemplo son myservice o example.com. Los caracteres que no están permitidos incluyen espacios y subrayados.
¿Puedo enlazar varios servicios de IBM Cloud a varios clústeres a la vez?
El enlace de servicios de IBM Cloud se realiza por clúster y por servicio, y funciona creando un secreto de Kubernetes que los pods pueden montar.
Para varios clústeres y servicios, puede utilizar los perfiles de confianza de IAM en su lugar. En IAM, cree un perfil de confianza con políticas de acceso para los servicios de IBM Cloud que desee. A continuación, enlace el perfil de confianza con tantos clústeres como desee, según condiciones como por ejemplo todos los espacios de nombres de Kubernetes de prod en clústeres de un grupo de recursos. Por último, los pods montan el volumen proyectado de la cuenta de servicio de Kubernetes para obtener una señal que se puede intercambiar por una señal de IAM que utilizan sus apps para autenticarse con los servicios de IBM Cloud.

Vinculación manual de las credenciales de servicio a su clúster

Antes de empezar:

Puede añadir manualmente credenciales de servicio a su clúster completando los siguientes pasos.

  1. Obtenga el nombre de instancia del servicio que desea agregar a su clúster.

    ibmcloud resource service-instances
    
  2. Crear una clave de servicio. Para más información, consulte la página referencia de comando.

    ibmcloud resource service-key-create NAME [ROLE] --instance-name SERVICE_INSTANCE
    
  3. Copie la sección Credentials y guárdela en un archivo sin extensión llamado creds.

  4. Cree un secreto de Kubernetes que utilice el archivo de credenciales que ha creado.

    kubectl create secret generic my-secret --from-file=path/to/creds
    

Adición de servicios a clústeres mediante la CLI service bind

¿Puedo utilizar las credenciales de servicio existentes al vincular?
Puede especificar opcionalmente el parámetro --key al ejecutar el comando service bind y proporcionar el nombre de sus credenciales de servicio existentes. La vinculación de servicios IBM Cloud crea automáticamente un secreto Kubernetes con sus credenciales de servicio existentes.
¿Qué ocurre si mis credenciales existentes son credenciales de vista única?
El comando service bind no soporta traer tus propias credenciales de vista única. Por lo tanto, si desea utilizar el comando service bind, no especifique el parámetro --key. Si ejecuta el comando sin --key, se creará un nuevo conjunto de credenciales.
Si desea utilizar credenciales que se ven una sola vez, debe vincular el servicio manualmente a su clúster. Esta opción le permite utilizar sus credenciales de vista única existentes.
¿Qué ocurre si deseo utilizar credenciales de servicio que utilizan el punto final de servicio en la nube privado?
Por defecto, el comando service bind crea credenciales de servicio con el punto final del servicio de nube pública. Para utilizar el punto final de servicio en la nube privado, debe crear manualmente las credenciales de servicio para el servicio que utiliza el punto final de servicio en la nube privado y, a continuación, utilizar la opción --key para especificar el nombre de las credenciales de servicio existentes. Si piensa traer sus propias credenciales, asegúrese de que las credenciales existentes no sean credenciales de visualización única. Para más información, consulte Credenciales únicas.
Es posible que el servicio aún no admita puntos finales de servicio en la nube privados. Si tiene un clúster de sólo privado, debe utilizar las credenciales de servicio que utilizan el punto final de servicio en la nube privado o abrir la dirección IP pública y el puerto para conectar con el servicio.

Revise las siguientes secciones para conocer los pasos para vincular las credenciales de servicio a su clúster.

Utilice el enlace de servicios de IBM Cloud para crear automáticamente credenciales de servicio para los servicios de IBM Cloud y almacene estas credenciales en un secreto de Kubernetes.

Si su servicio admite puntos finales de servicio de nube privada, puede crear manualmente las credenciales de servicio con el punto final de servicio de nube privada y, a continuación, utilizar la opción --key para especificar el nombre de las credenciales.

Antes de empezar:

Para añadir un servicio IBM Cloud al clúster:

  1. Cree una instancia del servicio IBM Cloud.

    • Algunos servicios de IBM Cloud solo están disponibles en determinadas regiones. Puede enlazar un servicio con el clúster sólo si el servicio está disponible en la misma región que el clúster. Además, si desea crear una instancia de servicio en la zona de Washington DC, debe utilizar la CLI.
    • Para los servicios habilitados para IAM: Debe crear la instancia de servicio en el mismo grupo de recursos que el clúster. Un servicio solo se puede crear en un grupo de recursos y no se puede cambiar después.
    • Asegúrese de que el nombre de servicio tenga el formato myservice o example.com. Los espacios y guiones bajos no están permitidos.
  2. Compruebe el tipo de servicio que ha creado y tome nota del Nombre de la instancia de servicio.

    ibmcloud resource service-instances
    

    Salida de ejemplo

    NAME                          Location   State    Type               Tags
    <iam_service_instance_name>   <region>   active   service_instance
    
  3. Identifique el espacio de nombres del clúster que desea utilizar para añadir el servicio.

    kubectl get namespaces
    
  4. Enlace el servicio a su clúster para crear credenciales de servicio para el servicio que utilicen el punto final de servicio en la nube público y almacenen las credenciales en un secreto de Kubernetes. Si ya dispone de credenciales de servicio, utilice la opción --key para especificar el nombre de las credenciales. Para los servicios habilitados para IAM, las credenciales se crean automáticamente con el rol de acceso al servicio Escritor, pero puede utilizar la opción --role para especificar un rol de acceso al servicio diferente. Si utiliza la opción --key, no incluya la opción --role.

    Si planea traer sus propias credenciales, asegúrese de que sus credenciales existentes no sean credenciales de vista única o utilice la forma recomendada de guardar manualmente las credenciales de servicio en su clúster. Para más información, consulte Credenciales únicas.

    ibmcloud ks cluster service bind --cluster <cluster_name_or_ID> --namespace <namespace> --service <service_instance_name> [--key <service_instance_key>] [--role <IAM_service_role>]
    

    Cuando la creación de las credenciales de servicio es satisfactoria, se crea un secreto de Kubernetes con el nombre binding-<service_instance_name>.

    Salida de ejemplo

    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. Verifique las credenciales de servicio en el secreto de Kubernetes.

    1. Obtenga los detalles del secreto y anote el valor de binding. El valor de binding está codificado en base64 y contiene las credenciales para la instancia de servicio en formato JSON.
      kubectl get secrets binding-<service_instance_name> --namespace=<namespace> -o yaml
      
      Salida de ejemplo
      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. Descodifique el valor de enlace.
      echo "<binding>" | base64 -D
      
      Salida de ejemplo
      {"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. Opcional: compare las credenciales de servicio que ha descodificado en el paso anterior con las credenciales de servicio que encuentre para la instancia de servicio en el panel de control de IBM Cloud.
  6. Ahora que el servicio está enlazado con el clúster, debe configurar la app para que acceda a las credenciales de servicio en el secreto de Kubernetes.

Acceso a las credenciales de servicio desde las apps

Para acceder a una instancia de servicio de IBM Cloud desde la app, debe permitir que la app acceda a las credenciales de servicio almacenadas en el secreto de Kubernetes.

Las credenciales de una instancia de servicio están codificadas como base64 y se almacenan en el secreto en formato JSON. Para acceder a los datos del secreto, elija una de las opciones siguientes:

Antes de empezar:

Montaje del secreto como un volumen en el pod

Cuando monta el secreto como volumen en el pod, un archivo denominado binding se almacena en el directorio de montaje del volumen. El archivo binding en formato JSON incluye toda la información y las credenciales que necesita para acceder al servicio de IBM Cloud.

  1. Liste los secretos disponibles en el clúster y anote el nombre del secreto. Busque un secreto de tipo opaco. Si existen varios secretos, póngase en contacto con el administrador del clúster para identificar el secreto correcto del servicio.

    kubectl get secrets
    

    Salida de ejemplo

    NAME                              TYPE            DATA      AGE
    binding-<service_instance_name>   Opaque          1         3m
    
  2. Cree un archivo YAML para el despliegue de Kubernetes y monte el secreto como un volumen en el 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
    La vía de acceso absoluta del directorio en el que el que está montado el volumen dentro del contenedor.
    volumeMounts.name y volumes.name
    El nombre del volumen que va a montar en el pod.
    secret.defaultMode
    Los permisos de lectura y escritura en el secreto. Utilice 420 para establecer permisos de solo lectura.
    secret.secretName
    El nombre del secreto que ha anotado en el paso anterior.
  3. Cree el pod y monte el secreto como un volumen.

    kubectl apply -f secret-test.yaml
    
  4. Verifique que se ha creado el pod.

    kubectl get pods
    

    Ejemplo de salida de CLI:

    NAME                           READY     STATUS    RESTARTS   AGE
    secret-test-1111454598-gfx32   1/1       Running   0          1m
    
  5. Acceda a las credenciales de servicio.

    1. Inicie una sesión en el pod.

      kubectl exec <pod_name> -it bash
      
    2. Vaya a la vía de acceso de montaje de volumen que ha definido anteriormente y liste los archivos en la vía de acceso de montaje del volumen.

      cd <volume_mountpath> && ls
      

      Salida de ejemplo

      binding
      

      El archivo binding incluye las credenciales de servicio que ha almacenado en el secreto de Kubernetes.

    3. Consulte las credenciales de servicio. Las credenciales se almacenan como pares de valor de clave en formato JSON.

      cat binding
      

      Salida de ejemplo

      {"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. Configure la app para analizar el contenido JSON y recuperar la información que necesita para acceder al servicio.

Cómo hacer referencia al secreto en las variables de entorno

Puede añadir las credenciales de servicio y otros pares de valores de clave del secreto de Kubernetes como variables de entorno en el despliegue.

  1. Liste los secretos disponibles en el clúster y anote el nombre del secreto. Busque un secreto de tipo opaco. Si existen varios secretos, póngase en contacto con el administrador del clúster para identificar el secreto correcto del servicio.

    kubectl get secrets
    

    Salida de ejemplo

    NAME                              TYPE            DATA      AGE
    binding-<service_instance_name>   Opaque          1         3m
    
  2. Obtenga los detalles del secreto para encontrar pares potenciales de valores de clave a los que pueda hacer referencia como variables de entorno en el pod. Las credenciales de servicio se almacenan en la clave binding del secreto.

    kubectl get secrets binding-<service_instance_name> --namespace=<namespace> -o yaml
    

    Salida de ejemplo

    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. Cree un archivo YAML para el despliegue de Kubernetes y especifique una variable de entorno que haga referencia a la clave 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
    El nombre de la variable de entorno.
    env.valueFrom.secretKeyRef.name
    El nombre del secreto que ha anotado en el paso anterior.
    env.valueFrom.secretKeyRef.key
    La clave que forma parte de su secreto y a la que desea hacer referencia en la variable de entorno. Para hacer referencia a las credenciales de servicio, debe utilizar la clave de enlace.
  4. Cree el pod que hace referencia a la clave binding del secreto como variable de entorno.

    kubectl apply -f secret-test.yaml
    
  5. Verifique que se ha creado el pod.

    kubectl get pods
    

    Ejemplo de salida de CLI:

    NAME                           READY     STATUS    RESTARTS   AGE
    secret-test-1111454598-gfx32   1/1       Running   0          1m
    
  6. Compruebe que la variable de entorno se haya establecido correctamente.

    1. Inicie una sesión en el pod.
      kubectl exec <pod_name> -it bash
      
    2. Enumere todas las variables de entorno en el pod.
      env
      
      Salida de ejemplo
      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. Configure la app para leer la variable de entorno y analizar el contenido JSON para recuperar la información que necesita para acceder al servicio.

    Código de ejemplo en Python:

    if os.environ.get('BINDING'):
        credentials = json.loads(os.environ.get('BINDING'))
    
  8. Opcional: Como precaución, añada manejo de errores a la app por si la variable de entorno BINDING no se ha establecido correctamente.

    Código de ejemplo en Java:

    if (System.getenv("BINDING") == null) {
    throw new RuntimeException("Environment variable 'SECRET' is not set!");
    }
    

    Código de ejemplo en Node.js:

    if (!process.env.BINDING) {
    console.error('ENVIRONMENT variable "BINDING" is not set!');
    process.exit(1);
    }
    

Eliminación de un servicio de un clúster

Si no desea utilizar un servicio de IBM Cloud que ha enlazado con el clúster, puede eliminar manualmente el secreto de Kubernetes y los pods que acceden al secreto desde el clúster.

  1. Obtenga una lista de los servicios que están enlazados a su clúster y anote el nombre del servicio y el espacio de nombres al que está enlazado el servicio.

    ibmcloud ks cluster service ls --cluster
    

    Salida de ejemplo

    OK
    Service   Instance GUID                          Key                                                                  Namespace   
    myservice 12345ab1-1234-1abc-a12b-12abc12a12ab   kube-a1a12abcd12a123abc1a12ab1a1234ab7.abcdefg0p1abcd123lgg.default   default  
    
  2. Cree una lista de los secretos de Kubernetes del espacio de nombres al que está enlazado el servicio y busque el secreto con un nombre que siga el formato binding-<service_name>.

    kubectl get secrets -n <namespace> | grep Opaque
    

    Salida de ejemplo

    binding-myservice   Opaque     1      3d23h
    
  3. Recuperar todos los pods que acceden al secreto.

    kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.secret.secretName}{" "}{end}{end}' | grep "<secret_name>"
    

    Si la salida de la CLI está vacía, significa que no existen pods en el clúster que monten el secreto.

  4. Si tiene pods que monten el secreto, elimine el pod o el despliegue que gestiona el pod, o bien actualice el pod y archivo YAML de despliegue para que utilicen otro secreto.

    • Para eliminar un pod o un despliegue:
      kubectl delete pod <pod_name> -n <namespace>
      
      kubectl delete deployment <deployment_name> -n <namespace>
      
    • Para actualizar un pod o un despliegue existentes:
      1. Obtenga el archivo YAML del pod o del despliegue.
        kubectl get pod <pod_name> -o yaml
        
        kubectl get deployment <deployment_name> -o yaml
        
      2. Copie el archivo YAML y en la sección spec.volumes y cambie el nombre del secreto que desea utilizar.
      3. Aplique el cambio al clúster.
        kubectl apply -f pod.yaml
        
        kubectl apply -f deployment.yaml
        
      4. Verifique que se ha creado un nuevo pod con la especificación de volumen actualizada.
        kubectl get pods
        
        kubectl describe pod <pod_name>
        
  5. Elimine el secreto.

    kubectl delete secret <secret_name> -n <namespace>
    
  6. Verifique que el secreto se ha eliminado.

    kubectl get secrets -n <namespace>
    
  7. Opcional. Elimine la instancia del servicio IBM Cloud.

    ibmcloud resource service-instance-delete <service_name>