今天我了解到:在任何非GCP Kubernetes中从GCR(Google容器注册表)中拉出Docker镜像……
一个简单的指南,可帮助您在任何非GCP Kubernetes群中心化使用GCR作为Container Registry 摄影:Victoire Joncheray,来自Unsplash
我有许多辅助项目,但我将其部署在GCP(Google Cloud Platform)中的Kubernetes Cluster中。但是在DigitalOcean(DO)发布他们的Kubernetes功能之后,我想将我在GCP中存在的所有项目移动到DO。这种迁移的原因是因为GCP太昂贵而且仅仅对于没有任何生产用户的简单的侧面项目而言太过分了。
但是,我只是迁移Kubernetes集群和数据库。我仍然使用GCP提供的一些服务,例如GCR(谷歌容器注册表)等Google服务用于我的容器注册,因为与私有注册表的DockerHub相比,GCR有点便宜。
在迁移Kubernetes Clusters时,我发现了一个问题。问题是关于拉动私有图像时对GCR的身份验证。这就是当我获得pod时pod的状态。
$kubectl获取pods
NAME READY STATUS RESTARTS AGE
august-f7fc98c5-x4chl 0/1 ErrImagePull 0 88s
查找日志后,问题就出现了,因为我需要在拉取私有映像时定义访问令牌。所以在这里我将解释我解决这个问题的所有步骤。
步骤1:为GCR创建凭据
- 转到GCP控制台。选择“API&Services”>“凭据”
- 选择“创建凭据”>“服务帐户密钥”>“创建新服务帐户”。
- 然后,填写服务帐户名称,对于“角色”,选择“查看器”
- 然后单击“创建”创建后,凭据将自动下载到JSON文件中。它看起来像这样。
所以现在,我们已经拥有能够从GCR中提取私人图像的凭据。
步骤2:在Kubernetes群中心化添加Kubernetes秘密
- 下一步是,我们将在Kubernetes集群中创建一个Kubernetes秘密。
$kubectl创建秘密docker-registry gcr-json-key
–docker-server = asia.gcr.io
–docker-username = _json_key
–docker-password =“$(cat~ / json-key-file-from-gcp.json)”
–docker-email=any@valid.email
- 运行上面的命令并根据您的需要输入。例如:docker-server:asia.gcr.io(我使用亚洲服务器)。并使用您在GCP注册的电子邮件填写电子邮件,等等。
- 如果您在下面遇到此错误,则会发生这种情况,因为您已经拥有一个名为gcr-json-key的秘密。您可以删除密码并重新创建,或者在创建密钥时添加其他名称。
来自服务器的错误(AlreadyExists):秘密“gcr-json-key”已经存在
- 为了确保秘密已经创建,只需获得秘密;它应该以名称gcr-json-key存在。
$kubectl得到秘密
名称类型数据年龄
gcr-json-key kubernetes.io/dockerconfigjson 1 6s步骤3:使用秘密进行部署
我们如何使用前面步骤中创建的秘密有两种方法。他们是
- 将密钥添加到Kubernetes命名空间中的默认服务帐户中的ImagePullSecrets中。使用此方法,将部署的每个pod将在拉动图像时使用该秘密。
- 另一种方法是,将秘密直接添加到需要它的每个pod的部署配置中。
步骤3.a:在默认服务帐户中将“秘密”添加到“ImagePullSecrets”。
第一种方法是在默认服务帐户中添加密货币钥。为此,我们可以直接复制下面的命令。
$kubectl补丁serviceaccount默认
-p'{“imagePullSecrets”:( {“name”:“gcr-json-key”})}'
使用该命令,我们的Kubernetes集群应该已经能够从GCR中提取图像。
$kubectl描述pod pod_name
….
正常拉动16s kubelet,default-staging-oro2拉动图像“asia.gcr.io/personal-project/august:latest”正常拉动12s kubelet,default-staging-oro2成功拉动图像“asia.gcr.io/personal-project / 8:最新”
如果以某种方式仍然出错,请尝试删除pod并等待pod再次重新部署。
步骤3.b:将秘密添加到每个Pod部署配置
对于此步骤,我们需要更新部署文件。我们需要将秘密直接添加到部署文件中。此方法仅适用于包含秘密的每个pod。
寻找物业:imagePullSecrets。我们必须直接在部署文件中添加秘密。
对于我的情况,我选择第一种方法,原因是因为我的默认容器注册表是GCR。因此,如果将来我有一个不同的注册表,我将直接将部署文件添加到需要它的每个pod中。
所以,这就是我今天学到的东西。也许它仅适用于GCR,但我认为其他Container Registry的概念仍然相同。
参考
- https://container-solutions.com/using-google-container-registry-with-kubernetes/