容器化开发_03_Pod报错不断重启

Posted 毛奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器化开发_03_Pod报错不断重启相关的知识,希望对你有一定的参考价值。

文章目录

Pod不断重启三种原因

有三种原因:
(1) 程序有问题,程序没启动成功,所以容器无法启动,但是k8s中的Pod默认restartPolicy重启策略是always,所以不断重启
(2) 程序占用内存太大,linux机器无法满足,但是k8s中的Pod默认restartPolicy重启策略是always,所以Pod不断重启,这种情况下还会导致linux机器不断重启
(3) 没有程序或者程序无法常驻运行,所以容器停止了,但是k8s中的Pod默认restartPolicy重启策略是always,所以不断重启

三种原因特定标志:
(1) Crash状态的时候,能够通过 docker logs 看到日志
(2) linux上执行 last reboot 发现机器没间隔几分钟不断重启
(3) kubectl describe pod 最后一行为 Warning Back-off restarting failed container

问题1:程序有问题,启动不成功,导致Pod不断重启

特定标志:Crash状态的时候,能够通过 docker logs 看到日志

归纳出问题:根据这个特定标志,可以断定是因为程序有问题,程序没启动成功,所以容器无法启动,但是k8s中的Pod默认restartPolicy重启策略是always,所以不断重启

解决方法:如果是程序有问题,那么等到Pod的状态是 Crash 的时候,docker logs xxx(pod-name) -n xxx(ns-name) 查看日志,定位到程序的问题,然后解决,方为治本之策

注意:等到Pod的状态是 Crash 的时候,使用 docker logs 才能看到错误日志,如果Pod的状态是Running的时候,使用 docker logs 是看不到错误日志的。因为 k8s中的Pod默认restartPolicy重启策略是always ,所以 Running 和 Crash 状态交替,等到 Crash 才使用 docker logs 找出错误日志不是难事。

问题2:程序占用内存太大,linux机器无法满足,导致Pod不断重启

特定标志:linux上执行 last reboot 发现机器没间隔几分钟不断重启

归纳出问题:程序占用内存太大,linux机器无法满足,但是k8s中的Pod默认restartPolicy重启策略是always,所以Pod不断重启,这种情况下还会导致linux机器不断重启

解决方法:通过yaml中的 command: 限制一下需要的内存占用量

问题3:程序中没有前台进程,导致Pod不断重启

现象描述:kubectl get pod 看到 pod启动后一直重启,kubectl describe pod 最后一行看到 Back-off restarting failed container。

kubectl get pod -n xxx(ns-name)
发现pod restart列,就是重启次数很多

kubectl describe pod xxx(pod-name) -n xxx(ns-name)
describe命令得到的最下面的报错信息是 BACK-OFF RESTARTING FAILED CONTAINER

特定标志:kubectl describe pod 最后一行为 Warning Back-off restarting failed container

本质原因:Back-off restarting failed container的Warning事件,一般是由于通过指定的镜像启动容器后,容器内部没有常驻进程,导致容器启动成功后即退出,从而进行了持续的重启。

归纳出问题: 没有程序或者程序无法常驻运行,所以容器停止了,但是k8s中的Pod默认restartPolicy重启策略是always,所以不断重启

解决方法:找到对应的deployment command: [“/bin/bash”, “-ce”, “tail -f /dev/null”]

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-file
  namespace: model
  labels:
    appkey: test-file
spec:
  replicas: 1
  selector:
    matchLabels:
      appkey: test-file
  template:
    metadata:
      labels:
        appkey: test-file
    spec:
      containers:
        - name: test-file
          image: xxx:v1
          command: ["/bin/bash", "-ce", "tail -f /dev/null"]
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - name: test-file-data
            mountPath: /mnt
      volumes:
        - name: test-file-data
          hostPath: 
            path: /mnt

以上是关于容器化开发_03_Pod报错不断重启的主要内容,如果未能解决你的问题,请参考以下文章

KUBERNETES03_命名空间Pod是什么Deployment多副本能力扩缩容自愈或故障转移滚动更新版本回退

KUBERNETES03_命名空间Pod是什么Deployment多副本能力扩缩容自愈或故障转移滚动更新版本回退

pod报错connectionclosedbyuser

容器化开发_02_Docker判断程序是否起来?Docker定位容器错误?

容器化开发_02_Docker判断程序是否起来?Docker定位容器错误?

Pod初始化容器之Init Container