将服务证书绑定到群集
添加 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])?)
. 允许的名称示例为myservice
或example.com
。 不允许使用的字符包括空格和下划线。 - 能否一次将多个 IBM Cloud 服务绑定到多个集群?
- IBM Cloud 服务绑定基于每个集群,每个服务,并通过创建 pod 可以安装的 Kubernetes 私钥来工作。
- 对于多个集群和服务,可以 改为使用 IAM 可信概要文件。 在 IAM 中,创建具有所需 IBM Cloud 服务的访问策略的可信概要文件。 然后,根据资源组中集群内的所有
prod
Kubernetes 名称空间之类的条件,将可信概要文件与任意数量的集群进行链接。 最后,您的 pod 会安装 Kubernetes 服务帐户投影卷,以获取可以交换为 IAM 令牌的令牌,应用程序使用该令牌向 IBM Cloud 服务进行认证。
将服务证书手动绑定到群集
开始之前:
- 确保您具有以下角色:
- 编辑者或管理员IBM Cloud 您想要绑定服务的集群的 IAM 平台访问角色。
- Writer 或 Manager IBM Cloud IAM 服务访问角色,用于要在其中绑定服务的 Red Hat OpenShift 项目。
- 访问 Red Hat OpenShift 集群。
您可以通过完成以下步骤将服务证书手动添加到群集中。
-
获取您想要添加到集群中的服务的实例名称。
ibmcloud resource service-instances
-
创建服务密钥。 更多信息,请参阅 命令参考。
ibmcloud resource service-key-create NAME [ROLE] --instance-name SERVICE_INSTANCE
-
复制
Credentials
部分,并将其保存到名为creds
的无扩展名文件中。 -
创建一个使用您创建的凭据文件的 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 您想要绑定服务的集群的 IAM 平台访问角色。
- Writer 或 Manager IBM Cloud IAM 服务访问角色,用于要在其中绑定服务的 Red Hat OpenShift 项目。
- 访问 Red Hat OpenShift 集群。
要将 IBM Cloud 服务添加到集群:
-
- 某些 IBM Cloud 服务仅在精选区域中可用。 仅当服务在与您的集群相同的区域中可用时,才可将服务绑定到集群。 此外,如果想要在华盛顿专区中创建服务实例,必须使用 CLI。
- 对于启用 IAM 的服务:必须在集群所在的资源组中创建服务实例。 一个服务只能在一个资源组中进行创建,并且在此之后无法进行更改。
- 请确保服务名称的格式为
myservice
或example.com
。 不允许使用空格和下划线。
-
检查创建的服务类型,并记下服务实例名称。
ibmcloud resource service-instances
示例输出
NAME Location State Type Tags <iam_service_instance_name> <region> active service_instance
-
确定要用于添加服务的群集项目。
oc get namespaces
-
将服务绑定到群集,为使用公共云服务端点的服务创建服务凭据,并将凭据存储在 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>
-
验证 Kubernetes 私钥中的服务凭证。
- 获取私钥的详细信息并记录 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
- 对 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"}
- 可选:在 IBM Cloud 仪表板中,将在先前步骤中解码的服务凭证与针对服务实例找到的服务凭证进行比较。
- 获取私钥的详细信息并记录 binding 值。 binding 值采用 base64 编码,并且以 JSON 格式保存服务实例的凭证。
-
既然您的服务已绑定到集群,就必须配置应用程序以访问 Kubernetes 私钥中的服务凭证。
从应用程序访问服务凭证
要从应用程序访问 IBM Cloud 服务实例,必须使存储在 Kubernetes 私钥中的服务凭证可用于应用程序。
服务实例凭证采用 base64 编码并且以 JSON 格式存储在私钥中。 要访问私钥中的数据,请从以下选项中进行选择:
开始之前:
- 确保您具有
kube-system
项目的 Writer 或 Manager IBM Cloud IAM 服务访问角色。 - 访问 Red Hat OpenShift 集群。
- 向集群添加 IBM Cloud 服务。
将私钥作为卷安装到 pod
将私钥作为卷安装到 pod 时,会将名为 binding
的文件存储在卷安装目录中。 JSON 格式的 binding
文件包含访问 IBM Cloud 服务所需的全部信息和凭证。
-
列出集群中的可用私钥并记下私钥的 name。 查找类型为 Opaque 的私钥。 如果存在多个私钥,请联系集群管理员来确定正确的服务私钥。
oc get secrets
示例输出
NAME TYPE DATA AGE binding-<service_instance_name> Opaque 1 3m
-
针对 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.name
和volumes.name
- 要安装到 pod 中的卷的名称。
secret.defaultMode
- 私钥的读写许可权。 使用
420
可设置只读许可权。 secret.secretName
- 先前步骤中记录的私钥的名称。
-
创建 pod 并安装私钥作为卷。
oc apply -f secret-test.yaml
-
验证 pod 是否已创建。
oc get pods
CLI 输出示例:
NAME READY STATUS RESTARTS AGE secret-test-1111454598-gfx32 1/1 Running 0 1m
-
访问服务凭证。
-
登录到 pod。
oc exec <pod_name> -it bash
-
浏览至先前定义的卷安装路径并列出卷安装路径中的文件。
cd <volume_mountpath> && ls
示例输出
binding
binding
文件包含存储在 Kubernetes 私钥中的服务凭证。 -
查看服务凭证。 凭证以 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"}
-
配置应用程序以解析 JSON 内容,并检索访问服务所需的信息。
-
在环境变量中引用私钥
您可以将来自 Kubernetes 私钥的服务凭证和其他键/值对作为环境变量添加到部署中。
-
列出集群中的可用私钥并记下私钥的 name。 查找类型为 Opaque 的私钥。 如果存在多个私钥,请联系集群管理员来确定正确的服务私钥。
oc get secrets
示例输出
NAME TYPE DATA AGE binding-<service_instance_name> Opaque 1 3m
-
获取私钥的详细信息,以查找可以引用为 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
-
为 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
- 属于私钥的一部分并且您想要在环境变量中引用的密钥。 要引用服务凭证,必须使用绑定密钥。
-
创建引用私钥的
binding
密钥作为环境变量的 pod。oc apply -f secret-test.yaml
-
验证 pod 是否已创建。
oc get pods
CLI 输出示例:
NAME READY STATUS RESTARTS AGE secret-test-1111454598-gfx32 1/1 Running 0 1m
-
验证是否已正确设置环境变量。
- 登录到 pod。
oc exec <pod_name> -it bash
- 列出 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"}
- 登录到 pod。
-
配置应用程序以读取环境变量,并解析 JSON 内容以检索访问服务所需的信息。
Python 示例代码:
if os.environ.get('BINDING'): credentials = json.loads(os.environ.get('BINDING'))
-
可选:作为预防措施,将错误处理添加到应用程序,以应对
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。
-
列出与群集绑定的服务,并注明服务名称和服务绑定的项目。
ibmcloud oc cluster service ls --cluster
示例输出
OK Service Instance GUID Key Namespace myservice 12345ab1-1234-1abc-a12b-12abc12a12ab kube-a1a12abcd12a123abc1a12ab1a1234ab7.abcdefg0p1abcd123lgg.default default
-
在服务绑定的项目中列出 Kubernetes 保密信息,并查找名称符合
binding-<service_name>
格式的保密信息。oc get secrets -n <project> | grep Opaque
示例输出
binding-myservice Opaque 1 3d23h
-
检索访问此私钥的所有 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。
-
如果有安装了此私钥的 pod,请除去该 pod 或除去管理该 pod 的部署,或者更新该 pod 和部署 YAML 以改为使用其他私钥。
- 要除去 pod 或部署,请执行以下操作:
oc delete pod <pod_name> -n <project>
oc delete deployment <deployment_name> -n <project>
- 要更新现有 pod 或部署,请执行以下操作:
- 获取 pod 或部署 YAML 文件。
oc get pod <pod_name> -o yaml
oc get deployment <deployment_name> -o yaml
- 复制 YAML 文件,并在
spec.volumes
部分中,更改要使用的私钥的名称。 - 在集群中应用更改。
oc apply -f pod.yaml
oc apply -f deployment.yaml
- 验证是否使用更新的卷规范创建了新 pod。
oc get pods
oc describe pod <pod_name>
- 获取 pod 或部署 YAML 文件。
- 要除去 pod 或部署,请执行以下操作:
-
除去私钥。
oc delete secret <secret_name> -n <project>
-
验证私钥是否已除去。
oc get secrets -n <project>
-
可选。 除去 IBM Cloud 服务实例。
ibmcloud resource service-instance-delete <service_name>