LLLeon / Blog

LLLeon 的部落格
15 stars 4 forks source link

解决虚拟机无法下载 k8s.gcr.io 镜像的问题 #22

Open LLLeon opened 3 years ago

LLLeon commented 3 years ago

解决虚拟机无法下载 k8s.gcr.io 镜像的问题

背景

两种方式:

环境:

问题:

在虚拟机上安装 ingress-nginx-controller 时,状态一直是 ImagePullBackOff。

查看该 Pod 用到的镜像:

> kubectl get pod ingress-nginx-controller-67897c9494-zjf9r -n ingress-nginx -o yaml | grep image
docker pull k8s.gcr.io/ingress-nginx/controller:v0.44.0@sha256:3dd0fac48073beaca2d67a78c746c7593f9c575168a17139a9955a82c63c4b9a

1. 方法一

在宿主机下载好镜像,依次保存,上传到虚拟机,加载,一通操作后发现加载好的镜像的 REPOSITORY 和 TAG 都是 none,这还行?查了下发现是因为 save 镜像时是使用的 docker save <image id> 命令,它会清除 REPOSITORY 和 TAG 的值,改为使用 docker save <repo>:<tag> 即可。

错误示范:

docker save -o 435df390f367 ingress-nginx-controller.tar

以下是没问题的操作。

1.1. 宿主机下载镜像

宿主机有梯子的话,这步应该没什么问题,直接 pull 即可。

docker pull k8s.gcr.io/ingress-nginx/controller:v0.44.0@sha256:3dd0fac48073beaca2d67a78c746c7593f9c575168a17139a9955a82c63c4b9a

不过下载好后的镜像没有 tag,又打了个 tag:

docker tag 435df390f367 k8s.gcr.io/ingress-nginx/controller:v0.44.0

1.2. 保存镜像

保存镜像:

docker save -o ingress-nginx-controller.tar k8s.gcr.io/ingress-nginx/controller:v0.44.0

1.3. 上传、加载镜像

上传镜像:

scp ingress-nginx-controller.tar root@10.0.0.6:/root/workspace

加载镜像:

docker load -i ingress-nginx-controller.tar

查看 Docker 镜像,一切正常。

注意:别忘了每个节点上都要上传镜像。

1.4. 查看 Kubernetes 运行情况

查看 Pod ingress-nginx-controller 的状态,依然是 ImagePullBackOff...

镜像的 TAG 也和之前查看的结果一致,都是 v0.44.0。难道是后面的 sha256 值不一样?

查看虚拟机里面镜像 k8s.gcr.io/ingress-nginx/controller 的 sha256 值:

docker inspect 435df390f367

果然和最开始查到的不一致。

修改 Deployment ingress-nginx-controller 用到的镜像,删除镜像后面的 sha256 值:

kubectl edit deployment ingress-nginx-controller -n ingress-nginx

现在再查看 Pod 状态,已经开始正常运行了。

2. 方式二

前提:

在执行docker pull时,是由守护进程dockerd来执行。因此,代理需要配在dockerd的环境中。而这个环境,则是受systemd所管控,因此实际是systemd的配置。

创建如下文件:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

在 proxy.conf 中添加以下内容:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"

重载 systemd 并重启 dockerd

sudo systemctl daemon-reload
sudo systemctl restart docker

测试效果:

> docker pull k8s.gcr.io/kube-proxy:v1.19.2
> docker images

验证有效。