IBM Cloud Docs
将服务证书绑定到群集

将服务证书绑定到群集

添加 IBM Cloud 服务,利用 Watson AI、数据、安全和物联网 ( IoT ) 等领域的额外功能来增强您的 Red Hat OpenShift 集群。

自 2025 年 8 月 4 日起,IBM Cloud 将一次性查看作为新服务实例中所有资源凭证的默认行为。 而不是使用 service bind CLI 将服务凭证添加到您的集群,按照步骤 手动将服务凭证添加到您的集群。 更多信息,请参阅 一次性凭证

什么是 IBM Cloud 服务绑定?
服务绑定是为 IBM Cloud 服务创建服务凭据的一种快速方法,方法是使用其公共云服务端点,并将这些凭据存储在群集中的 Kubernetes secret 中。 要将服务绑定到集群,必须首先供应服务的实例。 然后,您可以 手动将服务绑定到集群,也可以使用 service bind CLI 命令 用于创建服务凭证和 Kubernetes 机密。
我可以将哪些类型的服务绑定到群集上?
您可以绑定已启用 IBM Cloud Identity and Access Management (IAM) 的服务。 启用 IAM 的服务提供更细颗粒度的访问控制,并且可以在 IBM Cloud 资源组中进行管理。 有关更多信息,请参阅管理对资源的访问权。 要查找受支持 IBM Cloud 服务的列表,请参阅 IBM Cloud 目录
如何使我的群集机密更加安全?
请群集管理员在群集中 启用密钥管理服务提供商,以加密新的和现有的机密,例如存储 IBM Cloud 服务实例凭证的机密。
我可以在群集中使用所有 IBM Cloud 服务吗?
只能将服务绑定用于支持服务密钥的服务,这样才能自动创建服务凭证,并将其存储在 Kubernetes 私钥中。 要了解如何将服务连接到应用程序,请参阅 将服务连接到应用程序
不支持服务密钥的服务通常会提供一个 API,您可以在应用程序中使用。 服务绑定方法不会自动为应用程序设置 API 访问权。 请确保查看服务的 API 文档,并在应用程序中实现 API 接口。
能否将现有的 IBM Cloud 服务实例绑定到群集?
是的,您可以使用符合命名要求的服务,并在将它们绑定到群集时重复使用服务凭据。 确保服务名称采用以下 regex 格式。[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?). 允许的名称示例为 myserviceexample.com。 不允许使用的字符包括空格和下划线。
能否一次将多个 IBM Cloud 服务绑定到多个集群?
IBM Cloud 服务绑定基于每个集群,每个服务,并通过创建 pod 可以安装的 Kubernetes 私钥来工作。
对于多个集群和服务,可以 改为使用 IAM 可信概要文件。 在 IAM 中,创建具有所需 IBM Cloud 服务的访问策略的可信概要文件。 然后,根据资源组中集群内的所有 prod Kubernetes 名称空间之类的条件,将可信概要文件与任意数量的集群进行链接。 最后,您的 pod 会安装 Kubernetes 服务帐户投影卷,以获取可以交换为 IAM 令牌的令牌,应用程序使用该令牌向 IBM Cloud 服务进行认证。

将服务证书手动绑定到群集

开始之前:

您可以通过完成以下步骤将服务证书手动添加到群集中。

  1. 获取您想要添加到集群中的服务的实例名称。

    ibmcloud resource service-instances
    
  2. 创建服务密钥。 更多信息,请参阅 命令参考

    ibmcloud resource service-key-create NAME [ROLE] --instance-name SERVICE_INSTANCE
    
  3. 复制 Credentials 部分,并将其保存到名为 creds 的无扩展名文件中。

  4. 创建一个使用您创建的凭据文件的 Kubernetes 密码。

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

使用 service bind CLI 向群集添加服务

绑定时可以使用现有的服务证书吗?
运行 service bind 命令时,可选择指定 --key 参数,并提供现有服务凭据的名称。IBM Cloud 服务绑定会自动使用现有服务凭据创建 Kubernetes 保密信息。
如果我的现有凭证是一次性查看凭证怎么办?
service bind 命令不支持自带一次性查看凭据。 因此,如果要使用 service bind 命令,请不要指定 --key 参数。 运行不带 --key 的命令将为您创建一组新的凭据。
如果您想要使用一次性查看的凭据,则必须 手动将服务绑定到您的集群。 此选项允许您使用现有的一次性查看凭据。
如果我想使用使用私有云服务终端的服务凭据,该怎么办?
默认情况下,service bind 命令使用公共云服务端点创建服务凭据。 要使用私有云服务端点,必须为使用私有云服务端点的服务手动创建服务凭据,然后使用 --key 选项指定现有服务凭据的名称。 如果您计划携带自己的证书,请确保您现有的证书不是一次性查看证书。 更多信息,请参阅 一次性凭证
您的服务可能还不支持私有云服务端点。

查看以下章节,了解将服务证书绑定到群集的步骤。

使用 IBM Cloud 服务绑定可自动为 IBM Cloud 服务创建服务凭证,并将这些凭证存储在 Kubernetes 私钥中。

如果您的服务支持私有云服务端点,您可以使用私有云服务端点手动创建服务凭据,然后使用 --key 选项指定凭据名称。

开始之前:

要将 IBM Cloud 服务添加到集群:

  1. 创建 IBM Cloud 服务的实例

    • 某些 IBM Cloud 服务仅在精选区域中可用。 仅当服务在与您的集群相同的区域中可用时,才可将服务绑定到集群。 此外,如果想要在华盛顿专区中创建服务实例,必须使用 CLI。
    • 对于启用 IAM 的服务:必须在集群所在的资源组中创建服务实例。 一个服务只能在一个资源组中进行创建,并且在此之后无法进行更改。
    • 请确保服务名称的格式为 myserviceexample.com。 不允许使用空格和下划线。
  2. 检查创建的服务类型,并记下服务实例名称

    ibmcloud resource service-instances
    

    示例输出

    NAME                          Location   State    Type               Tags
    <iam_service_instance_name>   <region>   active   service_instance
    
  3. 确定要用于添加服务的群集项目。

    oc get namespaces
    
  4. 将服务绑定到群集,为使用公共云服务端点的服务创建服务凭据,并将凭据存储在 Kubernetes secret 中。 如果已有服务凭据,请使用 --key 选项指定凭据名称。 对于启用了 IAM 的服务,凭据会以 Writer 服务访问角色自动创建,但也可以使用 --role 选项指定不同的服务访问角色。 如果使用 --key 选项,请勿包含 --role 选项。

    如果计划使用自己的凭据,请确保现有凭据不是一次性查看凭据,或者使用建议的方式将服务凭据手动保存到群集。 更多信息,请参阅 一次性凭证

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

    服务凭据创建成功后,会创建一个名为 binding-<service_instance_name> 的 Kubernetes secret。

    示例输出

    ibmcloud oc cluster service bind --cluster mycluster --namespace myproject --service cleardb
    Binding service instance to namespace...
    OK
    Namespace:         myproject
    Secret name:     binding-<service_instance_name>
    
  5. 验证 Kubernetes 私钥中的服务凭证。

    1. 获取私钥的详细信息并记录 binding 值。 binding 值采用 base64 编码,并且以 JSON 格式保存服务实例的凭证。
      oc get secrets binding-<service_instance_name> --namespace=<project> -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: <project>
        resourceVersion: "6145900"
        selfLink: /api/v1/namespaces/default/secrets/binding-mycloudant
        uid: 33333c33-3c33-33c3-cc33-cc33333333c
      type: Opaque
      
    2. 对 binding 值进行解码。
      echo "<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"}
      
    3. 可选:在 IBM Cloud 仪表板中,将在先前步骤中解码的服务凭证与针对服务实例找到的服务凭证进行比较。
  6. 既然您的服务已绑定到集群,就必须配置应用程序以访问 Kubernetes 私钥中的服务凭证

从应用程序访问服务凭证

要从应用程序访问 IBM Cloud 服务实例,必须使存储在 Kubernetes 私钥中的服务凭证可用于应用程序。

服务实例凭证采用 base64 编码并且以 JSON 格式存储在私钥中。 要访问私钥中的数据,请从以下选项中进行选择:

开始之前:

将私钥作为卷安装到 pod

将私钥作为卷安装到 pod 时,会将名为 binding 的文件存储在卷安装目录中。 JSON 格式的 binding 文件包含访问 IBM Cloud 服务所需的全部信息和凭证。

  1. 列出集群中的可用私钥并记下私钥的 name。 查找类型为 Opaque 的私钥。 如果存在多个私钥,请联系集群管理员来确定正确的服务私钥。

    oc get secrets
    

    示例输出

    NAME                              TYPE            DATA      AGE
    binding-<service_instance_name>   Opaque          1         3m
    
  2. 针对 Kubernetes 部署创建 YAML 文件并将私钥作为卷安装到 pod。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: secret-test
      name: secret-test
      namespace: <my_project>
    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
    在容器中安装卷的目录的绝对路径。
    volumeMounts.namevolumes.name
    要安装到 pod 中的卷的名称。
    secret.defaultMode
    私钥的读写许可权。 使用 420 可设置只读许可权。
    secret.secretName
    先前步骤中记录的私钥的名称。
  3. 创建 pod 并安装私钥作为卷。

    oc apply -f secret-test.yaml
    
  4. 验证 pod 是否已创建。

    oc get pods
    

    CLI 输出示例:

    NAME                           READY     STATUS    RESTARTS   AGE
    secret-test-1111454598-gfx32   1/1       Running   0          1m
    
  5. 访问服务凭证。

    1. 登录到 pod。

      oc exec <pod_name> -it bash
      
    2. 浏览至先前定义的卷安装路径并列出卷安装路径中的文件。

      cd <volume_mountpath> && ls
      

      示例输出

      binding
      

      binding 文件包含存储在 Kubernetes 私钥中的服务凭证。

    3. 查看服务凭证。 凭证以 JSON 格式存储为键/值对。

      cat 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>:<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. 配置应用程序以解析 JSON 内容,并检索访问服务所需的信息。

在环境变量中引用私钥

您可以将来自 Kubernetes 私钥的服务凭证和其他键/值对作为环境变量添加到部署中。

  1. 列出集群中的可用私钥并记下私钥的 name。 查找类型为 Opaque 的私钥。 如果存在多个私钥,请联系集群管理员来确定正确的服务私钥。

    oc get secrets
    

    示例输出

    NAME                              TYPE            DATA      AGE
    binding-<service_instance_name>   Opaque          1         3m
    
  2. 获取私钥的详细信息,以查找可以引用为 pod 中的环境变量的潜在键/值对。 服务凭证存储在私钥的 binding 密钥中。

    oc get secrets binding-<service_instance_name> --namespace=<project> -o yaml
    

    示例输出

    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: <project>
      resourceVersion: "6145900"
      selfLink: /api/v1/namespaces/default/secrets/binding-mycloudant
      uid: 12345a31-9a83-11e8-ba83-cd49014748f
    type: Opaque
    
  3. 为 Kubernetes 部署创建 YAML 文件,并指定引用 binding 密钥的环境变量。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: secret-test
      name: secret-test
      namespace: <my_project>
    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
    环境变量的名称。
    env.valueFrom.secretKeyRef.name
    先前步骤中记录的私钥的名称。
    env.valueFrom.secretKeyRef.key
    属于私钥的一部分并且您想要在环境变量中引用的密钥。 要引用服务凭证,必须使用绑定密钥。
  4. 创建引用私钥的 binding 密钥作为环境变量的 pod。

    oc apply -f secret-test.yaml
    
  5. 验证 pod 是否已创建。

    oc get pods
    

    CLI 输出示例:

    NAME                           READY     STATUS    RESTARTS   AGE
    secret-test-1111454598-gfx32   1/1       Running   0          1m
    
  6. 验证是否已正确设置环境变量。

    1. 登录到 pod。
      oc exec <pod_name> -it bash
      
    2. 列出 pod 中的所有环境变量。
      env
      
      示例输出
      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. 配置应用程序以读取环境变量,并解析 JSON 内容以检索访问服务所需的信息。

    Python 示例代码:

    if os.environ.get('BINDING'):
        credentials = json.loads(os.environ.get('BINDING'))
    
  8. 可选:作为预防措施,将错误处理添加到应用程序,以应对 BINDING 环境变量未正确设置的情况。

    Java 示例代码:

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

    Node.js 示例代码:

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

从集群中除去服务

如果不想使用绑定到群集的 IBM Cloud 服务,可以手动从群集中删除 Kubernetes 秘密和访问该秘密的 pod。

  1. 列出与群集绑定的服务,并注明服务名称和服务绑定的项目。

    ibmcloud oc cluster service ls --cluster
    

    示例输出

    OK
    Service   Instance GUID                          Key                                                                  Namespace   
    myservice 12345ab1-1234-1abc-a12b-12abc12a12ab   kube-a1a12abcd12a123abc1a12ab1a1234ab7.abcdefg0p1abcd123lgg.default   default  
    
  2. 在服务绑定的项目中列出 Kubernetes 保密信息,并查找名称符合 binding-<service_name> 格式的保密信息。

    oc get secrets -n <project> | grep Opaque
    

    示例输出

    binding-myservice   Opaque     1      3d23h
    
  3. 检索访问此私钥的所有 pod。

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

    如果 CLI 输出为空,说明集群中不存在安装此私钥的 pod。

  4. 如果有安装了此私钥的 pod,请除去该 pod 或除去管理该 pod 的部署,或者更新该 pod 和部署 YAML 以改为使用其他私钥。

    • 要除去 pod 或部署,请执行以下操作
      oc delete pod <pod_name> -n <project>
      
      oc delete deployment <deployment_name> -n <project>
      
    • 要更新现有 pod 或部署,请执行以下操作
      1. 获取 pod 或部署 YAML 文件。
        oc get pod <pod_name> -o yaml
        
        oc get deployment <deployment_name> -o yaml
        
      2. 复制 YAML 文件,并在 spec.volumes 部分中,更改要使用的私钥的名称。
      3. 在集群中应用更改。
        oc apply -f pod.yaml
        
        oc apply -f deployment.yaml
        
      4. 验证是否使用更新的卷规范创建了新 pod。
        oc get pods
        
        oc describe pod <pod_name>
        
  5. 除去私钥。

    oc delete secret <secret_name> -n <project>
    
  6. 验证私钥是否已除去。

    oc get secrets -n <project>
    
  7. 可选。 除去 IBM Cloud 服务实例。

    ibmcloud resource service-instance-delete <service_name>