首页 > 其他分享 >【K8S系列】Pod重启策略及重启可能原因

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

时间:2023-12-27 12:33:06浏览次数:35  
标签:容器 重启 内存 镜像 Pod 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 投票

标签:容器,重启,内存,镜像,Pod,K8S,pod
From: https://www.cnblogs.com/gaoyanbing/p/17930306.html

相关文章

  • Linux Debian12使用podman安装upload-labs靶场环境
    一、upload-labs简介PHP语言编写,持续收集渗透测试和CTF中针对文件上传漏洞的靶场,总共21关,每一关都包含着不同的上传绕过方式。二、安装podman环境LinuxDebian系统如果没有安装podman容器环境,可以参考这篇文章先安装podman环境,LinuxDebian11使用国内源安装Podman环境三、pod......
  • K8S发布策略,无损发布
    大家好,相信大部分公司都已经使用K8S进行容器管理和编排了,但是关于K8S的发布策略,还有很多同学不太清楚,通过这篇文章的介绍,相信大家对目前K8S的发布情况有一个概括的认识。总结下来,共有如下几种:重建(recreate):即停止一个原有的容器,然后进行容器的新建。滚动更新(rollingUpdate):停......
  • fluentd根据K8S名称空间自动生成索引
    fluentd示例配置:apiVersion:v1data:containers.input.conf:|-<source>@typetailpath/var/log/containers/*.logpos_file/var/log/fluentd-containers.log.postagkubernetes.*<parse>@typejson......
  • k8s~ingress_service_endpoint_pod四壮士
    在Kubernetes中,Service和Endpoints是两个重要的概念,它们之间存在着密切的关系。Service:Service是Kubernetes中用于定义一组Pod的访问方式的抽象。通过创建Service,可以为一组具有相同标签的Pod提供统一的访问入口,使得客户端可以通过Service来访问这些Pod,而无需了解其具体的IP地址和......
  • 解决k8s调度不均衡问题
    前言在近期的工作中,我们发现k8s集群中有些节点资源使用率很高,有些节点资源使用率很低,我们尝试重新部署应用和驱逐Pod,发现并不能有效解决负载不均衡问题。在学习了Kubernetes调度原理之后,重新调整了Request配置,引入了调度插件,才最终解决问题。这篇就来跟大家分享Kubernete......
  • 廊坊2023电信1控制节点重启
    环境:廊坊2023电信1环境负责人:潘义诚变更原因客户提出涉及主机: 重启步骤:职位平台随便启动这个就没有再用,没有影响。裸机平台我们这边说是104、106、108、110可以一起重启,启动好后再重启105、107、109、111。os-deploy和ceph-deploy直接重启就行。ntp-server和yum-server要分......
  • K8s-V1.22以上版本如何管理docker镜像
    K8s1.22以上版本已经不在使用docker作为底层容器管理了,所以K8s创建的pod,使用dockerps-a也看不到任何输出了。取而代之的是crictl。通过询问ChatGPT,我们极有可能需要搭建一个私有镜像仓库: 1、查看K8s拉取的镜像[root@CentOs8-K8S-node0~]#crictlimagesIMAGE......
  • k8s~你应该知道的ip和你应该知道的端口
    你应该知道的ipNodeIPClusterIPPodIPContainerIPNodeIPnodeip是指k8s节点的ip地址,这个ip是具体的服务器,它上面的端口是nodeport,是真实服务器上的端口。ClusterIP在Kubernetes中,ClusterIP是指Service类型中的一种,它为集群内部的其他资源提供了一个虚拟IP......
  • k8s 部署 kuboard v3
    下载kuboard部署清单#wgethttps://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml修改部署清单configmap#vimkuboard-v3-swr.yaml修改内容#KUBOARD_AGENT_KEY是Agent与Kuboard通信时的密钥,请修改为一个任意的包含字母、数字的32位字符串,此密钥变更后,需要删除K......
  • 如何通过port-forward命令在本地访问 k8s 集群服务
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享概述在我们访问k8s中的pod服务时,一般通过nodeport映射pod端口进行访问,还有一种是通过ingress或者istio通过域名方式来访问,虽然两种方式能满足我们需求,但是如果针对临时访问,配置起来还是有点复杂和......