Kubernetes 镜像仓库和容器镜像仓库
镜像仓库是 Kubernetes 密文(Secret),包含用于向私有容器镜像仓库进行身份验证的凭证。
“Registry” 这个词可能有两种意思,可指代容器或 Kubernetes 镜像仓库:
-
容器镜像仓库(以前称为"`Docker 镜像仓库`")包含你可以拉取和部署的容器镜像。镜像仓库是一个无状态、可扩展的服务器端应用程序,用于存储和分发容器镜像。
-
Kubernetes 镜像仓库是一个镜像拉取密文,你的 deployment 使用该密文来向容器镜像仓库进行身份验证。
Deployment 使用 Kubernetes 镜像仓库密文向私有容器镜像仓库进行身份验证,然后拉取托管在仓库上的容器镜像。
目前,只有在 Rancher UI 中创建工作负载时(通过 kubectl 创建的工作负载不可以),Deployment 才会自动拉取私有镜像仓库凭证。
在命名空间中创建镜像仓库
先决条件:
你必须已经部署了一个可用的私有镜像仓库。 如果你需要创建私有镜像仓库,请参阅相应运行时的文档: |
-
在左上角,单击 ☰ > 集群管理。
-
转到要添加镜像仓库的集群,然后单击 Explore。
-
在左侧导航中,单击
或 。 -
单击创建。
-
单击镜像仓库。
-
输入镜像仓库的名称。
Kubernetes 将密文、证书和镜像仓库都归类为密文,命名空间或项目中的密文名称不能重复。因此,为了避免冲突,镜像仓库的名称必须与工作空间中的其他密文不一样。
-
为镜像仓库选择一个命名空间。
-
选择托管你的私人镜像仓库的网站。然后,输入向镜像仓库进行身份验证的凭证。例如,如果你使用 DockerHub,请提供你的 DockerHub 用户名和密码。
-
单击保存。
结果:
-
已将你的密文添加到命名空间中。
-
你可以通过单击
或 在 Rancher UI 中查看密文。 -
如果工作负载在镜像仓库的范围内,你在 Rancher UI 中创建的任何工作负载都将具有访问镜像仓库的凭证。
在项目中创建镜像仓库
先决条件:
你必须已经部署了一个可用的私有镜像仓库。 如果你需要创建私有镜像仓库,请参阅相应运行时的文档: |
在 Rancher 2.6 之前,密文必须创建在项目级别。现在不再需要项目级别,你可以采用命名空间级别。因此,Rancher UI 进行了更新以反映这一新功能。但是,你仍然可以按照需要创建项目级别的镜像仓库。执行以下步骤进行操作:
-
在左上角,单击下拉菜单中的 ☰ > 全局设置。
-
单击功能开关。
-
转到
Legacy
功能开关并单击激活。 -
在左上角,单击 ☰ > 集群管理。
-
转到要添加镜像仓库的集群,然后单击 Explore。
-
在左侧导航中,单击
或 。 -
单击创建。
-
单击镜像仓库。
-
在顶部导航栏中进行过滤,从而仅查看一个项目。
-
输入镜像仓库的名称。
Kubernetes 将密文、证书和镜像仓库都归类为密文,命名空间或项目中的密文名称不能重复。因此,为了避免冲突,镜像仓库的名称必须与工作空间中的其他密文不一样。
-
为镜像仓库选择一个命名空间。
-
选择托管你的私人镜像仓库的网站。然后,输入向镜像仓库进行身份验证的凭证。例如,如果你使用 DockerHub,请提供你的 DockerHub 用户名和密码。
-
单击保存。
结果:
-
密文已添加到你选择的项目中。
-
你可以通过单击
或 在 Rancher UI 中查看密文。 -
如果工作负载在镜像仓库的范围内,你在 Rancher UI 中创建的任何工作负载都将具有访问镜像仓库的凭证。
local 集群上的项目级别镜像仓库仅在选择单个项目时可见。 |
使用私有镜像仓库
你可以通过 Rancher UI 或 kubectl
使用私有镜像仓库的镜像来部署工作负载。
在 Rancher UI 中使用私有镜像仓库
要使用私有镜像仓库中的镜像来部署工作负载:
-
在左上角,单击 ☰ > 集群管理。
-
转到要部署工作负载的集群,然后单击 Explore。
-
点击工作负载。
-
单击创建。
-
选择要创建的工作负载类型。
-
输入工作负载的独特名称,并选择命名空间。
-
在容器镜像字段中,输入私有镜像仓库中镜像的路径 URL。例如,如果你的私有镜像仓库位于 Quay.io,你可以使用
quay.io/<Quay profile name>/<Image name>
。 -
单击创建。
结果:你的 deployment 能启动,能使用你在 Rancher UI 中添加的私有镜像仓库凭证进行身份验证,并拉取指定的容器镜像。
通过 kubectl 使用私有镜像仓库
使用 kubectl
创建工作负载时,你需要配置 pod,从而使其 YAML 具有私有镜像仓库中镜像的路径。如果 Pod 是在 Rancher UI 中创建的,它只会自动获取对私有镜像仓库凭证的访问权限,因此你还必须创建和引用镜像仓库密文。
密文必须创建在部署工作负载的同一命名空间中。
下面是一个示例 pod.yml
,它用于使用私有镜像仓库的镜像的工作负载。在此示例中,pod 使用来自 Quay.io 的镜像,而且 .yml 指定了镜像的路径。pod 使用存储在名为 testquay
的 Kubernetes 密文中的凭证来向镜像仓库进行身份验证,该密文在 name
字段的 spec.imagePullSecrets
中指定:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: quay.io/<Quay profile name>/<image name>
imagePullSecrets:
- name: testquay
在此示例中,名为 testquay
的密文位于 Default 命名空间中。
你可以通过 kubectl
使用私有镜像仓库凭证来创建密文。此命令创建名为 testquay
的密文:
kubectl create secret docker-registry testquay \ --docker-server=quay.io \ --docker-username=<Profile name> \ --docker-password=<password>
要查看密文是如何存储在 Kubernetes 中的,可以使用以下命令:
kubectl get secret testquay --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
结果如下所示:
{"auths":{"quay.io":{"username":"<Profile name>","password":"<password>","auth":"c291bXlhbGo6dGVzdGFiYzEyMw=="}}}
部署工作负载后,你可以检查镜像是否已拉取成功:
kubectl get events
结果应如下所示:
14s Normal Scheduled Pod Successfully assigned default/private-reg2 to minikube 11s Normal Pulling Pod pulling image "quay.io/<Profile name>/<image name>" 10s Normal Pulled Pod Successfully pulled image "quay.io/<Profile name>/<image name>"
有关详细信息,请参阅 Kubernetes 文档中的创建使用你密文的 pod。