Kubectl 无法连接到 docker 注册表以下载映像



我正在逐步了解 Kubernetes in Action,而不仅仅是熟悉 Kubernetes。

我已经有一个 Docker Hub 帐户,我一直在使用它进行特定于 Docker 的实验。

正如本书第2章所述,我构建了玩具"kubia"图像,并能够将其推送到Docker Hub。 我通过登录 Docker Hub 并查看图像再次验证了这一点。

我在 Centos7 上这样做。

然后,我运行以下命令来创建运行映像的复制控制器和 Pod:

kubectl run kubia --image=davidmichaelkarr/kubia --port=8080 --generator=run/v1

我等了一段时间让状态发生变化,但它从未完成下载映像,当我描述 pod 时,我看到如下所示的内容:

Normal   Scheduled              24m                 default-scheduler  Successfully assigned kubia-25th5 to minikube
Normal   SuccessfulMountVolume  24m                 kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-x5nl4"
Normal   Pulling                22m (x4 over 24m)   kubelet, minikube  pulling image "davidmichaelkarr/kubia"
Warning  Failed                 22m (x4 over 24m)   kubelet, minikube  Failed to pull image "davidmichaelkarr/kubia": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

所以我随后构造了以下命令:

curl -v -u 'davidmichaelkarr:**' 'https://registry-1.docker.io/v2/'

它使用与我用于 Docker Hub 的相同密码(它们应该是相同的,对吧?

这给了我以下内容:

* About to connect() to proxy *** port 8080 (#0)
*   Trying **.**.**.**...
* Connected to *** (**.**.**.**) port 8080 (#0)
* Establish HTTP proxy tunnel to registry-1.docker.io:443
* Server auth using Basic with user 'davidmichaelkarr'
> CONNECT registry-1.docker.io:443 HTTP/1.1
> Host: registry-1.docker.io:443
> User-Agent: curl/7.29.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established
<
* Proxy replied OK to CONNECT request
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*       subject: CN=*.docker.io
*       start date: Aug 02 00:00:00 2017 GMT
*       expire date: Sep 02 12:00:00 2018 GMT
*       common name: *.docker.io
*       issuer: CN=Amazon,OU=Server CA 1B,O=Amazon,C=US
* Server auth using Basic with user 'davidmichaelkarr'
> GET /v2/ HTTP/1.1
> Authorization: Basic ***
> User-Agent: curl/7.29.0
> Host: registry-1.docker.io
> Accept: */*
>
< HTTP/1.1 401 Unauthorized
< Content-Type: application/json; charset=utf-8
< Docker-Distribution-Api-Version: registry/2.0
< Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io"
< Date: Wed, 24 Jan 2018 18:34:39 GMT
< Content-Length: 87
< Strict-Transport-Security: max-age=31536000
<
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
* Connection #0 to host *** left intact

我不明白为什么这会失败身份验证。

更新

根据第一个答案和我从另一个问题中获得的信息,我编辑了服务帐户的描述,添加了"imagePullSecrets"键,然后再次删除了复制控制器并重新创建了它。 结果似乎是相同的。

这是我为创建密钥而运行的命令:

kubectl create secret docker-registry regsecret --docker-server=registry-1.docker.io --docker-username=davidmichaelkarr --docker-password=** --docker-email=**

然后,我获取了服务帐户的 yaml,添加了密钥的密钥引用,然后将该 yaml 设置为服务帐户的设置。

以下是服务帐户的当前设置:

$ kubectl get serviceaccount default -o yaml
apiVersion: v1
imagePullSecrets:
- name: regsecret
kind: ServiceAccount
metadata:
creationTimestamp: 2018-01-24T00:05:01Z
name: default
namespace: default
resourceVersion: "81492"
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: 38e2882c-009a-11e8-bf43-080027ae527b
secrets:
- name: default-token-x5nl4

以下是执行此操作后容器描述中的更新事件列表:

Events:
Type     Reason                 Age               From               Message
----     ------                 ----              ----               -------
Normal   Scheduled              7m                default-scheduler  Successfully assigned kubia-f56th to minikube
Normal   SuccessfulMountVolume  7m                kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-x5nl4"
Normal   Pulling                5m (x4 over 7m)   kubelet, minikube  pulling image "davidmichaelkarr/kubia"
Warning  Failed                 5m (x4 over 7m)   kubelet, minikube  Failed to pull image "davidmichaelkarr/kubia": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Normal   BackOff                4m (x6 over 7m)   kubelet, minikube  Back-off pulling image "davidmichaelkarr/kubia"
Warning  FailedSync             2m (x18 over 7m)  kubelet, minikube  Error syncing pod

我可能还做错了什么?

更新

我认为所有这些身份验证问题可能都与真正的问题无关。 关键点是我在 pod 描述中看到的内容(分成多行以使其更容易看到):

Warning  Failed                 22m (x4 over 24m)   kubelet, 
minikube  Failed to pull image "davidmichaelkarr/kubia": rpc error: code = 
Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/:
net/http: request canceled while waiting for connection
(Client.Timeout exceeded while awaiting headers)

在这一点上,最后一行似乎是最重要的信息。 它不是身份验证失败,而是连接超时。 根据我的经验,这样的事情通常是由通过防火墙/代理的问题引起的。 我们确实有一个内部代理,并且我在我的环境中设置了这些环境变量,但是 kubectl 用于建立此连接的"服务帐户"呢? 我是否必须以某种方式在服务帐户描述中设置代理配置?

您需要确保在 Minikube VM 中运行的 Docker 守护进程使用以下方式启动 minikube 来使用您的公司代理:

minikube start --docker-env http_proxy=http://proxy.corp.com:port --docker-env https_proxy=http://proxy.corp.com:port --docker-env no_proxy=192.168.99.0/24

我几次遇到同样的问题。 在这里更新可能对某人有用。

首先描述 POD(kubectl describe pod),

1.如果您看到访问被拒绝/存储库不存在错误,例如

来自守护进程的错误响应:拒绝测试/nginx 的拉取访问, 存储库不存在或可能需要"docker 登录":被拒绝: 请求访问资源被拒绝

溶液:

  • 如果是本地 K8s,则需要先登录 docker 注册表
  • 如果云上的 Kubernetes 集群,则为 Registry 创建密钥并添加 imagepullsecret 以及机密名称
<小时 />

2。如果出现超时错误,

错误:获取 https://registry-1.docker.io/v2/:net/http:等待连接时请求取消(客户端超时超出 等待标头)

溶液:

  • 检查节点是否能够连接网络或能够访问专用/公共注册表。
  • 如果是 AWS EKS 集群,则需要启用自动将 ip 分配给运行 EC2 的子网。

要获取存储在需要凭据的注册表上的映像,您需要创建一种称为imagePullSecrets的特殊类型的密钥。

kubectl create secret docker-registry regsecret --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

然后创建指定imagePullSecrets字段的 Pod

apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regsecret

正如我在对原始帖子的评论中提到的,我遇到了同样的问题。唯一值得注意的是minikube在创建时就已经上升了。我重新启动了底层 VM,映像拉取开始工作。

这似乎是很老的问题,但我有类似的问题,并通过登录您的 docker 帐户解决了。

您可以通过删除现有的失败 pod,触发"docker login"命令(登录到您的 acc)来尝试它,然后重试创建 pod。

最新更新