【K8S系列】Pod重启策略及重启可能原因

简介: 【K8S系列】Pod重启策略及重启可能原因

1 重启策略

1.1 Always

Pod中的容器,不管因为什么原因停止,都会自动重启。

该为默认策略,

没有定义重启策略时,默认的就是always

1.2  OnFailure

Pod中的容器,非正常停止/异常退出时,会自动重启容器,如果是正常停止,则不会

1.3 Nerver

Pod中容器不管以什么原因退出,都不会自动重启容器

1.4 yaml示例

其关键字为:restartPolicy

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-test
spec:
  restartPolicy: Always/OnFailure/Nerver # 重启策略,根据需求选择一种即可
  containers:
    - name: nginx-pod-test
      image: nginx

2 Pod常见异常状态

  • Pending状态
  • Waiting/ContainerCreating状态
  • CrashLoopBackOff状态
  • ImagePullBackOff状态
  • Error状态
  • 其他状态说明

2.1  Pending状态

Pending状态:

  1. 说明Pod的YAML文件已提交给Kubernetes
  2. API对象已经被创建并保存在Etcd当中

原因:这个Pod里有些容器因为某种原因而不能被顺利创建

可能原因:

  • 调度不成功
  1. 可以通过命令查看到当前Pod的事件,进而判断为什么没有调度。
kubectl describe pod {podname}
  • 资源不足
  1. 原因:集群内所有的Node都不满足该Pod请求的CPU、内存、GPU等资源
  2. 解决方法:增加资源配置/优化容器资源使用方式
  • HostPort 已被占用
  1. 解决方法:使用Service对外开放服务端口

2.2 Waiting/ContainerCreating状态

首先通过 命令查看当前Pod的事件

kubectl describe pod {podname}

可能的原因有:

  • 镜像拉取失败:比如镜像地址配置错误、拉取不了国外镜像源(gcr.io)、私有镜像密钥配置错误、镜像太大导致拉取超时 (可以适当调整kubelet的-image-pull-progress-deadline和-runtime-request-timeout选项)等。
  • CNI网络错误:检查CNI网络插件的配置,比如:无法配置Pod 网络、无法分配IP地址。
  • 容器无法启动:检查是否打包了正确的镜像或者是否配置了正确的容器参数
  • Failed create pod sandbox:查看kubelet日志,原因可能是磁盘坏道(input/output error)。

2.3 CrashLoopBackOff状态

处于CrashLoopBackOff状态

说明容器曾经启动了,但又异常退出

1.查看容器的日志,查看退出原因

kubectl logs {podname}
kubectl logs --previous {podname}

2.进入容器查看

kubectl exec {mypodname} -c {containername} -it -- bash

3.ssh登录Node查看

2.4 ImagePullBackOff状态

处于ImagePullBackOff状态

原因:是镜像名称配置错误或者私有镜像的密钥配置错误导致

2.5 Error状态

Pod处于Error状态,说明Pod启动过程中发生了错误。

2.6 其他状态说明

CrashLoopBackOff:    #容器退出,kubelet正在将它重启
InvalidImageName:    #无法解析镜像名称
ImageInspectError:   #无法校验镜像
ErrImageNeverPull:   #策略禁止拉取镜像
ImagePullBackOff:    #正在重试拉取
RegistryUnavailable: #连接不到镜像中心
ErrImagePull:        #通用的拉取镜像出错
CreateContainerConfigError: #不能创建kubelet使用的容器配置
CreateContainerError: #创建容器失败
m.internalLifecycle.PreStartContainer #执行hook报错
RunContainerError:   #启动容器失败
PostStartHookError:  #执行hook报错
ContainersNotInitialized: #容器没有初始化完毕
ContainersNotReady:   #容器没有准备完毕
ContainerCreating:    #容器创建中
PodInitializing:pod   #初始化中
DockerDaemonNotReady:  #docker还没有完全启动
NetworkPluginNotReady: #网络插件还没有完全启动
Evicte:     #pod被驱赶

tips:

k8s中不支持重启Pod资源,只有删除重建!重建!

3.自动重启的可能原因:

  1. Xms超出了k8s分配
  2. docker容器的内存限制
  3. 出现OOMKilled事件

3.1  Xms超出了k8s分配

在没有给jvm指定内存大小的情况下,机器物理内存很大时,jvm默认占用的内存Xms超出了k8s分配给pod的内存导致pod内存溢出,从而k8s不断重启pod

或者运行过程中,jvm不断申请内存直到最大heap内存Xmx,Xmx超出了k8s分配给pod的内存,从而k8s自动重启pod。

解决方法在启动的脚本中设置jvm内存-Xms、-Xmx参数

例如:java -Xms1024m -Xmx1024m -jar test.jar

3.2 docker容器的内存限制

设置了docker容器的内存限制,制作的镜像未对JVM进行配置,

JVM 会默认设置堆栈的大小。

这样,当jvm占用内存超过docker容器限制时,就会出现container 被docker killed情况。

解决方法:一样是设置jvm内存-Xms、-Xmx参数

注意要小于docker容器的内存限制。

3.3 出现OOMKilled事件

pod运行过程中出现了OOMKilled事件

即pod运行过程内存需求持续增加,超过为pod设置的内存大小时,pod会被重启。

解决方法将pod的内存配置项的值修改大点

例如之前是1/2,可改为2/4


4 投票

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2天前
|
Kubernetes Perl 容器
在 Kubernetes 中重启 pod 的 3 种方法
【4月更文挑战第25天】
10 1
在 Kubernetes 中重启 pod 的 3 种方法
|
4天前
|
Kubernetes 网络协议 调度
kubernetes最小调度单元pod详解(二)
kubernetes最小调度单元pod详解(二)
|
4天前
|
Kubernetes 应用服务中间件 调度
kubernetes最小调度单元pod详解(一)
kubernetes最小调度单元pod详解(一)
|
20天前
|
Kubernetes 固态存储 调度
Kubernetes节点亲和性分配Pod
Kubernetes节点亲和性分配Pod
30 0
Kubernetes节点亲和性分配Pod
|
20天前
|
Kubernetes Docker 容器
Kubernetes容器的重启策略
Kubernetes容器的重启策略
16 0
Kubernetes容器的重启策略
|
20天前
|
存储 Kubernetes 调度
Kubernetes Pod生命周期
Kubernetes Pod生命周期
30 0
Kubernetes Pod生命周期
|
20天前
|
存储 Kubernetes 应用服务中间件
Kubernetes Pod
Kubernetes Pod
60 0
Kubernetes Pod
|
6天前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【4月更文挑战第26天】 在动态且不断增长的云计算环境中,维护高性能的 Kubernetes 集群是一个挑战。本文将探讨一系列实用的策略和工具,旨在帮助运维专家监控、分析和优化 Kubernetes 集群的性能。我们将讨论资源分配的最佳实践,包括 CPU 和内存管理,以及集群规模调整的策略。此外,文中还将介绍延迟和吞吐量的重要性,并提供日志和监控工具的使用技巧,以实现持续改进的目标。
|
9天前
|
存储 运维 Kubernetes
Kubernetes 集群的监控与维护策略
【4月更文挑战第23天】 在微服务架构日益盛行的当下,容器编排工具如 Kubernetes 成为了运维工作的重要环节。然而,随着集群规模的增长和复杂性的提升,如何确保 Kubernetes 集群的高效稳定运行成为了一大挑战。本文将深入探讨 Kubernetes 集群的监控要点、常见问题及解决方案,并提出一系列切实可行的维护策略,旨在帮助运维人员有效管理和维护 Kubernetes 环境,保障服务的持续可用性和性能优化。
|
10天前
|
存储 运维 Kubernetes
Kubernetes 集群的持续性能优化实践
【4月更文挑战第22天】在动态且复杂的微服务架构中,确保 Kubernetes 集群的高性能运行是至关重要的。本文将深入探讨针对 Kubernetes 集群性能优化的策略与实践,从节点资源配置、网络优化到应用部署模式等多个维度展开,旨在为运维工程师提供一套系统的性能调优方法论。通过实际案例分析与经验总结,读者可以掌握持续优化 Kubernetes 集群性能的有效手段,以适应不断变化的业务需求和技术挑战。

推荐镜像

更多