首页 > 解决方案 > Pod 无法从私有 Docker 注册表中提取图像

问题描述

我在让我的 pod 从我已设置并能够进行身份验证的私有 docker 注册表中提取图像时遇到了一些真正的麻烦(我可以执行 docker login https://my.website.com/并且我在没有登录的情况下成功输入我的用户名:密码)(我可以运行docker pull my.website.com:5000/human/forum并查看所有正在下载的图层。)。

我使用https://github.com/bazelbuild/rules_k8s#aliasing-eg-k8s_deploy我将命名空间指定为"default".

在生成密钥之前,我确保将"HTTPS://my.website.com:5000/V2/"(小写)放入 docker 配置文件的 auth 部分。regcred

请注意,我指定了imagePullSecrets以下内容:

# deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: angular-bazel-example-prod
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: angular-bazel-example-prod
    spec:
      containers:
       - name: angular-bazel-example
         image: human/forum:dev
         imagePullPolicy: Always
         ports:
         - containerPort: 8080
      imagePullSecrets:
       - name: regcred # Notice

我确保更新我的证书颁发机构证书:

cp /etc/docker/certs.d/my.website.com\:5000/ca.crt /usr/local/share/ca-certificates/my.website.registry.com/
sudo update-ca-certificates

我懂了sudo curl --user testuser:testpassword --cacert /usr/local/share/ca-certificates/my.website.registry.com/ca.crt -X GET https://mywebsite.com:5000/v2/_catalog

>{"repositories":["human/forum"]}

我懂了sudo curl --user testuser:testpassword --cacert /usr/local/share/ca-certificates/mywebsite.registry.com/ca.crt -X GET https://mywebsite.com:5000/v2/human/forum/tags/list

>{"name":"a/repository","tags":["dev"]}

一定有办法解决这个问题,但我不知道如何。

我很好奇的一件事是

kubectl describe pod my-first-pod...
...
Volumes:
  default-token-mtz9g:
    Type:        Secret

我在哪里可以找到这个卷?我无法kubectl exec进入容器,因为没有一个正在运行..因为 pod 无法提取图像。

您对我如何解决此问题有任何想法吗?

谢谢!

Slackware

标签: kubernetes

解决方案


创建一个 Kubernetes 密钥以访问自定义存储库。一种方法是手动提供服务器、用户和密码。文档链接

kubectl create secret docker-registry $YOUR_REGISTRY_NAME --docker-server=https://$YOUR_SERVER_DNS/v2/ --docker-username=$YOUR_USER --docker-password=$YOUR_PASSWORD --docker-email=whatever@gmail.com --namespace=default

然后在你的 yaml 中使用它

...
      imagePullSecrets:
       - name: $YOUR_REGISTRY_NAME

关于您看到挂载的默认令牌,它属于您的 pod 用来与 kubernetes api 对话的服务帐户。kubectl get sa您可以通过运行和找到服务帐户kubectl describe sa $DEFAULT_SERVICE_ACCOUNT_IDkubectl get secrets通过运行和找到令牌kubectl describe secret $SECRET_ID。澄清此服务帐户和令牌与 docker 注册表无关,除非您指定它。要在服务帐户中包含注册表,请按照此指南链接


推荐阅读