将服务证书绑定到群集
添加 IBM Cloud 服务,利用 Watson AI、数据、安全和物联网 ( IoT ) 等领域的额外功能来增强您的 Kubernetes 集群。
自 2025 年 8 月 4 日起,IBM Cloud 将一次性查看作为新服务实例中所有资源凭证的默认行为。 而不是使用 service bind CLI 将服务凭证添加到您的集群,按照步骤 手动将服务凭证添加到您的集群。 更多信息,请参阅 一次性凭证。
- 什么是 IBM Cloud 服务绑定?
- 服务绑定是一种为 IBM Cloud 服务创建服务凭据的快速方法,方法是使用其公共云服务端点,并将这些凭据存储在群集中的 Kubernetes secret 中。 要将服务绑定到集群,必须首先供应服务的实例。 然后,您可以 手动将服务绑定到集群,也可以使用
service bindCLI 命令 用于创建服务凭证和 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 服务的访问策略的可信概要文件。 然后,根据资源组中集群内的所有
prodKubernetes 名称空间之类的条件,将可信概要文件与任意数量的集群进行链接。 最后,您的 pod 会安装 Kubernetes 服务帐户投影卷,以获取可以交换为 IAM 令牌的令牌,应用程序使用该令牌向 IBM Cloud 服务进行认证。
将服务证书手动绑定到群集
开始之前:
- 确保您具有以下角色:
- 编辑 或 管理员 IBM Cloud IAM 平台访问角色 的群集。
- Writer or Manager IBM Cloud IAM 服务访问角色,用于 Kubernetes 您要绑定服务的命名空间。
- 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
您可以通过完成以下步骤将服务证书手动添加到群集中。
-
获取您想要添加到集群中的服务的实例名称。
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 secret。 - 如果我的现有凭证是一次性查看凭证怎么办?
service bind命令不支持自带一次性查看凭据。 因此,如果要使用service bind命令,就不要指定--key参数。 运行不带--key的命令将为您创建一组新的凭据。- 如果您想要使用一次性查看的凭据,则必须 手动将服务绑定到您的集群。 此选项允许您使用现有的一次性查看凭据。
- 如果我想使用使用私有云服务终端的服务凭据,该怎么办?
- 默认情况下,
service bind命令使用公共云服务端点创建服务凭据。 要使用私有云服务端点,必须为使用私有云服务端点的服务手动创建服务凭据,然后使用--key选项指定现有服务凭据的名称。 如果您计划携带自己的证书,请确保您现有的证书不是一次性查看证书。 更多信息,请参阅 一次性凭证。 - 您的服务可能还不支持私有云服务端点。 如果您拥有纯私有群集,则必须使用使用私有云服务端点的服务凭据,或者开放公共 IP 地址和端口以连接到您的服务。
查看以下章节,了解将服务证书绑定到群集的步骤。
使用 IBM Cloud 服务绑定可自动为 IBM Cloud 服务创建服务凭证,并将这些凭证存储在 Kubernetes 私钥中。
如果您的服务支持私有云服务端点,您可以使用私有云服务端点手动创建服务凭据,然后使用 --key 选项指定凭据名称。
开始之前:
- 确保您具有以下角色:
- 编辑 或 管理员 IBM Cloud IAM 平台访问角色 的群集。
- Writer or Manager IBM Cloud IAM 服务访问角色,用于 Kubernetes 您要绑定服务的命名空间。
- 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
要将 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 -
确定要用于添加服务的集群名称空间。
kubectl get namespaces -
将服务绑定到群集,为使用公共云服务端点的服务创建服务凭据,并将凭据存储在 Kubernetes secret 中。 如果已有服务凭据,请使用
--key选项指定凭据名称。 对于启用了 IAM 的服务,凭据会以 Writer 服务访问角色自动创建,但也可以使用--role选项指定不同的服务访问角色。 如果使用--key选项,请勿包含--role选项。如果您计划使用自己的凭据,请确保您现有的凭据不是一次性查看凭据,或者使用建议的方式将服务凭据手动保存到群集。 更多信息,请参阅 一次性凭证。
ibmcloud ks cluster service bind --cluster <cluster_name_or_ID> --namespace <namespace> --service <service_instance_name> [--key <service_instance_key>] [--role <IAM_service_role>]服务凭据创建成功后,会创建一个名为
binding-<service_instance_name>的 Kubernetes secret。示例输出
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> -
验证 Kubernetes 私钥中的服务凭证。
- 获取私钥的详细信息并记录 binding 值。 binding 值采用 base64 编码,并且以 JSON 格式保存服务实例的凭证。
示例输出kubectl get secrets binding-<service_instance_name> --namespace=<namespace> -o yamlapiVersion: 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 - 对 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 服务访问角色。 - 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
- 向集群添加 IBM Cloud 服务。
将私钥作为卷安装到 pod
将私钥作为卷安装到 pod 时,会将名为 binding 的文件存储在卷安装目录中。 JSON 格式的 binding 文件包含访问 IBM Cloud 服务所需的全部信息和凭证。
-
列出集群中的可用私钥并记下私钥的 name。 查找类型为 Opaque 的私钥。 如果存在多个私钥,请联系集群管理员来确定正确的服务私钥。
kubectl 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_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- 在容器中安装卷的目录的绝对路径。
volumeMounts.name和volumes.name- 要安装到 pod 中的卷的名称。
secret.defaultMode- 私钥的读写许可权。 使用
420可设置只读许可权。 secret.secretName- 先前步骤中记录的私钥的名称。
-
创建 pod 并安装私钥作为卷。
kubectl apply -f secret-test.yaml -
验证 pod 是否已创建。
kubectl get podsCLI 输出示例:
NAME READY STATUS RESTARTS AGE secret-test-1111454598-gfx32 1/1 Running 0 1m -
访问服务凭证。
-
登录到 pod。
kubectl exec <pod_name> -it bash -
浏览至先前定义的卷安装路径并列出卷安装路径中的文件。
cd <volume_mountpath> && ls示例输出
bindingbinding文件包含存储在 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 的私钥。 如果存在多个私钥,请联系集群管理员来确定正确的服务私钥。
kubectl get secrets示例输出
NAME TYPE DATA AGE binding-<service_instance_name> Opaque 1 3m -
获取私钥的详细信息,以查找可以引用为 pod 中的环境变量的潜在键/值对。 服务凭证存储在私钥的
binding密钥中。kubectl get secrets binding-<service_instance_name> --namespace=<namespace> -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: <namespace> 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_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: bindingcontainers.env.name- 环境变量的名称。
env.valueFrom.secretKeyRef.name- 先前步骤中记录的私钥的名称。
env.valueFrom.secretKeyRef.key- 属于私钥的一部分并且您想要在环境变量中引用的密钥。 要引用服务凭证,必须使用绑定密钥。
-
创建引用私钥的
binding密钥作为环境变量的 pod。kubectl apply -f secret-test.yaml -
验证 pod 是否已创建。
kubectl get podsCLI 输出示例:
NAME READY STATUS RESTARTS AGE secret-test-1111454598-gfx32 1/1 Running 0 1m -
验证是否已正确设置环境变量。
- 登录到 pod。
kubectl exec <pod_name> -it bash - 列出 pod 中的所有环境变量。
示例输出envBINDING={"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 ks 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>格式的保密信息。kubectl get secrets -n <namespace> | grep Opaque示例输出
binding-myservice Opaque 1 3d23h -
检索访问此私钥的所有 pod。
kubectl 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 或部署,请执行以下操作:
kubectl delete pod <pod_name> -n <namespace>kubectl delete deployment <deployment_name> -n <namespace> - 要更新现有 pod 或部署,请执行以下操作:
- 获取 pod 或部署 YAML 文件。
kubectl get pod <pod_name> -o yamlkubectl get deployment <deployment_name> -o yaml - 复制 YAML 文件,并在
spec.volumes部分中,更改要使用的私钥的名称。 - 在集群中应用更改。
kubectl apply -f pod.yamlkubectl apply -f deployment.yaml - 验证是否使用更新的卷规范创建了新 pod。
kubectl get podskubectl describe pod <pod_name>
- 获取 pod 或部署 YAML 文件。
- 要除去 pod 或部署,请执行以下操作:
-
除去私钥。
kubectl delete secret <secret_name> -n <namespace> -
验证私钥是否已除去。
kubectl get secrets -n <namespace> -
可选。 除去 IBM Cloud 服务实例。
ibmcloud resource service-instance-delete <service_name>