为什么我的容器注册表适用于 gitlab autodeploy 但不适用于我的自定义管道?

Why does my container registry work for gitlab autodeploy but not for my custom pipeline?

嘿,我正在创建一个 gitlab 管道,我有 2 个阶段:暂存和质量检查。 对于暂存,我使用 gitlabs auto-deploy 脚本,对于质量检查,我使用自定义脚本。

通过暂存管道工作。对于 qa,容器注册表告诉我 username/password 是错误的:

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 > 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 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

link 是一个 json 文件:

errors: 
   0:   
      code:     "UNAUTHORIZED"
      message:  "authentication required"
      detail:   null

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

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

您生成的秘密($CI_REGISTRY_PASSWORD)仅在特定作业期间有效。因此,作业完成时密码无效。

使用部署令牌。