Kubernetes 镜像仓库和 Docker 镜像仓库
镜像仓库是 Kubernetes 密文(Secret),包含用于向私有 Docker 镜像仓库进行身份验证的凭证。
“Registry” 这个词可能有两种意思,可指代 Docker 或 Kubernetes 镜像仓库:
- Docker 镜像仓库包含 Docker 镜像,你可以拉取镜像以便在 deployment 中使用镜像。镜像仓库是一个无状态、可扩展的服务器端应用程序,用于存储和分发 Docker 镜像。
- Kubernetes 镜像仓库是一个镜像拉取密文,你的 deployment 使用该密文来向 Docker 镜像仓库进行身份验证。
Deployment 使用 Kubernetes 镜像仓库密文向私有 Docker 镜像仓库进行身份验证,然后拉取托管在仓库上的 Docker 镜像。
目前,只有在 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 中添加的私有镜像仓库凭证进行身份验证,并拉取指定的 Docker 镜像。
通过 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。