將服務憑證與群集綁定
新增 IBM Cloud 服務,透過 Watson AI、資料、安全性和物聯網 ( IoT ) 等領域的額外功能,強化您的 Kubernetes 集群。
自 2025 年 08 月 04 日起,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 服務帳戶預測磁區,以取得記號,該記號可以交換應用程式用來向 IBM Cloud 服務進行鑑別的 IAM 記號。
手動將服務憑證與群集綁定
開始之前:
- 確定您具有下列角色:
- 編輯 或 管理員 IBM Cloud IAM 平台存取角色 為您要綁定服務的群集。
- 作家 或 經理 IBM Cloud IAM 服務存取角色 為您要綁定服務的 Kubernetes 命名空間。
- 登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。
您可以透過完成下列步驟,手動將服務憑證新增至群集。
-
取得您要新增至叢集的服務的實體名稱。
ibmcloud resource service-instances -
建立服務金鑰。 如需詳細資訊,請參閱 指令參考。
ibmcloud resource service-key-create NAME [ROLE] --instance-name SERVICE_INSTANCE -
複製
Credentials部分,並將其儲存為無擴展名的檔案,名稱為creds。 -
建立 Kubernetes secret,使用您建立的憑證檔案。
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選項指定現有服務憑證的名稱。 如果您打算攜帶自己的憑證,請確定您現有的憑證不是一次性檢視憑證。 如需詳細資訊,請參閱 一次性憑證。 - 您的服務可能還不支援私有雲服務端點。 如果您有僅私有的群集,則必須使用使用私有雲服務端點的服務憑證,或開放公共 IP 位址和連接埠來連接您的服務。
檢閱以下各節,瞭解將服務憑證綁定到群集的步驟。
使用 IBM Cloud 服務連結來自動建立 IBM Cloud 服務的服務認證,並將這些認證儲存在 Kubernetes 密碼中。
如果您的服務支援私有雲服務端點,您可以使用私有雲服務端點手動建立服務憑證,然後再使用 --key 選項指定憑證名稱。
開始之前:
- 確定您具有下列角色:
- 編輯 或 管理員 IBM Cloud IAM 平台存取角色 為您要綁定服務的群集。
- 作家 或 經理 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 - 將連結值解碼。
輸出範例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 服務所需的所有資訊和認證。
-
列出叢集裡的可用密碼,並記下您密碼的名稱。 尋找類型為 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 密碼中的服務認證及其他鍵值組當成環境變數新增至部署中。
-
列出叢集裡的可用密碼,並記下您密碼的名稱。 尋找類型為 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- 此索引鍵為您密碼的一部分,您想在環境變數中參照它。 若要引用服務憑證,您必須使用綁定金鑰。
-
建立 Pod,其以環境變數參照您密碼的
binding索引鍵。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>