kubeadm init 报错:failed to pull image “k8s.gcr.io/kube-apiserver:v1.20.15“: output: Error response fr

问题
由于国内网络原因,kubeadm init会卡住不动,一卡就是半个小时,然后报出这种问题:
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.18.5: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

完整的错误日志如下:

原因显而易见,是因为要下载k8s.gcr.io的docker镜像,但是国内连不上https://k8s.gcr.io/v2/。

还有其它问题参考使用VMware虚拟机搭建Kubernetes的Master和Worker节点 最全教程(1)准备工作_使用提供的虚拟机和软件包,搭建kubernetes平台,平台的两个节点分别为master和node-CSDN博客。接下来进入正题:

解决方法

使用阿里云镜像

运行kubeadm init时加上阿里云镜像的参数--image-repository=registry.aliyuncs.com/google_containers,如下:(版本改为自己需要的)

kubeadm init --kubernetes-version=1.20.15 --apiserver-advertise-address=192.168.32.242 --pod-network-cidr=192.168.32.242/24 --image-repository=registry.aliyuncs.com/google_containers

如果还有问题,那可以用下面这个比较复杂的方法

从DockerHub的其它仓库拉取
网上搜了半天,很多人说从别的仓库一个一个拉取再改名,但是这些教程仓库名称不一,有的教程已经很老了,仓库很多年没更新,这里直接授之以渔,自己学怎么找仓库。
并且一个一个拉取改名太累了,可以写个脚本。

过程如下:

首先使用下面的命令获取需要的docker镜像名称:

kubeadm config images list

 

注意:新版本的coredns改名了,变成了coredns/coredns,需要特殊处理,不放在脚本中

首先要看看该在哪个地方拉取,可以去docker hub搜一搜哪里有kube-proxy之类的组件
进入dockerhub搜索:
https://hub.docker.com/search?q=kube-proxy&type=image
按照最近更新排序,结果如下,可以发现一个下载次数10k+,更新也很频繁的仓库:

 然后开始编写脚本:

vim pull_k8s_images.sh

set -o errexit
set -o nounset
set -o pipefail

##这里定义版本,按照上面得到的列表自己改一下版本号

KUBE_VERSION=v1.22.15
KUBE_PAUSE_VERSION=3.5
ETCD_VERSION=3.5.0-0
# DNS_VERSION=1.8.4 # coredns需要特殊处理

##这是原始仓库名,最后需要改名成这个
GCR_URL=k8s.gcr.io

##这里就是写你要使用的仓库
DOCKERHUB_URL=gotok8s

##这里是镜像列表,新版本要把coredns需要特殊处理
images=(
kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
# coredns:${DNS_VERSION} # coredns需要特殊处理
)

##这里是拉取和改名的循环语句
for imageName in ${images[@]} ; do
  docker pull $DOCKERHUB_URL/$imageName
  docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
  docker rmi $DOCKERHUB_URL/$imageName
done

然后授予执行权限

chmod +x ./pull_k8s_images.sh


执行:

 ./pull_k8s_images.sh

然后要处理coredns,这个其实很好下载,直接拉取coredns/coredns,使用命令:(注意调成自己需要的版本)

docker pull coredns/coredns:1.8.4

然后改名:

docker tag coredns/coredns:1.8.4 k8s.gcr.io/coredns/coredns:1.8.4
 

这就完成了。

如果还有镜像没有拉取下来,比如我第一次用的不是gotok8s仓库,而是另一个仓库,但是它里面并没有最新的etcd,所以这个没有拉取下来,那就再去找一些仓库,直接搜索etcd,进入仓库后点击Tag,看是不是有你需要的版本,如下图:

如果有,假如这个仓库叫kubelibrary,然后使用vim命令再新建一个可执行文件。

vim pull_k8s_images2.sh
 

set -o errexit
set -o nounset
set -o pipefail

## 这里只需要留下还需要下载的组件的版本号
ETCD_VERSION=3.5.0-0

GCR_URL=k8s.gcr.io
## 这里写新的仓库地址
DOCKERHUB_URL=kubelibrary

## 这里也只留下需要下载的镜像
images=(
etcd:${ETCD_VERSION}
)

for imageName in ${images[@]} ; do
  docker pull $DOCKERHUB_URL/$imageName
  docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
  docker rmi $DOCKERHUB_URL/$imageName
done

然后授予执行权限

chmod +x ./pull_k8s_images2.sh

执行:

./pull_k8s_images2.sh

这下就应该没问题了

结果

再进行kubeadm init,这次没有任何问题

查看: 

 Kubernetes k8s拉取镜像失败最简单最快最完美解决方法 [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver-CSDN博客

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.22.17: output: Error response from daemon: Ge t "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager:v1.22.17: output: Error response from d aemon: Get "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-scheduler:v1.22.17: output: Error response from daemon: Ge t "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-proxy:v1.22.17: output: Error response from daemon: Get "h ttps://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/pause:3.5: output: Error response from daemon: Get "https://k8s .gcr.io/v2/": context deadline exceeded, error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/etcd:3.5.0-0: output: Error response from daemon: Get "https:// k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns/coredns:v1.8.4: output: Error response from daemon: Get "https://k8s.gcr.io/v2/": context deadline exceeded, error: exit status 1 [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher
07-12
这个错误是由于在安装 Kubernetes 期间无法拉取所需的镜像引起的。它表明在尝试从 k8s.gcr.io 拉取镜像时出现了连接超时的问题。 这个问题可能是由于网络连接问题、防火墙设置或者代理配置引起的。以下是一些解决该问题的常见步骤: 1. 确保您的网络连接正常,尝试通过浏览器访问 `https://k8s.gcr.io/v2/` 确认是否可以访问。 2. 如果您使用了代理,请确保已正确配置 Docker 的代理设置。您可以通过编辑 `/etc/systemd/system/docker.service.d/http-proxy.conf`(如果不存在则创建它)文件来设置代理。例如,如果您使用 HTTP 代理,可以添加以下内容: ``` [Service] Environment="HTTP_PROXY=http://proxy.example.com:8080/" Environment="HTTPS_PROXY=http://proxy.example.com:8080/" ``` 3. 如果您在防火墙后面,确保防火墙允许 Docker 访问所需的资源。您可以尝试临时禁用防火墙并重新运行安装命令,以验证是否与防火墙有关。 4. 如果您使用的是私有网络或内部网络,请确保您的网络环境正确配置,以允许 Docker 访问所需的资源。 5. 您还可以尝试使用其他镜像源或加速器来拉取所需的镜像。例如,您可以使用阿里云容器镜像服务(https://cr.console.aliyun.com/)或其他可靠的镜像源。 尝试上述步骤后,如果问题仍然存在,请确保您的环境满足 Kubernetes 的最低要求,并尝试在不同的网络环境下重新运行安装命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值