使用 IBM Cloud 服务绑定添加服务
添加 IBM Cloud 服务,为您的 Red Hat OpenShift 集群提供 Watson 人工智能、数据、安全性和物联网( IoT )等领域的额外功能。
关于服务绑定
查看有关服务绑定的以下常见问题。
我可以绑定哪些类型的服务到我的集群?
您可以绑定为 IBM Cloud Identity and Access Management (IAM) 启用的服务。 启用 IAM 的服务提供更细颗粒度的访问控制,并且可以在 IBM Cloud 资源组中进行管理。 有关更多信息,请参阅管理对资源的访问权。
要查找受支持 IBM Cloud 服务的列表,请参阅 IBM Cloud 目录。
IBM Cloud 服务有什么约束?
服务绑定是一种快速创建 IBM Cloud 服务凭证的方法,它使用公共云服务端点,并将这些凭证存储在集群中的 Kubernetes 密钥中。 要将服务绑定到集群,必须首先供应服务的实例。 然后,使用 ibmcloud oc cluster service bind
命令 创建服务凭证和 Kubernetes 密钥。 Kubernetes 私钥在 etcd 中会自动加密,以保护您的数据。
想要使私钥更安全吗? 要求您的集群管理员在集群中 启用密钥管理服务提供商 来加密新的和现有的机密,例如存储您的 IBM Cloud 服务实例的凭据的机密。
我已经有一个 IBM Cloud 服务。 我还能使用 IBM Cloud 服务绑定吗?
可以,您可以使用满足命名需求的服务,并复用服务凭证。
- 命名:确保服务名称采用以下正则表达式格式。 允许的名称示例为
myservice
或example.com
。 不允许使用的字符包括空格和下划线。[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*
- 服务凭证: 要使用现有服务凭证,请在
ibmcloud oc cluster service bind
命令中指定--key
选项并提供服务凭证的名称。IBM Cloud 服务绑定将使用现有服务凭证自动创建 Kubernetes 私钥。
如果我想使用使用私有云服务终端的服务凭证怎么办?
默认情况下,ibmcloud oc cluster service bind
命令使用公共云服务终端创建服务凭证。 要使用私有云服务终端,您必须手动创建使用私有云服务终端的服务凭据,然后使用 --key
选项指定现有服务凭据的名称。
您的服务可能尚不支持私有云服务终端。
我可以在仪表盘上使用所有 IBM Cloud 服务吗?
只能将服务绑定用于支持服务密钥的服务,这样才能自动创建服务凭证,并将其存储在 Kubernetes 私钥中。 要了解如何将服务连接到应用程序,请参阅 将服务连接到应用程序。
不支持服务密钥的服务通常会提供一个应用程序接口(API),供您在应用程序中使用。 服务绑定方法不会自动为应用程序设置 API 访问权。 请确保查看服务的 API 文档,并在应用程序中实现 API 接口。
能否一次将多个 IBM Cloud 服务绑定到多个集群?
IBM Cloud 服务绑定基于每个集群,每个服务,并通过创建 pod 可以安装的 Kubernetes 私钥来工作。
对于多个集群和服务,可以 改为使用 IAM 可信概要文件。 在 IAM 中,创建具有所需 IBM Cloud 服务的访问策略的可信概要文件。 然后,根据资源组中集群内的所有 prod
Kubernetes 名称空间之类的条件,将可信概要文件与任意数量的集群进行链接。 最后,您的 pod 会安装 Kubernetes 服务帐户投影卷,以获取可以交换为
IAM 令牌的令牌,应用程序使用该令牌向 IBM Cloud 服务进行认证。
向集群添加 IBM Cloud 服务
使用 IBM Cloud 服务绑定可自动为 IBM Cloud 服务创建服务凭证,并将这些凭证存储在 Kubernetes 私钥中。
开始之前:
- 确保您具有以下角色:
- 编辑者或管理员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 密钥中。 如果您有现有的服务凭证,请使用
--key
选项指定凭证的名称。 对于启用IAM的服务,凭据将自动创建为Writer 服务访问角色,但您可以使用--role
选项指定不同的服务访问角色。 如果使用--key
选项,请勿包含--role
选项。如果您的服务支持私有云服务终端,您可以手动创建私有云服务终端的服务凭证,然后使用
--key
选项指定凭证的名称。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 密钥。示例输出
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 私钥中的服务凭证。
手动添加服务凭证到您的集群中
作为 service bind
命令的替代方案,您还可以通过完成以下步骤手动将服务凭据添加到群集中。
-
获取您想要添加到集群中的服务的实例名称。
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
从应用程序访问服务凭证
要从应用程序访问 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>