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

Docker 无法将映像从远程Gitlab注册表拉到Kubernetes,docker,kubernetes,gitlab-ci,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: - na

我一直在尝试将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
kubectl create secret docker-registry regcred --docker-server=${CI_REGISTRY} --docker-username=${CI_DEPLOY_USER} --docker-password=${CI_DEPLOY_PASSWORD}
但它无法获得图像

未能从守护进程获取映像“example.org:port1/foo/bar:latest”:rpc错误:code=Unknown desc=错误响应:Get:denied:访问被禁止

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 error:code=Unknown desc=错误响应:Get:unauthorized:HTTP Basic:Access denied

解决方案:

我已经在“设置>存储库>部署令牌>”下创建了部署令牌(创建了一个具有读取注册表范围的令牌)

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

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
kubectl create secret docker-registry regcred --docker-server=${CI_REGISTRY} --docker-username=${CI_DEPLOY_USER} --docker-password=${CI_DEPLOY_PASSWORD}

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

您需要在部署中添加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
确保secret和pod在同一命名空间上运行

还要确保您正在拉取的容器存在并且带有正确的标签

我注意到您试图在gitlab ci上的管道上运行该命令,请在运行create secret命令后检查您的secret是否正确(替换变量)


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

我重现了您的问题,问题在于您在创建存储库的机密时使用的密码。为gitlab存储库创建密码时,必须使用在gitlab中创建的个人令牌,而不是密码

您可以通过转到
设置->访问令牌
来创建令牌。然后,您必须为您的令牌选择一个名称、到期日期和令牌的范围

然后像前面一样通过运行创建一个秘密

kubectl create secret docker-registry regcred --docker-server=$docker_server --docker-username=$docker_username --docker-password=$personal_token
在创建pod时,您必须包括

  imagePullSecrets:
  - name: regcred

创建一个秘密一开始对我不起作用,尽管我必须为这个秘密指定名称空间,但它起作用了

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}

好像你错过了一个秘密。查看此页面了解如何从私有注册表中提取图像@relief.melone会导致一个稍有不同的错误。最后一部分更改为
未经授权:HTTP Basic:拒绝访问
创建密码时您是否输入了gitlab密码或个人令牌?已尝试并导致问题和评论中所述的不同错误。我已按中所述测试了
regcred
。我阅读了注释,但错误“unauthorized:HTTP Basic:Access denied”导致凭据不正确或对资源没有权限。抱歉,我坚持要说,但您是否验证了有关凭据和授权的信息?祝你好运事实上,身份验证是错误的。在我的情况下,访问令牌不是最合适的,所以我创建了部署令牌。