如何从私人项目';使用GitLab管理的Kubernetes群集的图像注册表

如何从私人项目';使用GitLab管理的Kubernetes群集的图像注册表,kubernetes,gitlab,gitlab-ci,Kubernetes,Gitlab,Gitlab Ci,GitLab提供管理Kubernetes群集,包括(例如)创建命名空间、添加一些令牌等。在GitLab CI作业中,可以直接使用$KUBECONFIG变量联系群集,例如使用helm创建部署。只要GitLab项目是公共的,因此GitLab项目的图像注册中心托管的Docker图像是可公开访问的,这就像一种魅力 但是,在处理私人项目时,Kubernetes当然需要一个ImagePullSecret来验证GitLab的映像注册表以检索映像。据我所知,GitLab不会自动为存储库访问提供ImagePull

GitLab提供管理Kubernetes群集,包括(例如)创建命名空间、添加一些令牌等。在GitLab CI作业中,可以直接使用
$KUBECONFIG
变量联系群集,例如使用helm创建部署。只要GitLab项目是公共的,因此GitLab项目的图像注册中心托管的Docker图像是可公开访问的,这就像一种魅力

但是,在处理私人项目时,Kubernetes当然需要一个
ImagePullSecret
来验证GitLab的映像注册表以检索映像。据我所知,GitLab不会自动为存储库访问提供
ImagePullSecret

因此,我的问题是:在GitLab管理的部署环境中,在Kubernetes部署中访问私有GitLab存储库的映像存储库的最佳方式是什么?

在我看来,这些是可能的,以及它们不合格/不理想的原因:

  • GitLab提供的永久
    ImagePullSecret
    :在GitLab管理的Kubernetes集群上进行部署时,GitLab提供部署脚本(例如Helm图表或
    kubectl apply-f manifest.yml
    )。据我所知,有很多东西,比如服务帐户和令牌等,但是没有ImagePullSecret,也没有用于启用ImagePullSecret创建的配置选项
  • 使用
    $CI\u JOB\u TOKEN
    :使用GitLab CI/CD时,GitLab提供了一个名为
    $CI\u JOB\u TOKEN
    的变量,可用于在作业执行期间将Docker映像上载到注册表。此令牌在作业完成后过期。它可以与
    helm install--wait
    结合使用,但是当重新调度到一个还没有映像的新节点时,令牌将过期,节点将无法再下载映像。因此,这只在部署应用程序时起作用
  • 手动创建ImagePullSecret并将其添加到
    部署
    或默认的
    服务帐户
    :*这是一个手动步骤,必须为每个单独的项目重复,而且很糟糕-我们正在尝试实现自动化/GitLab managed Kubernetes群集旨在避免任何手动步骤`
  • 还有别的事但我不知道
那么,我在其中一点上错了吗?我是否缺少此列表中的合格选项


再次强调:这一切都是关于与GitLab的“托管集群”功能的无缝集成。我知道如何将GitLab中的令牌添加为Kubernetes中的ImagePullSecrets,但我想知道如何使用托管集群功能自动执行此操作。

还有另一种方法。您可以在容器运行时配置中烘焙ImagePullSecret。码头工人、集装箱工人或CRI-O(无论您使用什么)

码头工人

  • 作为root用户运行
    docker登录
    。然后应该创建/更新文件
    /root/.docker/config.json
    。将其粘贴到所有Kubernetes节点中,并确保kubelet以root身份运行(通常是这样)

    文件内容应如下所示:

    [plugins.cri.registry.auths]
      [plugins.cri.registry.auths."https://gcr.io"]
        username = ""
        password = ""
        auth = ""
        identitytoken = ""
    
    {
    “授权”:{
    “我的私人注册处”:{
    “授权”:“xxxxxx”
    }
    },
    “HttpHeaders”:{
    “用户代理”:“Docker客户端/18.09.2(Linux)”
    }
    }
    
集装箱

  • 使用以下内容归档:
    [plugins.cri.registry.auths]
      [plugins.cri.registry.auths."https://gcr.io"]
        username = ""
        password = ""
        auth = ""
        identitytoken = ""
    
CRI-O

  • 在文件中指定
    global\u auth\u file
    选项

✌️

配置您的帐户

例如,对于kubernetes pull image gitlab.com,请使用地址registry.gitlab.com:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
kubectl创建秘密docker注册表regcred--docker服务器=--docker用户名=--docker密码=--docker电子邮件=

是的,您的问题(IME)的答案是您的第三个要点,因为
CI_JOB_TOKEN
在作业运行后过期,这意味着任何必须重新创建的Pod都将失败,如果计划在不同的节点上,您是对的,到目前为止,此字段中没有自动程序,手动操作非常不方便。