K3S镜像被驱逐案例
0. 背景
当磁盘空间不够时,K3S会驱逐镜像,此时pod重启时就无法获取镜像、启动异常。
通过df -Th|head命令可确认空间不足;通过kubectl describe pod 命令可确认大量pod启动时无法获取镜像。
此时请确保当前系统盘磁盘空间至少剩余15%,如果没有则先扩容或清理其他文件,然后按如下方法顺序逐一尝试:
方法1:镜像仓服务5000端口访问失败,重启镜像仓
故障现象:kubectl -n ones describe pod xxxxxx 提示:dial tcp 127.0.0.1:5000: connect: connection refused。
验证方式:curl 127.0.0.1:5000 不通
处理方法: (1) 参考修改内核参数 核对相关参数是否一致; 如果不一致,请修改。
(2) 重启coredns和镜像仓代理服务
kubectl -n kube-system delete pod -l app=registry-proxy
kubectl -n kube-system delete pod -l app=registry
kubectl -n kube-system delete pod -l k8s-app=kube-dns
方法2:镜像重新推送
#获取安装包路径
path=`kubectl -n ones-installer describe deploy installer-api | grep -iE "Path:" | head -1 | awk '{print $2}' | awk -F'/pkg' '{print $1}'`
pod=`kubectl -n ones-installer get pod -l "app=installer-api" -o jsonpath='{.items[0].metadata.name}'`
version=`kubectl exec -n ones-installer -it $pod -c installer-api -- bash -c "make get_value KEY=onesVersion"`
#进入安装包路径
#1、导入基础镜像
cd $path/registry/v2.6.2-14-ga66a4c3
tar -zxvf registry_images.tar.gz
cat registry_images.tar | k3s ctr image import --no-unpack -
#2、导入业务镜像
ONES_AI_K8S_VERSION=`cd $path/pkg && ls -t |grep k8s | head -1`
PKG_DIR=`cd $path/pkg/upgrade && ls -t | head -1`
kubectl -n ones-installer -c installer-api exec $pod -- sh -ec "cd /data/ones/pkg/${ONES_AI_K8S_VERSION}; make import-images OFFLINE_PKG_DIR=${PKG_DIR} FILE=${PKG_DIR}/images/images.yaml"
方法3:单独推送dnsmasq镜像
故障现象:kubectl -n ones describe pod xxxxxx 提示: OCI runtime create failed: runc create failed: unable to start container process: exec: "--listen": executable file not found in $PATH: unkno
说明: 无法启动的 pod 都是卡在 go-dnsmasq 镜像获取过程,go-dnsmasq 镜像经过驱逐后出了问题。重新导入一下镜像就好
ctr images pull img.ones.pro/library/janeczku/go-dnsmasq:release-1.0.7
crictl rmi localhost:5000/ones/janeczku/go-dnsmasq:release-1.0.7
k3s ctr images tag img.ones.pro/library/janeczku/go-dnsmasq:release-1.0.7 localhost:5000/ones/janeczku/go-dnsmasq:release-1.0.7
k3s ctr image push img.ones.pro/library/janeczku/go-dnsmasq:release-1.0.7 --plain-http
验证
上述方法处理完成后,请重启无法启动的pod,然后验证业务是否正常
#查看命令如下
kubectl get pod -A|grep -iv running
#重启命令如下,其他namespace下的pod请单独处理
kubectl -n ones get pods | grep -iv runing | awk '{print $1}' | xargs kubectl -n ones delete pod