如何使用私有 gitlab 容器注册表在 kubernetes 中拉取镜像?

joh*_*487 3 gitlab kubernetes docker-desktop

我在 gitlab 上托管了一个私有 docker 注册表,我想使用此存储库为我的本地 kubernetes 集群提取映像:

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   68m
Run Code Online (Sandbox Code Playgroud)

K8s 已启动v1.22.5,是一个单节点集群,与 Docker Desktop 一起“开箱即用”。我已经构建了一个映像并将其部署到 gitlab 容器注册表registry.gitlab.com。我已经做了什么:

  1. 执行了命令docker login -u <username> -p <password> registry.gitlab.com
  2. 将文件修改~/.docker/config.json为以下内容:
    {
        "auths": {
            "registry.gitlab.com": {}
        },
        "credsStore": "osxkeychain"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用以下文件创建密钥并将其部署到集群:
    apiVersion: v1
    kind: Secret
    metadata:
      name: registry-key
    data:
      .dockerconfigjson: <base-64-encoded-.config.json-file>
    type: kubernetes.io/dockerconfigjson
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用以下文件部署应用程序:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-deployment 
      labels:
        app: test-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test-app
      template:
        metadata:
          labels:
            app: test-app
        spec:
          imagePullSecrets:
          - name: registry-key
          containers:
          - name: test-app
            image: registry.gitlab.com/<image-name>:latest
            imagePullPolicy: Always
            ports:
            - containerPort: 80
    
    Run Code Online (Sandbox Code Playgroud)

部署已成功创建,但在检查 pod ( kubectl describe pod) 时,我发现以下事件:

Events:
  Type     Reason     Age               From               Message
  ----     ------     ----              ----               -------
  Normal   Scheduled  21s               default-scheduler  Successfully assigned default/test-deployment-87b5747b5-xdsl9 to docker-desktop
  Normal   BackOff    19s               kubelet            Back-off pulling image "registry.gitlab.com/<image-name>:latest"
  Warning  Failed     19s               kubelet            Error: ImagePullBackOff
  Normal   Pulling    7s (x2 over 20s)  kubelet            Pulling image "registry.gitlab.com/<image-name>:latest"
  Warning  Failed     7s (x2 over 19s)  kubelet            Failed to pull image "registry.gitlab.com/<image-name>:latest": rpc error: code = Unknown desc = Error response from daemon: Head "https://registry.gitlab.com/v2/<image-name>/manifests/latest": denied: access forbidden
  Warning  Failed     7s (x2 over 19s)  kubelet            Error: ErrImagePull
Run Code Online (Sandbox Code Playgroud)

请提供可能导致这些错误的任何信息。

joh*_*487 5

config.json我设法通过编辑以下命令生成的默认值解决了该问题$ docker login

{
    "auths": {
        "registry.gitlab.com": {}
    },
    "credsStore": "osxkeychain"
}
Run Code Online (Sandbox Code Playgroud)

变成

{
    "auths": {
        "registry.gitlab.com": {
            "auth":"<access-token-in-plain-text>"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢巴拉在评论中提出这一建议。我意识到以纯文本形式将访问令牌存储在文件中可能不安全,但如果需要,可以更改为使用路径。

我还根据 OzzieFZI 的建议创建了这个秘密:

$ kubectl create secret docker-registry registry-key \
  --docker-server=registry.gitlab.com \
  --docker-username=<username> \
  --docker-password="$(cat /path/to/token.txt)"
Run Code Online (Sandbox Code Playgroud)