设置映像注册表
规划并设置映像注册表,以便开发者可以使用 Docker 映像在 IBM Cloud® Kubernetes Service 中创建应用程序容器。
规划映像注册表
映像通常存储在可由公共(公共注册表)访问的注册表中,或者存储在针对一小组用户设置有限访问权(专用注册表)的注册表中。
开始使用 Docker 和 Kubernetes 在集群中创建第一个容器化应用程序时,可以使用公共注册表(如 Docker Hub)。 但是对于企业应用程序,请使用专用注册表(如在 IBM Cloud Container Registry 中提供的注册表),以保护映像不被未经授权的用户使用和更改。 专用注册表必须由集群管理员设置,以确保用于访问专用注册表的凭证可供集群用户使用。
可以通过 IBM Cloud Kubernetes Service 使用多个注册表将应用程序部署到集群。
注册表 | 描述 | 优点 |
---|---|---|
IBM Cloud Container Registry | 使用此选项,可以在 IBM Cloud Container Registry 中设置您自己的安全 Docker 映像存储库,在其中可以安全地存储映像并在集群用户之间共享这些映像。 | -管理对帐户中映像的访问权。 -使用 IBM 提供的映像和样本应用程序 (例如 IBM Liberty) 作为父映像,并向其添加您自己的应用程序代码。 -由 Vulnerability Advisor自动扫描映像以查找潜在漏洞,包括特定于操作系统的建议以修复这些漏洞。 |
其他任何专用注册表 | 通过创建 镜像提取密码,将任何现有的私有注册表连接到您的集群。 私钥用于将注册表 URL 和凭证安全地保存在 Kubernetes 私钥中。 | 独立于源(Docker Hub、组织拥有的注册表或其他云专用注册表)使用现有专用注册表。 |
公共 Docker Hub | 当不需要更改 Dockerfile 时,使用此选项 可在 Kubernetes 部署中直接使用 Docker 中的现有公共图像。 注:请记住,此选项可能不满足您组织的安全需求,如访问管理、漏洞扫描或应用程序隐私。 | 您的集群不需要其他设置。 -包含各种开放式源代码应用程序。 |
设置映像注册表后,集群用户可以使用映像将应用程序部署到集群。
使用容器映像时,请了解有关确保个人信息安全的更多信息。
了解如何授权集群从私有注册表提取镜像
为了从注册表中拉取映像,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 服务标识,此标识已被授予对 IBM Cloud Container Registry 的 IAM 读取者服务访问角色策略。 在存储于集群的映像拉取私钥中的非到期 API 密钥中,会模拟服务标识凭证。 图片提取的密钥被添加到
default
Kubernetes 命名空间以及default
服务账户中的密钥列表中,用于该 Kubernetes 命名空间。 通过使用映像拉取私钥,部署可以从 全局和区域 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密钥图像提取密钥。 - 我能否限制特定区域注册表的访问权限?
- 可以,可以编辑服务标识的现有 IAM 策略,以将读取者服务访问角色限制为只能访问该区域注册表或注册表资源(例如,名称空间)。 必须为 IBM Cloud 启用 IBM Cloud Container Registry IAM 策略后,才能定制注册表 IAM 策略。
要使注册表凭证更安全,请让集群管理员 启用集群中的密钥管理服务提供者,以加密集群中的 Kubernetes 私钥,例如用于存储注册表凭证的映像拉取私钥。
- 我能否从
default
以外的 Kubernetes 命名空间中提取图片? - 缺省情况下不能。 使用缺省集群设置时,可以将基于 IBM Cloud Container Registry 名称空间中所存储任何映像的容器部署到集群的
default
Kubernetes 名称空间。 要在其他 Kubernetes 名称空间或其他 IBM Cloud 账户中使用这些图片,您可以选择复制或创建自己的图片提取密码。 - 我可以从其他 IBM Cloud 账户提取图片吗?
- 可以,在要使用的 IBM Cloud 帐户中创建 API 密钥。 然后,在要从 IBM Cloud 帐户中提取映像的每个集群的每个名称空间中,创建保存 API 密钥的私钥。 如需了解更多信息,请参考以下示例,该示例使用授权服务ID API密钥。
要使用非 IBM Cloud 注册表(如 Docker),请参阅访问存储在其他专用注册表中的映像。
- API密钥是否需要与服务ID相关联? 如果我的账户达到服务ID上限,会怎样?
- 缺省集群设置会创建服务标识,用于将 IBM Cloud IAM API 密钥凭证存储在映像拉取私钥中。 但是,您还可以为单个用户创建 API 密钥,并将这些凭证存储在一个映像拉取私钥中。 如果达到 服务 ID 的 IAM 限制,则您的集群将在没有服务 ID 和镜像拉取密钥的情况下创建,并且无法从
icr.io
默认注册域。 您必须 创建自己的映像拉取私钥,但创建时须使用单个用户(例如功能标识,而不是 IBM Cloud IAM 服务标识)的 API 密钥。 - 我看到区域注册表域和所有注册表域的映像拉取私钥。 我使用哪一个?
- 先前,IBM Cloud Kubernetes Service 为每个区域公共
icr.io
注册表域创建了单独的映像拉取私钥。 现在,所有区域的所有公共和专用icr.io
注册表域都存储在集群的default
Kubernetes 名称空间中自动创建的单个all-icr-io
映像拉取私钥中。
对于集群中其他 Kubernetes 名称空间中用于从专用注册表中拉取容器映像的工作负载,现在只能将 all-icr-io
映像拉取私钥复制到该 Kubernetes 名称空间。 然后,在服务帐户或部署中指定 all-icr-io
私钥。 您无需再复制与映像的区域注册表匹配的映像拉取私钥。 此外,请记住,对于不需要认证的公共注册表,您不需要映像拉取私钥。
- 我在另一个 Kubernetes 命名空间中复制或创建图像拉取密钥后,就完成了吗?
- 还没完。 容器必须有权使用所创建的私钥来拉取映像。 可以将映像拉取私钥添加到该名称空间的服务帐户,或者在每个部署中引用此私钥。 有关指示信息,请参阅使用映像拉取私钥部署容器。
到 icr.io
注册表的专用网络连接
当您设置 IBM Cloud 帐户以使用服务端点时,可以使用专用网络连接将映像推送到 IBM Cloud Container Registry并从中提取映像。
我需要执行哪些操作来设置集群以使用与 icr.io
注册表的专用连接?
- 为 IBM Cloud 基础架构帐户启用 虚拟路由器功能(VRF),以便您可以使用 IBM Cloud Container Registry 私有云服务端点。 要启用 VRF,请参阅 启用 VRF。
要检查是否已启用 VRF,请使用
ibmcloud account show
命令。 - 启用 IBM Cloud 帐户以使用服务端点。
IBM Cloud Container Registry 自动使用私有云服务端点。 您无需为 IBM Cloud Kubernetes Service 集群启用私有云服务端点。
更新现有集群以使用 API 密钥映像拉取私钥
新的 IBM Cloud Kubernetes Service 集群在 图像拉取机密中存储 API 密钥,以授权对 IBM Cloud Container Registry 的访问。 使用这些映像拉取私钥时,可以通过存储在 icr.io
注册表域中的映像来部署容器。 如果未使用私钥创建集群,那么可以将映像拉取私钥添加到集群。 对于在 2019 年 2 月 25 日之前创建的集群,必须更新集群以在映像拉取私钥中存储
API 密钥,而不存储注册表令牌。
准备工作
-
确保您具有以下许可权: IBM Cloud IAM 操作员或管理员 平台访问角色 IBM Cloud Kubernetes Service。 账户所有者可以通过运行以下命令来授予您权限。
ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
-
IBM Cloud IAM管理员平台访问权限,适用于,适用于所有地区和资源组。IBM Cloud Container Registry 该政策不能仅限于特定地区或资源组。 账户所有者可以通过运行以下命令来授予您权限。
确认密钥创建成功
ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
-
如果帐户 限制服务标识创建,请在控制台 (API 或 CLI 中的
iam-identity
) 中将 服务标识创建者 角色添加到 Identity and Access Management。 -
如果帐户 限制 API 密钥创建,请在控制台 (API 或 CLI 中的
iam-identity
) 中将 用户 API 密钥创建者 角色添加到 Identity and Access Management。
更新映像拉取私钥
要更新集群镜像,请在 default
Kubernetes 命名空间中提取密钥。
-
获取集群标识。
ibmcloud ks cluster ls
-
运行以下命令以创建集群的服务标识,并为该服务标识分配 IBM Cloud Container Registry的 IAM 读者 服务访问角色。 此命令还会创建 API 密钥以模拟服务标识凭证,并将 API 密钥存储在集群中的 Kubernetes 映像拉取私钥中。 映像拉取私钥位于
default
Kubernetes 名称空间中。ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
运行此命令时,IAM 凭证和映像拉取私钥的创建操作将启动,并且可能需要一些时间才能完成。 在创建镜像提取密钥之前,您无法部署从 IBM Cloud Container Registry
icr.io
域提取镜像的容器。 -
验证是否在集群中创建了映像拉取私钥。
kubectl get secrets | grep icr-io
示例输出
all-icr-io kubernetes.io/dockerconfigjson 1 16d
-
更新 容器部署 以从
icr.io
域名中提取映像。 -
可选:如果您有防火墙,请确保对于使用的域,允许出站网络流量流至注册表子网。
-
使用下列其中一个选项来完成设置。
- 要拉取非
default
Kubernetes 名称空间中的映像或从其他 IBM Cloud 帐户中拉取映像,请复制或创建其他映像拉取私钥。 - 要将映像拉取私钥限制为只能访问特定注册表资源(例如,名称空间或区域),请执行以下操作:
- 要拉取非
使用图像提取秘技访问外部私有注册表中的图像
在集群中设置您自己的映像拉取私钥,以将容器部署到非 default
Kubernetes 名称空间,使用存储在其他 IBM Cloud 帐户中的映像,或使用存储在外部专用注册表中的映像。 此外,您还可以创建自己的映像拉取私钥来应用 IAM 访问策略,以将许可权作用对象限制为特定注册表映像名称空间或操作(例如,push
或 pull
)。
创建映像拉取私钥后,容器必须使用该私钥才有权从注册表中拉取映像。 可以将映像拉取私钥添加到该名称空间的服务帐户,或者在每个部署中引用此私钥。 有关指示信息,请参阅使用映像拉取私钥部署容器。
映像拉取私钥仅对于创建用于的 Kubernetes 名称空间有效。 对要部署容器的每个名称空间,重复这些步骤。 来自 DockerHub 的映像不需要映像拉取私钥。
开始之前:
要使用您自己的映像拉取私钥,请从以下选项中进行选择:
- 从 default Kubernetes 名称空间复制映像拉取私钥至集群中的其他名称空间。
- 创建新的 IAM API 密钥凭证并将其存储在映像拉取私钥中,以访问其他 IBM Cloud 帐户中的映像,或应用 IAM 策略来限制对特定注册表域或名称空间的访问权。
- 创建映像拉取私钥以访问外部专用注册表中的映像。
如果已经在名称空间中创建了要在部署中使用的映像拉取私钥,请参阅使用创建的 imagePullSecret
部署容器。
复制现有映像拉取私钥
可以将映像拉取私钥(例如自动为 default
Kubernetes 名称空间创建的映像拉取私钥)复制到集群中的其他名称空间。 如果要将其他 IBM Cloud IAM API 密钥凭证用于此名称空间,例如限制对特定名称空间的访问权,或从其他 IBM Cloud 帐户中拉取映像,请改为创建映像拉取私钥。
-
列出集群中可用的 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>
-
列出 IBM Cloud Container Registry 的
default
Kubernetes 名称空间中的现有映像拉取私钥。kubectl get secrets -n default | grep icr-io
示例输出
all-icr-io kubernetes.io/dockerconfigjson 1 16d
-
将
all-icr-io
图像从default
命名空间复制到您选择的命名空间。 新形象的秘密是<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 -
-
验证私钥是否已成功创建。
kubectl get secrets -n <namespace_name> | grep icr-io
-
要部署容器,请向每个部署或名称空间的服务帐户 添加映像拉取私钥,以便名称空间中的任何部署都可以从注册表拉取映像。
使用不同的 IAM API 密钥凭证创建映像拉取私钥
可以将 IBM Cloud IAM 访问策略分配给用户或服务标识,以将许可权作用对象限制为特定注册表映像名称空间或操作(例如,push
或 pull
)。 然后,创建 API 密钥并将这些注册表凭证存储在集群的映像拉取私钥中。
例如,要访问其他 IBM Cloud 帐户中的映像,请创建 API 密钥,用于存储该帐户中用户或服务标识的 IBM Cloud Container Registry 凭证。 然后,在集群的帐户中,将这些 API 密钥凭证保存在每个集群和集群名称空间的映像拉取私钥中。
以下步骤创建 API 密钥,用于存储 IBM Cloud IAM 服务标识的凭证。 您可能希望为具有对 IBM Cloud 的 IBM Cloud Container Registry IAM 服务访问策略的用户标识创建 API 密钥,而不使用服务标识。 但是,请确保用户是功能标识,或者有计划来应对用户离开的情况,以便集群始终可以访问注册表。
-
列出集群中可用的 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>
-
为集群创建 IBM Cloud IAM 服务标识,此标识用于映像拉取私钥中的 IAM 策略和 API 密钥凭证。 请确保为服务标识提供描述,以帮助您日后检索服务标识,例如包含集群名称和名称空间名称。
ibmcloud iam service-id-create <cluster_name>-<namespace>-id --description "Service ID for IBM Cloud Container Registry in Kubernetes cluster <cluster_name> namespace <namespace>"
-
为集群服务标识创建定制 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 的服务访问角色。 可能的值为
Reader
(读取者)、Writer
(写入者)和Manager
(管理者)。 --region <IAM_region>
- 可选。 如果要将访问策略的作用域限定为特定 IAM 区域,请以逗号分隔列表格式输入各区域。 可能的值为
global
和 本地注册表区域。 --resource-type namespace --resource <registry_namespace>
- 可选。 如果您希望仅允许某些 IBM Cloud Container Registry 命名空间中的 图像访问,请在资源类型中输入
namespace
,并指定<registry_namespace>
。 要列出注册表名称空间,请运行ibmcloud cr namespaces
。
-
为服务标识创建 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>"
-
从上一个命令的输出中检索 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
-
创建一个图像提取秘密,用于将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>
- 必需。 指定用于服务标识名称的集群的 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 私钥是必需的,但在创建后不会再使用此电子邮件。
-
验证私钥是否已成功创建。 请将
<namespace>
替换为创建图片提取密码的namespace
。kubectl get secrets --namespace <namespace>
-
向 Kubernetes 服务帐户添加映像拉取私钥,以便在部署容器时,名称空间中的任何 pod 都可以使用映像拉取私钥。
访问存储在其他专用注册表中的映像
如果您已经拥有专用注册表,那么必须将相应的注册表凭证存储在 Kubernetes 映像拉取私钥中,并在配置文件中引用此私钥。
开始之前:
要创建映像拉取私钥,请执行以下操作:
-
创建 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 私钥是必需的,但在创建后不会再使用此电子邮件。
-
验证私钥是否已成功创建。 将
<namespace>
替换为在其中创建映像拉取私钥的名称空间的名称。kubectl get secrets --namespace <namespace>
使用映像拉取私钥来部署容器
您可以在部署中定义一个镜像提取密码,或者将镜像提取密码保存在您的 Kubernetes 服务账户中,以便在命名空间中未指定 Kubernetes 服务账户的所有部署中使用。
要规划如何在集群中使用映像拉取私钥,请在以下选项之间进行选择。
- 关于部署Pod时隐藏图片的设置:如果您不想默认允许所有Pod访问您的注册表,请使用此选项。 开发者可以 在每个必须访问注册表的 pod 部署中包含映像拉取私钥。
- 将图像提取密钥存储在 Kubernetes 服务帐户中:使用此选项,您可以为选定 Kubernetes 命名空间中的所有部署授予访问您注册表中的图像的权限。 要将映像拉取私钥存储在 Kubernetes 服务帐户中,请使用 以下步骤。
将映像拉取私钥存储在所选名称空间的 Kubernetes 服务帐户中
每个 Kubernetes 命名空间都有一个名为 Kubernetes 的 default
服务账户。 在名称空间中,您可以将映像拉取私钥添加到此服务帐户,以授予 pod 从注册表拉取映像的访问权。 未指定服务账户的部署将自动使用此 Kubernetes 命名空间中的 default
服务账户。
-
检查 default 服务帐户是否已存在映像拉取私钥。
kubectl describe serviceaccount default -n <namespace_name>
当
<none>
显示在图片提取密码条目中时,说明不存在图片提取密码。 -
将映像拉取私钥添加到 default 服务帐户。
-
在没有定义图像提取密码时,添加图像提取密码的示例命令。
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>"}}]'
-
-
验证映像拉取私钥是否已添加到 default 服务帐户。
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
来验证映像拉取私钥是否存在于与服务帐户相同的名称空间中。 -
创建名为
mypod.yaml
的 pod 配置文件,以从注册表中的 映像 部署容器。apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod-container image: <region>.icr.io/<namespace>/<image>:<tag>
-
通过应用
mypod.yaml
配置文件在集群中创建 pod。kubectl apply -f mypod.yaml
设置集群以拉取授权软件
您可以设置 IBM Cloud Kubernetes Service 集群以拉取授权软件,授权软件是受保护的容器映像的集合,这些映像包装在由 IBM 许可您使用的 Helm chart 中。 授权软件存储在特殊的 IBM Cloud Container Registry cp.icr.io
域中。 要访问此域,必须使用权利密钥为集群创建映像拉取私钥,然后将此映像拉取私钥添加到要部署此授权软件的每个名称空间的 Kubernetes 服务帐户。
开始之前: 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
-
获取授权软件库的权利密钥。
- 登录 MyIBM.com,滚动至 “Container软件库”部分。 单击查看库。
- 在访问容器软件 > 权利密钥页面中,单击复制密钥。 此密钥授权访问容器软件库中的所有授权软件。
-
在要部署授权容器的名称空间中,创建映像拉取私钥,以便可以访问
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>
-
将图像拉取权限添加到命名空间的服务帐户中,以便命名空间中的任何容器都可以使用授权密钥来拉取授权的图像。 有关更多信息,请参阅使用映像拉取私钥部署容器。
kubectl patch -n <namespace> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
-
在名称空间中创建 pod,以基于授权注册表中的映像来构建容器。
kubectl run <pod_name> --image=cp.icr.io/<image_name> -n <namespace> --generator=run-pod/v1
-
通过验证 pod 是否处于 Running 状态,检查是否能够基于授权映像成功构建容器。
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 V 1.22 或更高版本,可以使用工作程序节点上的 containerd 配置文件来配置从容器注册表中拉取。 您可以使用 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 文档。