起因:
Studio调试,kubelet根据镜像回收策略,当大于80%硬盘空间时,会自动删除没有在用的镜像。而一般服务的镜像都是在running的所以并不会删除,而一些测试和训练的镜像就不会一直在使用,所以有很大概率会被删除。而最终导致训练测试的ImagePullERROR
解决方法:
- 删除原先所在/目录下的文件,而保证80%以下的硬盘存储量。这方法得找到不需要的大文件删除,并且还得保持一直在这个容量以下。稍有不慎达到80就会自动删除
- 扩大自动删除的标准,从80扩大到100这样。
从理论上来说第二种更好弄,只要设置下参数就可以达到效果。所以就有了这篇文章
解决:
首先从k8s官网获得有用信息user-configuration,镜像垃圾回收可以通过kubelet的命令行参数来设置
问题:k3s怎么设置kubelet的启动命令行参数呢?
因为对k3s不熟悉,只知道k8s可以通过更改配置yaml达到动态加载参数的效果
其实看到这里kubelet的yaml也没在这里,所以这条路是行不通的。
不过k3s也是有相同功能的,将yaml文件放入到/var/lib/rancher/k3s/server/manifests里就能实现自动kubectl apply的功能
研读官方文档,查找k3s架构,two hours later...
然后找到一篇文章关于架构方面的讲解。里面很大一部分将k3s比起k8s省略了些什么东西,添加了些什么这些都是官网或者github上都有描述的东西,最有价值的是
这里可以看到k3s Agent才是运行kubelet启动pod的关键。
然后就是官网找配置K3s Agent的地方,功夫不负有心人agent-config 这不是满满的设置吗?
使用k3s agent --help查看到
这里可以设置 kubelet的参数
然后就是拼接参数的尝试
k3s agent --kubelet-arg image-gc-high-threshold
不对,少token,那怎么获得token呢?
k3s-github 里的quick start介绍有说,worker nodes怎么加入集群,那时候有token的位置在/var/lib/rancher/k3s/server/node-token
然后加上token
k3s agent --kubelet-arg image-gc-high-threshold --token K10f362021ccf675051108b452f4ec39a5c49e4a309d996f383162b3364eaef575a::server:0c51ee658a7acaf5f8e2b73ddfedc087
还是不对需要加上server
k3s agent --kubelet-arg image-gc-high-threshold --token K10f362021ccf675051108b452f4ec39a5c49e4a309d996f383162b3364eaef575a::server:0c51ee658a7acaf5f8e2b73ddfedc087 --server 127.0.0.1
从这issues,发现需要server的格式
从cat /etc/rancher/k3s/k3s.yaml
加上
k3s agent --kubelet-arg image-gc-high-threshold --token K10f362021ccf675051108b452f4ec39a5c49e4a309d996f383162b3364eaef575a::server:0c51ee658a7acaf5f8e2b73ddfedc087 --server https://127.0.0.1:6443
最后报错信息:strconv.ParseInt: parsing "true"
golang中字符串转换成int类型失败,转换的是true
的确赋值为true
然后发现提示信息中说是int32类型,然后是[0-100]的值,100为禁用镜像回收
尝试
k3s agent --kubelet-arg image-gc-high-threshold=95 --token K10f362021ccf675051108b452f4ec39a5c49e4a309d996f383162b3364eaef575a::server:0c51ee658a7acaf5f8e2b73ddfedc087 --server https://127.0.0.1:6443
这最后好像报了挺多的问题,也不知道成功没有?
测试
emmmm,失败了,还是会删除镜像,这是为什么?
这一看就是k3s agent 是重新起了个agent,而服务器是需要restart或者reload这个 agent就可以了
那前面做的都没有用了吗?
是的没有用了
回想下,添加启动参数可以用什么?systemctl就可以实现啊
可是并没有k3s-agent.service,我需要怎么添加呢?
再看github中安装示例,当只有一个节点的时候或者是主节点的时候是没有agent的,只需要启动server就行了,那就是只需要在server里添加吗?
使用k3s server --help ,发现是有kubelet的选项的
那完事!
systemctl daemon-reload
systemctl restart k3s.service
真的完事了吗?怎么又删除镜像了啊???
观察训练时的磁盘占用量在不停的增加。
想到local-path-positioner 的挂载,之前在/var/lib下,也就和根目录为相同空间,而临时生成的pvc占据了大量空间,而将移至/data1下