Vagrant VM关机重启后Tiller Pod陷入CrashLoopBackOff故障求助
Hey,我帮你梳理下这个Tiller重启后崩溃的问题,结合你给出的日志细节,咱们一步步来排查解决:
从你提供的Pod描述和事件日志里,能抓到几个关键线索:
- Tiller的Liveness和Readiness探针全部超时(日志里的
request canceled (Client.Timeout exceeded while awaiting headers)) - 首次
vagrant up一切正常,但虚拟机关机重启后就出问题 - 还出现了
Failed create pod sandbox的错误,这大概率和你用的Weave Net网络插件重启后的状态有关
1. 先检查Weave Net网络插件状态
Pod sandbox创建失败通常和CNI网络插件的运行状态直接相关,先确认Weave的Pod是否正常运行:
kubectl get pods -n kube-system -l name=weave-net
如果看到Weave Pod有重启记录或者状态异常,赶紧查看它的日志找问题:
kubectl logs <你的weave-pod名称> -n kube-system -c weave
虚拟机重启后,Weave有时候会因为网络环境变化无法正常恢复,导致后续启动的Pod(比如Tiller)没法获取正常的网络栈,探针自然连不上。
2. 查看Tiller崩溃前的具体日志
探针超时只是表面现象,咱们得看看Tiller容器启动时到底出了啥问题,用这个命令查看上一次崩溃的容器日志:
kubectl logs tiller-deploy-78f96d6f9-cswbm -n kube-system --previous
说不定能找到Tiller启动失败的具体原因,比如无法连接K8s API Server之类的。
3. 验证K8s API Server的可达性
Tiller完全依赖K8s API Server工作,重启虚拟机后API Server可能还没完全就绪,先在虚拟机里直接测试:
curl -k https://localhost:6443/healthz
如果返回ok说明API Server正常,否则得去检查kube-apiserver的Pod状态和日志。
方法1:重启Weave Net网络插件
如果Weave状态确实有问题,先删掉Weave的Pod让它重新创建:
kubectl delete pods -n kube-system -l name=weave-net
等Weave Pod恢复到Running状态后,再删掉Tiller的Pod让它重启:
kubectl delete pod tiller-deploy-78f96d6f9-cswbm -n kube-system
很多时候网络插件恢复后,Tiller就能正常启动了。
方法2:调整Tiller的探针超时配置
默认的探针超时1秒真的太短了,虚拟机重启后系统资源可能比较紧张,Tiller启动慢就会被探针判定为不健康。咱们修改下Tiller的Deployment配置:
kubectl edit deployment tiller-deploy -n kube-system
找到livenessProbe和readinessProbe这两段,把timeoutSeconds改成5,initialDelaySeconds改成10(给Tiller足够的启动缓冲时间):
livenessProbe: httpGet: path: /liveness port: 44135 initialDelaySeconds: 10 timeoutSeconds: 5 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 readinessProbe: httpGet: path: /readiness port: 44135 initialDelaySeconds: 10 timeoutSeconds: 5 periodSeconds: 10 successThreshold: 1 failureThreshold: 3
保存退出后,Deployment会自动更新Tiller Pod,应该就能避免探针超时的问题了。
方法3:重新安装Tiller
如果上面的方法都不管用,那就彻底重置Tiller再重新安装:
helm reset # 如果之前没创建过tiller的服务账号,先执行下面两句 kubectl create serviceaccount tiller -n kube-system kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller # 重新初始化Tiller helm init --service-account tiller --upgrade
方法4:给Vagrant虚拟机加资源
虚拟机内存或CPU不够的话,重启后系统负载高,Tiller启动会特别慢。你可以修改Vagrantfile,给虚拟机分配更多资源:
config.vm.provider "virtualbox" do |v| v.memory = 4096 # 改成4G内存 v.cpus = 2 # 改成2核CPU end
然后执行vagrant reload重启虚拟机,资源充足后Tiller启动会顺畅很多。
这个问题大概率是虚拟机重启后网络插件未正常恢复,或者Tiller的探针配置太苛刻导致的。优先从Weave网络插件排查,再调整探针参数,基本就能解决啦。
内容的提问来源于stack exchange,提问作者Kostas Demiris

