kubernetes(1.28)配置flannel:kubelet无法拉取镜像(NotReady ImagePullBackOff)同时解决k8s配置harbor私人镜像仓库问题

文章讲述了在部署Kubernetes1.28集群时遇到的Flannel镜像拉取问题,由于国内访问国外镜像源受限,作者提供了两种解决方案:一是通过国内镜像离线导入,二是为集群配置harbor镜像仓库。后者更推荐,以简化节点操作并支持长期维护。
摘要由CSDN通过智能技术生成

给kubernetes1.28集群配置网络,使用Flannel。但是运行相应kube-flannel.yml无法拉去镜像,导致flannel配置失败。

528ceb9722a040cb81cc4647f26ef956.png

使用

kubectl describe pod kube-flannel-ds-f8gxl -n kube-flannel

查看pod信息,结果如下:

73db3162e90c4c0397f25d56775ab0d0.png

kube-flannel.yml来源:GitHub - flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes

原因自然是国内无法直接连接国外镜像源,直接下载。

解决思路

找到国内对应的镜像源,替换yml文件的镜像地址。或者是找到相应的镜像离线压缩包资源,导入集群镜像仓库。因为我找了好久都没找到国内的镜像地址(如果有找到的,可以教教我,评论区告诉我-_-)。所以我使用的是第二种方式,找到相应的镜像离线压缩包。

解决方法一:

通过DockerHub离线下载网网址(网址若是失效,可以查看本人的资源列表,压缩包已经上传),下载下面两个包:

flannel/flannel:v0.25.1
flannel/flannel-cni-plugin:v1.4.0-flannel1

得到这两个tar.gz文件。将文件上传到master节点。接着进行如下操作:

1.1使用docker工具,将两者导入为本地镜像

docker load --input /path/to/tar

7c5b4df4482f4e918adc01c750c232b7.png

但是,在1.24之后的版本之后kubelet 彻底移除了dockershim,改为默认使用Containerd。在本地有docker镜像,yml修改为本地配置镜像地址,也无法使用这一镜像。还需要继续操作。

1.2将docker镜像save为tar(因为ctr无法直接import这两个镜像压缩包,只好借助docker转一手)

#docker -o tar压缩包名要保存的路径 本地镜像
docker save -o flannel-flannel-cni-plugin-v1.4.1-flannel1-amd64.tar flannel/flannel-cni-plugin:v1.4.1-flannel1
docker save -o flannel-flannel-v0.25.1-amd64.tar flannel/flannel:v0.25.1

操作成功,在当前文件夹下能看到这两个tar文件。

1.3将tar镜像压缩包,导入到containerd的k8s.io命名空间中

#-n后面加命名空间名称
ctr -n k8s.io images import flannel-flannel-v0.25.1-amd64.tar
ctr -n k8s.io images import flannel-flannel-cni-plugin-v1.4.1-flannel1-amd64.tar

操作成功,显示如下:

5e37e40a104b4a0484747d3af3b61ef2.png

查看k8s.io下面是否有flannel的镜像文件

40f21a89fadd4c378ff451c379e8e92f.png

注:Kubernetes 下使用的 containerd 默认命名空间是k8s.io,只有导入这个命名空间,kubelet才能从本地拉取这个镜像文件。本文kubernetes集群是1.28的,所以不再是默认地从本地docker镜像里获取镜像,而是从containerd的本地镜像里面获取。如果是1.24之前的版本,默认仍是docker,那么1.2以及1.3的操作是不需要的,kubelet能直接拉取本地docker镜像。

1.4修改kube-flanne.yml

将开头提及的kube-flannel.yml下载到本地后,修改所有image键值对,并添加镜像拉取策略。修改内容如下:

(vim进入后,:set number)

69900e61c90748c794e056a45a135d57.png

bbf43e2767ef458599edf8ebbd87d9ef.png

e36fefc84c2b4d71a5b6b293413c250c.png

:wq保存退出。

1.5在每一个工作节点也需要将tar上传,并导入到containerd的本地镜像,不然分派到工作节点的pod无法获得初始化的镜像

1.6删除集群内的相关资源,重新运行kube-flannel.yml文件

#删除资源
kubectl delete -f kube-flannel.yml
#重新运行
kubectl apply -f kube-flannel.yml

发现pod能够正常拉取镜像

a5c99752cd2947678ba0a38f38ce5e9b.png

弊端:这种方法虽然能够解决问题,但是针对每一个节点,都需要导入本地镜像十分麻烦,个人建议为k8s集群搭建相应的私人镜像仓库,将镜像文件上传到镜像仓库,kubelet从镜像仓库拉取更为合理,见解决办法二。

解决办法二:k8s1.28,为集群配置harbor镜像仓库,上传镜像,从仓库拉取相关镜像

针对1.24之前的版本,网上有许多配置harbor镜像仓库的办法,重点是/etc/docker/daemon.json文件,这里不再赘述。

1.24之后 kubelet 彻底移除dockershim,改为默认Containerd。containerd 不能像docker一样 “docker login 私人镜像仓库地址” 登录到镜像仓库,即便是本地docker登录harbor ,集群仍是无法从harbor拉取到镜像。这里需要修改配置文件。

本文的containerd为1.6,按照网上常规的修改/etc/containerd/config.toml文件的方式不再被推荐。

9206fc78c44e47088c60125373a3439a.png

参考官方文档——containerd/docs/cri/config.md at main · containerd/containerd · GitHub

配置相应的hosts.toml,为集群设置Harbor镜像仓库

步骤如下(2.1-2.4操作每一台机器都要进行!!!):

2.1修改/etc/containerd/config.toml

2d1e372436e245a9a8bb2851585ba2c5.png

2.2自定义证书

绕过TLS验证(containerd/docs/hosts.md at main · containerd/containerd · GitHub)

#创建文件目录 IP和端口替换为你的私人镜像仓库的IP以及对外开放的端口
mkdir -p /etc/containerd/certs.d/192.168.12.34:5000
#创建-打开hosts.toml
vi /etc/containerd/certs.d/192.168.12.34:5000/hosts.toml

#想hosts.toml中写入以下内容 IP和端口和前面一样进行替换
server = "http://192.168.12.34:5000"

[host."192.168.12.34:5000"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true

2.3重新启动containerd

systemctl daemon-reload
systemctl restart containerd

2.4完成上述操作,可能crictl以及集群yml文件仍然无法正常从私人镜像仓库拉取镜像

可能报错如下:

c467dd8961de4bca9d1f19361c34841b.png

解决操作:

vim /etc/crictl.yaml

将runtime以及image endpoint均替换为"unix:///run/containerd/containerd.sock"72ce72e0393a4069af8c365495c4a030.png

 :wq保存退出

2.5测试将镜像推送至harbor

使用docker上传(传统操作)

docker tag flannel/flannel-cni-plugin:v1.4.1-flannel1 IP:PORT/flannel/flannel-cni-plugin:v1.4.1-flannel1
docker push IP:PORT/flannel/flannel-cni-plugin:v1.4.1-flannel1

另一个镜像也是相同操作(如果报错,可能是需要先在harbor上创建一个flannel的project)。

2.6修改kube-flannel.yml文件

7c167cbe9cff49bea98e03ff44d44d90.png

:wq保存退出。重新删除并运行kube-flannel.yml发现成功拉取镜像(可以通过kubectl describe详查pod)。

ddfb2dd4822d47738f129b1c6ef119f4.png

总结

方法二比方法一更为正式,毕竟配置集群总该要配置私人镜像,省去了每一个节点导入镜像的操作。要是还未配置私人镜像仓库,使用方法一也可行。

其余知识点:/etc/containerd/config.toml配置文件对ctr不生效,这个配置文件由CRI使用,即对crictl生效。

如果你的ctr images pull总是报错: http: server gave HTTP response to HTTPS client。可能这并不是你的配置出错,而是你需要在后面pull操作后加上--plain-http参数。表示你当前client与镜像仓库之间接受http形式的通信。或者是使用自定义的hosts-dir来指定配置文件。

ctr images pull IP:PORT/library/service:v1.0.0 --plain-http
ctr images pull IP:PORT/library/service:v1.0.0 --hosts-dir "/etc/containerd/certs.d"

参考

containerd/docs/hosts.md at main · containerd/containerd · GitHub

containerd/docs/cri/config.md at main · containerd/containerd · GitHub

containerd添加私有镜像仓库_containerd 修改非安全镜像仓库地址-CSDN博客

flannel:v0.11.0-amd64是一个用于容器网络的镜像,可以用于在容器化环境中创建和管理虚拟网络。 使用flannel:v0.11.0-amd64镜像,首先需要在支持Docker的操作系统上安装Docker引擎。然后,可以使用Docker命令行或Docker Compose等工具来部署flannel镜像。 具体操作步骤如下: 1. 下载安装Docker:根据操作系统类型,在官方网站上下载最新版本的Docker引擎,并按照官方文档进行安装。 2. 部署flannel镜像:使用以下命令将flannel:v0.11.0-amd64镜像部署到Docker中: ``` docker run -d --net=host --privileged -v /dev/net:/dev/net quay.io/coreos/flannel:v0.11.0-amd64 /opt/bin/flanneld --ip-masq --kube-subnet-mgr ``` 解释一下上述命令: "docke run"是运行容器的命令,"-d"表示以守护进程方式运行,"--net=host"表示与主机共享网络命名空间,"--privileged"是为了启用容器内部的特权模式,"-v /dev/net:/dev/net"用于将主机网络设备挂载到容器中。 3. 验证部署:使用以下命令验证flannel是否成功部署: ``` docker ps -a ``` 如果flannel容器处于运行状态,即表示部署成功。 4. 配置flannel网络:根据具体的需求,可以通过修改配置文件或环境变量来配置flannel网络。可以在文档或官方GitHub页面上查找相关的配置说明。 总结:通过以上步骤,就可以使用flannel:v0.11.0-amd64镜像来创建和管理容器网络。需要注意的是,此版本的flannel可能会有更新,建议查看官方文档和GitHub页面以获取最新版本的说明和操作指南。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新停浊酒杯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值