將服務憑證與群集綁定

新增 IBM Cloud 服務,透過 Watson AI、資料、安全性和物聯網 ( IoT ) 等領域的額外功能,強化您的 Kubernetes 集群。

自 2025 年 08 月 04 日起,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 服務帳戶預測磁區,以取得記號,該記號可以交換應用程式用來向 IBM Cloud 服務進行鑑別的 IAM 記號。

手動將服務憑證與群集綁定

開始之前:

您可以透過完成下列步驟,手動將服務憑證新增至群集。

  1. 取得您要新增至叢集的服務的實體名稱。

    ibmcloud resource service-instances
    
  2. 建立服務金鑰。 如需詳細資訊,請參閱 指令參考

    ibmcloud resource service-key-create NAME [ROLE] --instance-name SERVICE_INSTANCE
    
  3. 複製 Credentials 部分,並將其儲存為無擴展名的檔案,名稱為 creds

  4. 建立 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 服務新增至叢集裡,請執行下列動作:

  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. 識別您要用來新增服務的叢集名稱空間。

    kubectl get namespaces
    
  4. 將服務綁定到您的群集,為您的服務建立使用公共雲端服務端點的服務憑證,並將憑證儲存在 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>
    
  5. 驗證 Kubernetes 密碼中的服務認證。

    1. 取得密碼的詳細資料,並記下binding 值。 binding 值以 base64 編碼,並以 JSON 格式保留服務實例的認證。
      kubectl get secrets binding-<service_instance_name> --namespace=<namespace> -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: <namespace>
        resourceVersion: "6145900"
        selfLink: /api/v1/namespaces/default/secrets/binding-mycloudant
        uid: 33333c33-3c33-33c3-cc33-cc33333333c
      type: Opaque
      
    2. 將連結值解碼。
      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. 列出叢集裡的可用密碼,並記下您密碼的名稱。 尋找類型為 Opaque 的密碼。 如果有多個密碼,請與叢集管理者聯絡,以識別正確的服務密碼。

    kubectl 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_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.namevolumes.name
    要裝載至 Pod 之磁區的名稱。
    secret.defaultMode
    密碼的讀取權和寫入權。 請使用 420 來設定唯讀許可權。
    secret.secretName
    您在前一個步驟記下的密碼名稱。
  3. 建立 Pod,並以磁區裝載密碼。

    kubectl apply -f secret-test.yaml
    
  4. 驗證已建立 Pod。

    kubectl get pods
    

    CLI 輸出範例:

    NAME                           READY     STATUS    RESTARTS   AGE
    secret-test-1111454598-gfx32   1/1       Running   0          1m
    
  5. 存取服務認證。

    1. 登入 Pod。

      kubectl 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. 列出叢集裡的可用密碼,並記下您密碼的名稱。 尋找類型為 Opaque 的密碼。 如果有多個密碼,請與叢集管理者聯絡,以識別正確的服務密碼。

    kubectl get secrets
    

    輸出範例

    NAME                              TYPE            DATA      AGE
    binding-<service_instance_name>   Opaque          1         3m
    
  2. 取得您密碼的詳細資料,以尋找您可以在 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
    
  3. 為您的 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: binding
    
    containers.env.name
    環境變數的名稱。
    env.valueFrom.secretKeyRef.name
    您在前一個步驟記下的密碼名稱。
    env.valueFrom.secretKeyRef.key
    此索引鍵為您密碼的一部分,您想在環境變數中參照它。 若要引用服務憑證,您必須使用綁定金鑰。
  4. 建立 Pod,其以環境變數參照您密碼的 binding 索引鍵。

    kubectl apply -f secret-test.yaml
    
  5. 驗證已建立 Pod。

    kubectl get pods
    

    CLI 輸出範例:

    NAME                           READY     STATUS    RESTARTS   AGE
    secret-test-1111454598-gfx32   1/1       Running   0          1m
    
  6. 驗證是否已正確設定環境變數。

    1. 登入 Pod。
      kubectl 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 ks 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> 格式的秘訣。

    kubectl get secrets -n <namespace> | grep Opaque
    

    輸出範例

    binding-myservice   Opaque     1      3d23h
    
  3. 擷取存取此密碼的所有 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。

  4. 如果有裝載了此密碼的 pod,請移除該 Pod 或移除管理該 Pod 的部署,或者更新該 Pod 和部署 YAML 以改為使用其他密碼。

    • 移除 Pod 或部署
      kubectl delete pod <pod_name> -n <namespace>
      
      kubectl delete deployment <deployment_name> -n <namespace>
      
    • 更新現有 Pod 或部署
      1. 取得 Pod 或部署 YAML 檔案。
        kubectl get pod <pod_name> -o yaml
        
        kubectl get deployment <deployment_name> -o yaml
        
      2. 複製 YAML 檔案,並在 spec.volumes 區段中,變更要使用的密碼的名稱。
      3. 在叢集裡套用變更。
        kubectl apply -f pod.yaml
        
        kubectl apply -f deployment.yaml
        
      4. 驗證是否使用更新的磁區規格建立了新 pod。
        kubectl get pods
        
        kubectl describe pod <pod_name>
        
  5. 移除密碼。

    kubectl delete secret <secret_name> -n <namespace>
    
  6. 驗證密碼是否已移除。

    kubectl get secrets -n <namespace>
    
  7. 選用。 移除 IBM Cloud 服務實例。

    ibmcloud resource service-instance-delete <service_name>