設定映像檔登錄

規劃並建立映像註冊中心,讓開發人員可以使用 Docker 映像在 IBM Cloud® Kubernetes Service 中建立應用程式容器。

規劃映像檔登錄

映像檔通常會儲存在登錄中,而該登錄可供公開存取(公用登錄)或已設定一小組使用者的有限存取(專用登錄)。

公用登錄(例如 Docker Hub)可用來開始使用 Docker 及 Kubernetes 在叢集裡建立第一個容器化應用程式。 但是,如果是企業應用程式,則請使用專用登錄(例如 IBM Cloud Container Registry 中提供的登錄)來防止未授權使用者使用及變更映像檔。 叢集管理者必須設定專用登錄,以確保叢集使用者可以使用存取專用登錄的認證。

您可以搭配使用多個登錄與 IBM Cloud Kubernetes Service,以將應用程式部署至叢集。

公用及專用映像檔登錄選項
登錄 說明 優點
IBM Cloud Container Registry 使用此選項,您可以在 IBM Cloud Container Registry 中設定您自己的安全 Docker 映像檔儲存庫,您可以在其中放心地儲存映像檔並且在叢集使用者之間進行共用。 -管理帳戶中映像檔的存取權。
-使用 IBM 提供的映像檔及範例應用程式 (例如 IBM Liberty) 作為母項映像檔,並將您自己的應用程式碼新增至其中。
-由 Vulnerability Advisor自動掃描映像檔以找出潛在漏洞,包括修正它們的 OS 特定建議。
任何其他專用登錄 透過建立 影像拉取秘訣,將任何現有的私有註冊表連接到您的群集。 密碼是用來將登錄 URL 及認證安全地儲存在 Kubernetes 密碼中。 使用現有專用登錄,而不管其來源(Docker Hub、組織所擁有的登錄或其他專用 Cloud 登錄)。
公共 Docker Hub 在不需要變更 Dockerfile 的情況下,使用此選項可直接在 Kubernetes 部署中使用 Docker Hub 中現有的公開映像。 **附註:**請記住,此選項可能不符合組織的安全需求(例如存取管理、漏洞掃描或應用程式保密)。 叢集不需要其他設定。
-包括各種開放程式碼應用程式。

在您設定映像檔登錄之後,叢集使用者可以使用映像檔,以將應用程式部署至叢集。

進一步瞭解使用容器映像檔時如何保護個人資訊安全

瞭解如何授權您的群集從私人註冊表取得影像

若要從登錄中取回映像檔,您的 IBM Cloud Kubernetes Service 叢集會使用特殊類型的 Kubernetes 密碼 imagePullSecret。 此映像檔取回密碼會儲存用來存取容器登錄的認證。

儲存器登錄可以是:

  • 您自己的 IBM Cloud Container Registry中的專用名稱空間。
  • IBM Cloud Container Registry 中屬於不同 IBM Cloud 帳戶的專用名稱空間。
  • 任何其他專用登錄,例如 Docker。

不過,預設情況下,您的群集設定為只從 IBM Cloud Container Registry 中您帳戶的命名空間拉取影像,並將這些影像中的容器部署到群集中的 default Kubernetes 命名空間。 如果您需要在叢集的其他名稱空間中取回映像檔,或從其他容器登錄取回映像檔,則必須設定您自己的映像檔取回密碼。

預設映像檔取回密碼設定

一般而言,您的 IBM Cloud Kubernetes Service 群集設定為只從 default Kubernetes 名稱空間中的所有 IBM Cloud Container Registry icr.io 網域拉取影像。 檢閱下列常見問題,進一步瞭解如何在其他 Kubernetes 命名空間或帳戶中拉取影像、限制拉取存取,或您的群集可能沒有預設影像拉取秘訣的原因。

我的群集如何設定才能從 default Kubernetes 命名空間拉取影像?
當您建立叢集時,叢集具有 IBM Cloud IAM 服務 ID,而此服務 ID 獲提供 IBM Cloud Container Registry 的 IAM Reader 服務存取角色原則。 在叢集的映像檔取回密碼所儲存的未到期 API 金鑰中,模擬服務 ID 認證。 影像拉取秘訣會新增至 default Kubernetes 名稱空間,以及此 Kubernetes 名稱空間的 default 服務帳戶中的秘訣清單。 透過使用映像檔取回密碼,您的部署可以從 廣域及地區 IBM Cloud Container Registry 取回映像檔 (唯讀存取權),以在 default Kubernetes 名稱空間中部署容器。
  • 廣域登錄會安全地儲存 IBM所提供的公用映像檔。 您可以在部署之間參照這些公用映像檔,而不是對儲存在每一個地區登錄中的映像檔具有不同的參照。
  • 地區登錄會安全地儲存您自己的專用 Docker 映像檔。
如果我在 default Kubernetes 名稱空間中沒有映像檔取回密碼,怎麼辦?
您可以透過 登入叢集 並執行 kubectl get secrets -n default | grep "icr-io" 來檢查映像檔取回密碼。 如果未列出任何 icr 密碼,則建立叢集的人員可能沒有 IAM 中 IBM Cloud Container Registry 的必要許可權。 請參閱 更新現有群集以使用 API 金鑰影像拉取秘訣
我可以限制某個區域註冊表的拉取存取權限嗎?
是,您可以編輯服務 ID 的現有 IAM 原則,以將 Reader 服務存取角色限制為該地區登錄或登錄資源(例如名稱空間)。 必須為 IBM Cloud 啟用 IBM Cloud Container Registry IAM 原則後,才能自訂登錄 IAM 原則。

想要讓您的註冊表憑證更安全 請您的群集管理 員啟用群集中的金鑰管理服務提供者,以加密群集中的 Kubernetes 秘 密,例如儲存註冊表憑證的映像拉取密碼。

我可以在 Kubernetes 命名空間中拉取 default 以外的圖片嗎?
依預設,不可以。 使用預設叢集設定,您可以將容器從儲存在 IBM Cloud Container Registry 名稱空間的任何映像檔中部署至叢集的 default Kubernetes 名稱空間。 若要在任何其他 Kubernetes 命名空間或其他 IBM Cloud 帳戶中使用這些圖片,您可以選擇複製或建立自己的圖片拉取秘訣
我可以從不同的 IBM Cloud 帳戶中抽取圖片嗎?
是,在您要使用的 IBM Cloud 帳戶中建立 API 金鑰。 然後,在您要從 IBM Cloud 帳戶取回映像檔的每一個叢集的每一個名稱空間中,建立一個密鑰來保留 API 金鑰。 如需詳細資訊,請 參閱此使用授權服務 ID API 金鑰的範例

若要使用 Docker 這類非 IBM Cloud 登錄,請參閱存取儲存在其他專用登錄中的映像檔

API 金鑰是否需要用於服務 ID? 如果我的帳戶達到服務 ID 的上限,會發生什麼情況?
預設叢集設定會建立一個服務 ID,以將 IBM Cloud IAM API 金鑰認證儲存在映像檔取回密碼中。 不過,您也可以建立個別使用者的 API 金鑰,並將那些認證儲存在映像檔取回密碼中。 如果您達到 服務 ID 的 IAM 限制,您的群集在建立時就會沒有服務 ID 和影像拉取秘訣,而且預設無法從 icr.io 註冊表網域拉取影像。 您必須建立自己的映像檔取回密碼,但建立時須使用個別使用者(例如功能 ID,而不是 IBM Cloud IAM 服務 ID)的 API 金鑰。
我看到區域登錄網域及所有登錄網域的映像檔取回密碼。 我要用哪一個?
先前,IBM Cloud Kubernetes Service 為每個地區、公用 icr.io 登錄網域建立了個別映像檔取回密碼。 現在,所有地區的所有公用及專用 icr.io 登錄網域都儲存在單一 all-icr-io 映像檔取回密碼中,該密碼會自動建立在叢集的 default Kubernetes 名稱空間中。

對於叢集裡其他 Kubernetes 名稱空間中的工作量,以從專用登錄取回容器映像檔,您現在只能將 all-icr-io 映像檔取回密碼複製到該 Kubernetes 名稱空間。 然後,在服務帳戶或部署中指定 all-icr-io 密碼。 您不再需要複製符合映像檔地區登錄的映像檔取回密碼。 此外,請記住您不需要公用登錄的映像檔取回密碼,這不需要鑑別。

當我在另一個 Kubernetes 命名空間複製或建立影像拉取秘訣後,我的工作就完成了嗎?
還沒。 容器必須有權使用所建立的密碼來取回映像檔。 您可以將映像檔取回密碼新增至名稱空間的服務帳戶,或在每次部署時參照密碼。 如需指示,請參閱使用映像檔取回密碼部署容器

icr.io 登錄的專用網路連線

當您設定 IBM Cloud 帳戶以使用服務端點時,您可以使用私人網路連線將影像推送至 IBM Cloud Container Registry,或從 抓取影像。

我需要做什麼才能設定叢集以使用 icr.io 登錄的專用連線?

  1. 啟用 IBM Cloud 基礎架構帳戶的 虛擬路由器功能(VRF),以便您可以使用 IBM Cloud Container Registry 專用雲端服務端點。 若要啟用 VRF,請參閱 啟用 VRF。 若要檢查是否已啟用 VRF,請使用 ibmcloud account show 指令。
  2. 啟用 IBM Cloud 帳戶,以使用服務端點

IBM Cloud Container Registry 會自動使用專用雲端服務端點。 您不需要啟用 IBM Cloud Kubernetes Service 叢集的專用雲端服務端點。

更新現有叢集以使用 API 金鑰映像檔取回密碼

新的 IBM Cloud Kubernetes Service 集群會在 影像拉取秘訣以授權存取 IBM Cloud Container Registry 中儲存 API 金鑰。 使用這些映像檔取回密碼,您可以從 icr.io 登錄網域中所儲存的映像檔部署容器。 如果您的叢集不是使用密碼建立的,則可以將映像檔取回密碼新增至叢集。 對於在 2019 年 2 月 25 日之前建立的叢集,您必須更新叢集以儲存 API 金鑰,而非映像檔取回密碼中的登錄記號。

開始之前

  1. 登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  2. 請確定您具有下列許可權: IBM Cloud IAM 操作員或管理者 IBM Cloud Kubernetes Service的平台存取角色。 帳號擁有者可以執行以下指令來賦予您角色。

    ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
    
  3. IBM Cloud IBM Cloud Container Registry 的 IAM 管理員平台存取角色,跨越所有區域和資源群組。 該政策的範圍無法涵蓋特定區域或資源群組。 帳號擁有者可以執行以下指令來賦予您角色。

    驗證秘密已成功建立

    ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
    
  4. 如果您的帳戶 限制建立服務 ID,請將 服務 ID 建立者 角色新增至主控台 (API 或 CLI 中的 iam-identity ) 中的 Identity and Access Management

  5. 如果您的帳戶 限制 API 金鑰建立,請將 使用者 API 金鑰建立者 角色新增至主控台 (API 或 CLI 中的 iam-identity ) 中的 Identity and Access Management

更新映像檔取回密碼

要在 default Kubernetes 命名空間中更新您的群集映像 pull secret。

  1. 取得叢集 ID。

    ibmcloud ks cluster ls
    
  2. 執行下列指令,以建立叢集的服務 ID,並將 IBM Cloud Container Registry的 IAM 讀者 服務存取角色指派給服務 ID。 該指令還會建立 API 金鑰以模擬服務 ID 認證,並將 API 金鑰儲存在叢集的 Kubernetes 映像檔取回密碼中。 映像檔取回密碼位於 default Kubernetes 名稱空間中。

    ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
    

    當您執行這個指令時,會起始建立 IAM 認證及映像檔取回密碼,這可能需要一點時間才能完成。 在建立映像拉取秘訣之前,您無法部署從 IBM Cloud Container Registry icr.io 網域拉取映像的容器。

  3. 驗證已在叢集裡建立映像檔取回密碼。

    kubectl get secrets | grep icr-io
    

    輸出範例

    all-icr-io           kubernetes.io/dockerconfigjson        1         16d
    
  4. 更新 容器部署,以從 icr.io 網域名稱取回映像檔。

  5. 可選:如果您有防火牆,請確定您使用的網域為 允許外向網路流量到註冊子網路

  6. 使用下列其中一個選項來完成設定。

使用影像拉取秘訣存取外部私人登錄中的影像

在叢集裡設定您自己的映像檔取回密碼,以將容器部署至 default 以外的 Kubernetes 名稱空間、使用其他 IBM Cloud 帳戶中所儲存的映像檔,或使用外部專用登錄中所儲存的映像檔。 此外,您還可以建立自己的映像檔取回密碼來套用 IAM 存取原則,以限制對特定登錄映像檔、名稱空間或動作(例如 pushpull)的許可權。

建立映像檔取回密碼後,容器必須使用該密碼才有權從登錄中取回映像檔。 您可以將映像檔取回密碼新增至名稱空間的服務帳戶,或在每次部署時參照密碼。 如需指示,請參閱使用映像檔取回密碼部署容器

映像檔取回密碼僅適用於建立它們的 Kubernetes 名稱空間。 請針對您要部署容器的每個名稱空間,重複這些步驟。 來自 DockerHub 不需要影像拉取秘訣。

開始之前:

  1. 在 IBM Cloud Container Registry 中設定名稱空間,並將映像檔推送至此名稱空間
  2. 建立叢集
  3. 登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

若要使用自己的映像檔取回密碼,請在下列選項之間進行選擇:

如果您已在名稱空間中建立要在部署中使用的映像檔取回密碼,請參閱使用已建立的 imagePullSecret 來部署容器

複製現有的映像檔取回密碼

您可以將映像檔取回密碼(例如針對 default Kubernetes 名稱空間自動建立的映像檔取回密碼)複製到叢集裡的其他名稱空間。 如果您要針對此名稱空間使用不同的 IBM Cloud IAM API 金鑰認證(例如限制對特定名稱空間的存取),或要從其他 IBM Cloud 帳戶取回映像檔,請改為建立映像檔取回密碼

  1. 列出叢集裡可用的 Kubernetes 名稱空間,或建立要使用的名稱空間。

    kubectl get namespaces
    

    輸出範例

    default          Active    79d
    ibm-cert-store   Active    79d
    ibm-system       Active    79d
    kube-public      Active    79d
    kube-system      Active    79d
    

    建立名稱空間

    kubectl create namespace <namespace_name>
    
  2. 列出 IBM Cloud Container Registry 之 default Kubernetes 名稱空間中的現有映像檔取回密碼。

    kubectl get secrets -n default | grep icr-io
    

    輸出範例

    all-icr-io          kubernetes.io/dockerconfigjson        1         16d
    
  3. default 命名空間複製 all-icr-io image pull secret 到您選擇的命名空間。 新的影像拉取秘訣命名為 <namespace_name>-icr-<region>-io

    kubectl get secret all-icr-io -n default -o yaml | sed 's/default/<new-namespace>/g' | kubectl create -n <new-namespace> -f -   
    
  4. 驗證已順利建立密碼。

    kubectl get secrets -n <namespace_name> | grep icr-io
    
  5. 若要部署容器,請 新增映像檔取回密碼 至每一個部署或名稱空間的服務帳戶,以便名稱空間中的任何部署都可以從登錄取回映像檔。

使用不同的 IAM API 金鑰認證建立映像檔取回密碼

可以將 IBM Cloud IAM 存取原則指派給使用者或服務 ID,以將許可權作用對象限制為特定登錄映像檔名稱空間或動作(例如,pushpull)。 然後,建立 API 金鑰,並將這些登錄認證儲存在叢集的映像檔取回密碼中。

例如,若要存取其他 IBM Cloud 帳戶中的映像檔,請建立 API 金鑰,以將使用者或服務 ID 的 IBM Cloud Container Registry 認證儲存在該帳戶中。 然後,在叢集帳戶中,將 API 金鑰認證儲存在每個叢集和叢集名稱空間的映像檔取回密碼中。

下列步驟會建立 API 金鑰,用來儲存 IBM Cloud IAM 服務 ID 的認證。 您可能希望為具有對 IBM Cloud 的 IBM Cloud Container Registry IAM 服務存取原則的使用者 ID 建立 API 金鑰,而不使用服務 ID。 不過,請確定使用者是一個功能 ID,或具有可在使用者離開時讓叢集仍可存取登錄的方案。

  1. 列出叢集裡可用的 Kubernetes 名稱空間,或建立要使用的名稱空間,而您要在其中從登錄映像檔部署容器。

    kubectl get namespaces
    

    輸出範例

    default          Active    79d
    ibm-cert-store   Active    79d
    ibm-system       Active    79d
    kube-public      Active    79d
    kube-system      Active    79d
    

    建立名稱空間

    kubectl create namespace <namespace_name>
    
  2. 建立叢集的 IBM Cloud IAM 服務 ID,以用於映像檔取回密碼中的 IAM 原則及 API 金鑰認證。 請務必提供服務 ID 的說明,以協助您稍後擷取服務 ID,例如包括叢集和名稱空間名稱。

    ibmcloud iam service-id-create <cluster_name>-<namespace>-id --description "Service ID for IBM Cloud Container Registry in Kubernetes cluster <cluster_name> namespace <namespace>"
    
  3. 建立叢集服務 ID 的自訂 IBM Cloud IAM 原則,以授與 IBM Cloud Container Registry 的存取權。

    ibmcloud iam service-policy-create <cluster_service_ID> --roles <service_access_role> --service-name container-registry [--region <IAM_region>] [--resource-type namespace --resource <registry_namespace>]
    
    cluster_service_ID
    必要。 以之前為 Kubernetes 群集建立的 <cluster_name>-<kube_namespace>-id 服務 ID 取代。
    --service-name container-registry
    必要。 輸入 container-registry,讓 IAM 原則適用於 IBM Cloud Container Registry。
    --roles <service_access_role>
    必要。 輸入您要設定服務 ID 存取範圍的 IBM Cloud Container Registry 的 服務存取角色。 可能值為 ReaderWriterManager
    --region <IAM_region>
    選用。 如果您要將存取原則範圍限定為特定 IAM 地區,請以逗點區隔清單輸入地區。 可能的值為 globallocal registry regiones
    --resource-type namespace --resource <registry_namespace>
    選用。 如果要限制只能存取某些 IBM Cloud Container Registry 命名空間 中的影像,請輸入 namespace 作為資源類型,並指定 <registry_namespace>。 若要列出登錄名稱空間,請執行 ibmcloud cr namespaces
  4. 建立服務 ID 的 API 金鑰。 將 API 金鑰命名為與您的服務 ID 相似的名稱,並包含您先前建立的服務 ID、 <cluster_name>-<kube_namespace>-id. 請務必提供 API 金鑰的說明,以協助您稍後擷取該金鑰。

    ibmcloud iam service-api-key-create <cluster_name>-<namespace>-key <cluster_name>-<namespace>-id --description "API key for service ID <service_id> in Kubernetes cluster <cluster_name> namespace <namespace>"
    
  5. 從前一個指令的輸出中擷取 API 金鑰值。

    Please preserve the API key! It can't be retrieved after it's created.
    
    Name          <cluster_name>-<kube_namespace>-key   
    Description   key_for_registry_for_serviceid_for_kubernetes_cluster_multizone_namespace_test   
    Bound To      crn:v1:bluemix:public:iam-identity::a/1bb222bb2b33333ddd3d3333ee4ee444::serviceid:ServiceId-ff55555f-5fff-6666-g6g6-777777h7h7hh   
    Created At    2019-02-01T19:06+0000   
    API Key       i-8i88ii8jjjj9jjj99kkkkkkkkk_k9-llllll11mmm1   
    Locked        false   
    UUID          ApiKey-222nn2n2-o3o3-3o3o-4p44-oo444o44o4o4   
    
  6. 建立影像拉取秘訣,以儲存群集命名空間中的 API 金鑰憑證。 針對您要從中取回映像檔之每一個 icr.io 網域的每一個叢集的每一個名稱空間,重複此步驟。

    kubectl --namespace <namespace> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>
    
    --namespace <namespace>
    必要。 指定您用於服務 ID 名稱之叢集的 Kubernetes 名稱空間。
    <secret_name>
    必要。 輸入映像檔取回密碼的名稱。
    --docker-server <registry_URL>
    必要。 設定在其中設定登錄名稱空間的映像檔登錄 URL。 如需可用的網域,請參閱 本端地區
    --docker-username iamapikey
    必要。 輸入使用者名稱以登入私人註冊表。 如果您使用 IBM Cloud Container Registry,請輸入 iamapikey
    --docker-password <token_value>
    必要。 輸入您先前擷取的 API Key 值。
    --docker-email <docker-email>
    必要。 如果您有 Docker 電子郵件位址,請輸入它。 如果沒有,請輸入虛構的電子郵件地址,例如 a@b.c。 需要有此電子郵件才能建立 Kubernetes 密碼,但在建立之後就不再使用。
  7. 驗證已順利建立 Secret。 將 <namespace> 改為您建立影像拉取秘訣的 namespace

    kubectl get secrets --namespace <namespace>
    
  8. 將映像檔取回密碼新增至 Kubernetes 服務帳戶,讓名稱空間中的任何 Pod 在部署容器時都可以使用映像檔取回密碼

存取儲存在其他專用登錄中的映像檔

如果您已有專用登錄,則必須將登錄認證儲存在 Kubernetes 映像檔取回密碼中,然後從配置檔參照此密碼。

開始之前:

  1. 建立叢集
  2. 登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

若要建立映像檔取回密碼,請執行下列動作:

  1. 建立用來儲存專用登錄認證的 Kubernetes 密碼。

    kubectl --namespace <namespace> create secret docker-registry <secret_name>  --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>
    
    --namespace <namespace>
    必要。 您要使用密碼並在其中部署容器之叢集的 Kubernetes 名稱空間。 若要列出群集中可用的命名空間,請執行 kubectl get namespaces
    <secret_name>
    必要。 您要用於映像檔取回密碼的名稱。
    --docker-server <registry_URL>
    必要。 儲存專用映像檔的登錄的 URL。
    --docker-username <docker_username>
    必要。 登入私人註冊表的使用者名稱。
    --docker-password <token_value>
    必要。 用來登入專用登錄的密碼,例如記號值。
    --docker-email <docker-email>
    必要。 如果您有 Docker 電子郵件位址,請輸入它。 如果您沒有,請輸入一個虛構的電子郵件地址,例如 a@b.c。 需要有此電子郵件才能建立 Kubernetes 密碼,但在建立之後就不再使用。
  2. 驗證已順利建立 Secret。 將 <namespace> 取代為您在其中建立映像檔取回密碼的名稱空間名稱。

    kubectl get secrets --namespace <namespace>
    
  3. 建立一個參照映像檔取回密碼的 Pod

使用映像檔取回密碼部署容器

您可以在 Pod 部署中定義圖像拉取秘訣,或是將圖像拉取秘訣儲存在 Kubernetes 服務帳戶中,如此一來,所有未在命名空間中指定 Kubernetes 服務帳戶的部署都可以使用該秘訣。

若要規劃如何在叢集裡使用映像檔取回密碼,請在下列選項之間進行選擇。

  • 參考您 Pod 部署中的映像拉取秘訣:如果您不想在預設情況下授予您命名空間中所有 pod 對註冊表的存取權,請使用此選項。 開發人員可以 在每一個必須存取登錄的 Pod 部署中包括映像檔取回密碼
  • 在 Kubernetes 服務帳戶中儲存影像拉取秘訣:使用此選項可授予所選 Kubernetes 命名空間中所有部署對註冊表中影像的存取權。 若要在 Kubernetes 服務帳戶中儲存映像檔取回密碼,請使用 下列步驟

在所選取名稱空間的 Kubernetes 服務帳戶中儲存映像檔取回密碼

每個 Kubernetes 命名空間都有一個 Kubernetes 服務帳戶,其名稱為 default。 在名稱空間內,您可以將映像檔取回密碼新增至此服務帳戶,以授與 Pod 從登錄取回映像檔的存取權。 未指定服務帳戶的部署會自動為此 Kubernetes 命名空間使用 default 服務帳戶。

  1. 檢查預設服務帳戶是否已有映像檔取回密碼。

    kubectl describe serviceaccount default -n <namespace_name>
    

    <none> 顯示在影像拉取秘訣項目中時,表示不存在影像拉取秘訣。

  2. 將映像檔取回密碼新增至預設服務帳戶。

    • 沒有定義影像拉取秘訣時,新增影像拉取秘訣的範例指令。

      kubectl patch -n <namespace_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
      
    • 當已定義影像拉取秘訣時,新增影像拉取秘訣的範例指令。

      kubectl patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
      
  3. 驗證映像檔取回密碼已新增至預設服務帳戶。

    kubectl describe serviceaccount default -n <namespace_name>
    

    輸出範例

    Name:                default
    Namespace:           <namespace_name>
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  <image_pull_secret_name>
    Mountable secrets:   default-token-sh2dx
    Tokens:              default-token-sh2dx
    Events:              <none>
    

    如果 映像檔取回密碼 指出 <secret> (not found),請執行 kubectl get secrets -n namespace,以驗證映像檔取回密碼存在於與服務帳戶相同的名稱空間中。

  4. 建立名為 mypod.yaml 的 Pod 配置檔,以從登錄中的 映像檔 部署容器。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod-container
          image: <region>.icr.io/<namespace>/<image>:<tag>
    
  5. 透過套用 mypod.yaml 配置檔,在叢集中建立 Pod。

    kubectl apply -f mypod.yaml
    

設定叢集以取回授權軟體

您可以設定 IBM Cloud Kubernetes Service 叢集以取回授權軟體,而此軟體是包裝於 IBM 授權您使用的 Helm Chart 的受保護容器映像檔集合。 授權軟體儲存在特殊 IBM Cloud Container Registry cp.icr.io 網域中。 若要存取此網域,您必須使用叢集授權金鑰來建立映像檔取回密碼,並將此映像檔取回密碼新增至您要在其中部署此授權軟體的每個名稱空間的 Kubernetes 服務帳戶。

開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 取得授權軟體程式庫的授權金鑰。

    1. 登入 MyIBM.com,捲動到 Container 軟體庫部分。 按一下檢視程式庫
    2. 存取容器軟體 > 授權金鑰頁面中,按一下複製金鑰。 此金鑰可授權您存取容器軟體程式庫中的所有授權軟體。
  2. 在您要部署授權容器的名稱空間中,建立映像檔取回密碼,讓您可以存取 cp.icr.io 授權登錄。 使用您先前擷取的 授權金鑰 作為 --docker-password 值。 如需相關資訊,請參閱存取儲存在其他專用登錄中的映像檔

    kubectl create secret docker-registry entitled-cp-icr-io --docker-server=cp.icr.io --docker-username=cp --docker-password=<entitlement_key> --docker-email=<docker_email> -n <namespace>
    
  3. 將影像拉取秘訣新增到命名空間的服務帳戶,以便命名空間中的任何容器都可以使用權限金鑰來拉取有權限的影像。 如需相關資訊,請參閱使用映像檔取回密碼部署容器

    kubectl patch -n <namespace> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
    
  4. 在名稱空間中建立 Pod,以從授權登錄中的映像檔建置容器。

    kubectl run <pod_name> --image=cp.icr.io/<image_name> -n <namespace> --generator=run-pod/v1
    
  5. 驗證 Pod 處於執行中狀態,以確認可以順利從授權映像檔建置容器。

    kubectl get pod <pod_name> -n <namespace>
    

想知道下一步嗎? 您可以設定授權 Helm Chart 儲存庫,其中儲存了包含授權軟體的 Helm Chart。 如果已在叢集裡安裝 Helm,請執行 helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled

更新 IBM Cloud Kubernetes Service containerd 自訂登錄配置

使用 Kubernetes 1.22 版或更新版本,您可以在工作者節點上使用容器配置檔來配置從容器登錄取回。 您可以使用 daemonset 來更新叢集中所有節點之間的配置,這可防止在工作者節點重新載入或新增工作者時抹除配置。

更新 containerd 自訂登錄配置的 daemonset 範例

使用範例 YAML 檔案來定義在所有工作者節點上執行的 daemonset,以設定或更新 containerd 登錄主機配置,並裝載至對應的 containerd 登錄路徑。

此範例設定 dockerhub 的下列登錄主機配置。 已提供此登錄主機配置,並在工作者節點佈建階段期間自動配置。 在部署之後及工作者節點重新載入或重新啟動之後,init 儲存器會在每個工作者節點上起始設定 hosts.toml

server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]

YAML 檔案範例

apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
    name: containerd-dockerhub-registry-config
name: containerd-dockerhub-registry-config
namespace: kube-system
spec:
selector:
    matchLabels:
    name: containerd-dockerhub-registry-config
template:
    metadata:
    labels:
        name: containerd-dockerhub-registry-config
    spec:
    initContainers:
    - image: alpine:3.13.6
        name: containerd-dockerhub-registry-config
        command:
        - /bin/sh
        - -c
        - |
            #!/bin/sh
            set -uo pipefail
            cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
            server = "https://docker.io"
            [host."https://registry-1.docker.io"]
            capabilities = ["pull", "resolve"]
            EOF
        volumeMounts:
        - mountPath: /etc/containerd/certs.d/docker.io/
        name: dockerhub-registry-config
    containers:
    - name: pause
        image: "us.icr.io/armada-master/pause:3.5"
        imagePullPolicy: IfNotPresent
    volumes:
    - name: dockerhub-registry-config
        hostPath:
        path: /etc/containerd/certs.d/docker.io/

如需更新 containerd 登錄主機配置的相關資訊,請參閱 containerd 文件