无法将映像从远程Gitlab注册表拉至Kubernetes

时间:2020-02-26 12:59:08

标签: docker kubernetes gitlab-ci

我一直在尝试将docker映像部署到Kubernetes集群上而没有运气,我的deployment.yaml看起来像:

apiVersion: v1
kind: Pod
metadata:
  name: application-deployment
  labels:
    app: application
spec:
  serviceAccountName: gitlab
  automountServiceAccountToken: false
  containers:
  - name: application
    image: example.org:port1/foo/bar:latest
    ports:
      - containerPort: port2
  volumes:
    - name: foo
      secret:
        secretName: regcred

但是无法获取图像。

无法提取图像“ example.org:port1/foo/bar:latest”:rpc错误:代码=未知desc =来自守护程序的错误响应:获取https://example.org:port1/v2/foo/bar/manifests/latest:拒绝:禁止访问

deployment.yaml中使用的秘密是这样创建的:

kubectl create secret docker-registry regcred --docker-server=${CI_REGISTRY} --docker-username=${CI_REGISTRY_USER} --docker-password=${CI_REGISTRY_PASSWORD} --docker-email=${GITLAB_USER_EMAIL}

尝试#1:添加imagePullSecrets

...
imagePullSecrets:
  - name: regcred

导致:

无法提取图像“ example.org:port1/foo/bar:latest”:rpc错误:代码=未知desc =来自守护程序的错误响应:获取https://example.org:port1/v2/foo/bar/manifests/latest:未经授权:HTTP基本:访问被拒绝

解决方案:

我已经在 Settings> Repository> Deploy Tokens>(已创建具有read_registry范围的一个)下创建了部署令牌

并将给定值添加到环境变量中,现在合适的行如下所示:

kubectl create secret docker-registry regcred --docker-server=${CI_REGISTRY} --docker-username=${CI_DEPLOY_USER} --docker-password=${CI_DEPLOY_PASSWORD}

我从教程和Gitlab文档中获得了有问题的内容,他们描述了部署令牌,但在示例中进一步使用了有问题的内容。

3 个答案:

答案 0 :(得分:1)

您需要在部署中添加imagePullSecret,因此您的Pod将为:

apiVersion: v1
kind: Pod
metadata:
  name: application-deployment
  labels:
    app: application
spec:
  serviceAccountName: gitlab
  automountServiceAccountToken: false
  containers:
  - name: application
    image: example.org:port1/foo/bar:latest
    ports:
      - containerPort: port2
  imagePullSecrets:
  - name: regcred

确保密钥和pod在同一名称空间上运行。

我注意到您正在尝试在gitlab-ci上的管道上运行命令,在运行create secret命令后检查您的密码是否正确(使用变量替换)。

您可以验证是否可以登录注册表并在其他Linux上手动提取映像,以确保凭据正确。

答案 1 :(得分:0)

我转载了您的问题,问题出在创建存储库机密时使用的密码。为gitlab存储库创建密钥时,必须使用在gitlab中创建的个人令牌代替密码。

您可以转到Settings -> Access Tokens来创建令牌。然后,您必须为令牌选择名称,到期日期和令牌的范围。

然后通过运行

像以前一样创建一个秘密
kubectl create secret docker-registry regcred --docker-server=$docker_server --docker-username=$docker_username --docker-password=$personal_token

在创建广告连播时,您必须包含

  imagePullSecrets:
  - name: regcred

答案 2 :(得分:0)

起初创建机密对我不起作用,但我必须为机密指定命名空间并且它起作用了。

kubectl delete secret -n ${NAMESPACE} regcred --ignore-not-found
kubectl create secret -n ${NAMESPACE} docker-registry regcred --docker-server=${CI_REGISTRY} --docker-username=${CI_DEPLOY_USERNAME} --docker-password=${CI_DEPLOY_PASSWORD} --docker-email=${GITLAB_USER_EMAIL}