我已经设置了一个Kubenetes集群来从GitLab私有存储库的注册表中提取容器映像。
当我使用gitlab-ci.yml
构建图像时 - 我可以使用它成功登录注册表:
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
部署到我的Kubernetes集群时,我会产生一个秘密:
- kubectl create secret -n $KUBE_NAMESPACE docker-registry gitlab-registry \
--docker-server="$CI_REGISTRY" \
--docker-username="$CI_REGISTRY_USER" \
--docker-password="$CI_REGISTRY_PASSWORD" \
--docker-email="$GITLAB_USER_EMAIL" \
-o yaml --dry-run | kubectl replace -n $KUBE_NAMESPACE --force -f -
然后我使用imagePullSecrets
在我的部署脚本中引用此秘密。当我的集群是v1.5时,这很好用。但是,由于我升级到v1.6,我无法拉出容器图像。
我在Kubernetes控制台中遇到的错误是:
Failed to pull image "registry.gitlab.com/user/repo:branch":
rpc error: code = 2 desc = unauthorized: HTTP Basic: Access denied
Error syncing pod, skipping: failed to "StartContainer" for "helm-chart" with
ErrImagePull: "rpc error: code = 2 desc = unauthorized: HTTP Basic: Access denied"
为了测试,我尝试在自己的PC上运行以下命令:
docker login registry.gitlab.com
当我输入我的GitLab用户名和密码时,一切都很好。但是,如果我尝试以下内容:
docker login \
-u "gitlab-ci-token" \
-p "the-auth-code-in-my-secret" \
registry.gitlab.com
我收到以下错误:
Error response from daemon: Get https://registry.gitlab.com/v2/:
unauthorized: HTTP Basic: Access denied
我不确定这是GitLab问题还是Kubernetes问题。我只是做错了吗?
答案 0 :(得分:2)
事实证明,这是一个时间问题。我的部署脚本正在创建Kubernetes对象并且无需等待即可完成。因为这在过去有效,所以我认为部署脚本完成后$CI_REGISTRY_PASSWORD
仍然有效。
我认为它工作的事实只是巧合(我的Kubernetes集群必须在CI管道清理其资源之前拉出容器)。将以下行添加到`gitlab-ci.yml':
- kubectl rollout status -n "$KUBE_NAMESPACE" -w "deployment/name"
我不再收到" HTTP Basic:拒绝访问"消息