嘿,我正在创建一个 gitlab 管道,我有 2 个阶段:staging 和 qa。对于 staging 我使用 gitlabsauto-deploy
脚本,对于 qa 我使用自定义脚本。
随着分期管道的工作。对于 qa,容器注册表告诉我用户名/密码错误:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Failed 4m48s (x4 over 6m9s) kubelet Failed to pull image "<container-url>": rpc error: code = Unknown desc = unable to retrieve auth token: invalid username/password: unauthorized: HTTP Basic: Access denied
Warning Failed 4m48s (x4 over 6m9s) kubelet Error: ErrImagePull
Normal BackOff 4m8s (x7 over 6m8s) kubelet Back-off pulling image "<container-url>"
Warning Failed 64s (x20 over 6m8s) kubelet Error: ImagePullBackOff
在管道期间,我正在为注册表创建一个包含登录详细信息的秘密。两个管道都使用以下方法创建它:
kubectl create secret -n "$KUBE_NAMESPACE" \
docker-registry "gitlab-registry-${CI_PROJECT_PATH_SLUG}" \
--docker-server="$CI_REGISTRY" \
--docker-username="${CI_DEPLOY_USER:-$CI_REGISTRY_USER}" \
--docker-password="${CI_DEPLOY_PASSWORD:-$CI_REGISTRY_PASSWORD}" \
--docker-email="$GITLAB_USER_EMAIL" \
-o yaml --dry-run | kubectl replace -n "$KUBE_NAMESPACE" --force -f -
由于我没有部署令牌,因此默认为username=$CI_REGISTRY_USER
and password=$CI_REGISTRY_PASSWORD
。我仔细检查过,在各自的命名空间中有一个秘密。除了密码之外,这两个秘密都是相同的,每次运行管道时都会生成密码(据我所知)。
最后,我将秘密放入部署文件中:
spec:
template:
spec:
imagePullSecrets:
- <name-of-secret>
所以这应该让我可以访问容器注册表,但它给了我上面的错误。它可以正常工作auto-deploy
但不适合我的原因是什么?秘密是以相同的方式创建的,因此它应该产生相同的结果。
谢谢你的帮助 :)
编辑:
我在下添加了一个部署令牌project > settings > repository > deploy tokens
并调用它gitlab-deploy-token
。它拥有所有权限,并且其登录详细信息通过$CI_DEPLOY_USER
和传递给管道$CI_DEPLOY_PASSWORD
。
pod 中的错误更改为:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
...
Warning Failed 13m (x4 over 15m) kubelet Failed to pull image "<image-url>": rpc error: code = Unknown desc = Error reading manifest <container-tag> in <registry-url> errors: denied: requested access to the resource is denied unauthorized: authentication required
根据gitlab 文档,我应该能够使用buildah login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
. 但是当我在登录和退出注册表的阶段这样做时,我得到:
error authenticating creds for "<registry>": pinging docker registry returned: Get <link>: net/http: TLS handshake timeout
链接是一个 json 文件:
errors:
0:
code: "UNAUTHORIZED"
message: "authentication required"
detail: null
由于我提供了用户名和密码,并且错误不会抱怨它们不匹配,我假设这是有效的。但是为什么认证仍然没有通过呢?是否还需要进行身份验证?也许一些证书?
auto-deploy
现在也在使用的暂存管道(带有 的)gitlab-deploy-token
仍然有效。