为啥我的容器注册表适用于 gitlab 自动部署,但不适用于我的自定义管道?

Posted

技术标签:

【中文标题】为啥我的容器注册表适用于 gitlab 自动部署,但不适用于我的自定义管道?【英文标题】:Why does my container registry work for gitlab autodeploy but not for my custom pipeline?为什么我的容器注册表适用于 gitlab 自动部署,但不适用于我的自定义管道? 【发布时间】:2022-01-17 03:39:23 【问题描述】:

嘿,我正在创建一个 gitlab 管道,我有 2 个阶段:staging 和 qa。 对于 staging,我使用 gitlabs auto-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_USERpassword=$CI_REGISTRY_PASSWORD。 我仔细检查过,在各自的命名空间中有一个秘密。 除了密码之外,这两个秘密都是相同的,密码是在每次运行管道时生成的(据我所知)。

最后我将秘密放入部署文件中:

spec: 
  template:
    spec:
      imagePullSecrets:
        - <name-of-secret>

所以这应该让我可以访问容器注册表,但它给了我上面的错误。 它与auto-deploy 可以正常工作但不适合我的原因是什么? 秘密是以相同的方式创建的,因此它应该产生相同的结果。

感谢您的帮助:)

编辑: 我在project &gt; settings &gt; repository &gt; 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 documentation,我应该可以使用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

由于我提供了用户名和密码,并且错误并没有抱怨它们不匹配,我假设这是有效的。 但是为什么认证仍然没有通过呢?是否还需要进行身份验证?也许是一些证书?

现在也使用gitlab-deploy-token 的暂存管道(带有auto-deploy 的管道)仍然有效。

【问题讨论】:

【参考方案1】:

您生成的密钥 ($CI_REGISTRY_PASSWORD) 仅在特定作业期间有效。所以工作完成的那一刻密码是无效的。

使用部署令牌。

【讨论】:

啊,所以工作完成了,然后 kubelet 尝试拉,它失败了,因为它不再有效?为什么auto-deploy 没有问题,它会在工作期间拉动吗?非常感谢,我会把它放在一个部署令牌中:) 它不适用于部署令牌。服务器不再抱怨密码/用户名错误。但是现在注册表说需要进行身份验证。我编辑了我的问题并添加了详细信息

以上是关于为啥我的容器注册表适用于 gitlab 自动部署,但不适用于我的自定义管道?的主要内容,如果未能解决你的问题,请参考以下文章

gitlab,gitlab runner自动化部署docker容器

Docker环境搭建Jenkins+gitlab+maven自动打包 部署容器

我的docker随笔34:gitlab服务部署

我的docker随笔34:gitlab服务部署

如何使用带有构建触发器的容器注册表灵活地自动部署谷歌应用引擎

jenkins+docker+gitlab自动化部署