关于k8s的pod不断重启的原因分析

Kubernetes(k8s)是一个开源的容器集群管理系统,提供全方位的分布式系统解决方案。文章讨论了k8s的集群管理能力,包括重启策略(Always,OnFailure,Never)和健康检查(livenessProbe,readinessProbe,startupProbe)。针对pod频繁重启的问题,提出了通过检查日志和调整重启策略来定位和解决的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

k8s是什么

k8s全称:Kubernetes

1、k8s是什么

Kubernetes 是一个全新的基于容器技术的分布式架构解决方案,是 Google 开源的一个容器集群管理系统,Kubernetes 简称 K8S。

Kubernetes 是一个一站式的完备的分布式系统开发和支撑平台,更是一个开放平台,对现有的编程语言、编程框架、中间件没有任何侵入性。

Kubernetes 提供了完善的管理工具,这些工具涵盖了开发、部署测试、运维监控在内的各个环节。

Kubernetes 具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制、多粒度的资源配额管理能力。

Kubernetes 官方文档:Kubernetes

 2、k8s发布之后,pod一直在重启原因分析

 现象:running的pod,短时间内重启次数太多

 如图,3天内已经重启了八百多次,一直就是在running和crashloopbackoff之间反复横跳

  定位问题方法:查看pod日志

kubectl get event                           #查看当前环境一个小时内的日志
kubectl describe pod pod_name               #查看当前pod的日志    
 
kubectl  logs -f  pod_name --previous       #查看重启之前的那一次pod的日志,从那一刻开始计算
 
###############
一般用以上的三个命令就行

 在日志中可以清晰的看到整个pod的生命周期,从pull到kill,翻到最上面可以看到kill掉的原因

 如果修改了配置文件,需要delete  -f  ???.yaml,再apply -f ???.yaml

 修改的哪个,就delete掉哪个,然后apply

kubectl delete -f ???.yaml
 kubectl apply -f ???.yaml

 附:

k8s中pod的

重启策略


pod中一共有以下三个重启策略(restartPolicy)
1、Always:当容器终止退出后,总是重启容器,默认策略。
2、OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。 
3、Never:当容器终止退出,从不重启容器。
三种重启策略中,Always是默认策略,即当用户在配置文件中未配置关于重启的策略,则默认为Always.

kubectl get pods pod1 -o yaml l grep restartPolicy
执行以上命令即可看到当前环境配置的重启策略

几种策略也按实际情况修改,即常驻容器肯定采用Always,例如nginx与mysql等

而一些预期终止的程序

  1、失败重新执行,例如定时任务,则适用于OnFailure

  2、失败不重新执行,例如一次性任务Never

 健康检查:
       健康检查是在pod中,可能容器进程存在,pod状态也为runing,但容器内部无法提供服务了(可能是因为堆内存溢出等)这种k8s自身无法判断,需要用户来提供检查方式从情况下使用的
健康检查类型
 1、livenessProbe(存活检查):如果检查失败,将杀死容器,根据Pod 的restartPolicy来操作。
 2、readinessProbe(就绪检查):如果检查失败,Kubernetes会把 Pod从service endpoints中剔除。(可以理解为提出k8s的负载均衡)
 3、startupProbe(启动检查):检查成功才由存活检查接手,用于保护 慢启动容器
支持的检查方法:
 • httpGet:发送HTTP请求,返回200-400范围状态码为成功。
 • exec:执行Shell命令返回状态码是0为成功。
 • tcpSocket:发起TCP Socket建立成功。


3、导出日志

docker导出日志

docker logs ${docker id} > ${导出的文件名}

k8s导出节点日志

kubectl logs ${pod_id} > ${导出日志的文件名}
例
kubectl logs xxx > xxx.txt

pod_id查看命令
kubectl get pod
kubectl get pod | grep xxx

4、删除某个pod节点

kubectl delete pod ${pod_id}  --force --grace-period=0 -n default

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值