kubectl无法连接到docker注册表以下载图像

时间:2018-01-24 18:45:53

标签: docker kubernetes centos7

我踩过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

我不明白为什么这会失败。

更新

根据第一个答案和我从other question获得的信息,我编辑了服务帐户的描述,添加了&#34; imagePullSecrets&#34;键,然后我再次删除了replicationcontroller并重新创建它。结果似乎是相同的。

这是我用来创建秘密的命令:

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

然后我获取了serviceaccount的yaml,添加了秘密的密钥引用,然后将yaml设置为serviceaccount的设置。

这是服务帐户的当前设置:

$ 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

执行此操作后,来自pod描述的更新事件列表:

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)

最后一行似乎是此时最重要的信息。它没有失败的身份验证,它超时连接。根据我的经验,这样的事情通常是由通过防火墙/代理的问题引起的。我们有一个内部代理,我在我的环境中设置了那些环境变量,但是&#34; serviceaccount&#34;那个kubectl用来建立这个连接?我是否必须以某种方式在serviceaccount描述中设置代理配置?

5 个答案:

答案 0 :(得分:1)

您需要确保在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

答案 1 :(得分:0)

要获取存储在需要凭据的注册表中的图像,you need to create a special type of secret称为 private ObservableCollection<Customer> m_CustomerDataCollection = new ObservableCollection<Customer>(); public ObservableCollection<CustomerAlcove> CustomerDataCollection { get => m_CustomerDataCollection; private set => Set(ref m_CustomerDataCollection, value); } private Customer m_CustomerItemSelected = new Customer(); public Customer CustomerItemSelected { get => m_CustomerItemSelected; private set => Set(ref m_CustomerItemSelected, value); }

imagePullSecrets

然后创建指定kubectl create secret docker-registry regsecret --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> 字段

的Pod
imagePullSecrets

答案 2 :(得分:0)

正如我对原始帖子的评论中所述,我遇到了同样的问题。唯一需要注意的是minikube在创建时就建立了。我重新启动了基础虚拟机,并且镜像请求开始工作。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

先描述POD(kubectl describe pod ),

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

<块引用>

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

解决方案:

  • 如果是本地K8s,需要先登录docker registry OR
  • 如果是云上的 Kubernetes 集群,请为 Registry 创建 secret 并添加 imagepullsecret 连同秘密名称

2.如果出现超时错误,

<块引用>

错误: Get https://registry-1.docker.io/v2/: net/http: 请求在等待连接时被取消(Client.Timeout exceeded while 等待标题)

解决方案:

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