现场问题排查-k8s(docker)上某服务pod频繁自动重启

这篇具有很好参考价值的文章主要介绍了现场问题排查-k8s(docker)上某服务pod频繁自动重启。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

现场问题排查-k8s(docker)上某服务pod频繁自动重启

写在最前面

根因:应用内存占用不合理(个人认为)+现场配置内存不够导致频繁触发OOM引发该现象。
为啥要写这个文章?

  • 之前没有k8s下pod频繁重启的问题处理经验,这次实战沉淀思路及过程,供后续自己处理相同问题提供参考资料
  • 为其他遇到类似问题的人提供一些排查思路

问题现象

现场反馈1月15日升级完以后,某系统首页的某搜索功能就经常不好用,初步排查是某服务的POD总自动重启,研发已经处理过两次了,还是没有根除。

初步排查(健康检查配置不合理导致容器重启)

问现场之前排查结论是啥呀?运维反馈怀疑资源不足,后来也增加了对应服务的资源,但问题还是没有根除。
那先看看这个服务的事件吧(docker5页面可以直接看,也可以用kubectl get event -n 服务所在命名空间命令查看–网上资料都是不需要用-n指定命名空间的,但我不指定就报错,网上说有多个命名空间的时候需要指定,所以最好还是指定吧),然后发现了以下问题。

[root@node-133446 ~]# kubectl get event -n myNamespace
LAST SEEN   TYPE      REASON                         KIND                      MESSAGE
...
9m52s       Normal    Created                        Pod                       Created container
9m51s       Normal    Started                        Pod                       Started container
9m50s       Warning   Unhealthy                      Pod                       Liveness probe failed: Get http://192.168.220.150:18201/actuator/health: dial tcp 192.168.220.150:18201: connect: connection refused
9m18s       Warning   Unhealthy                      Pod                       Readiness probe failed: Get http://192.168.220.150:18201/actuator/health: dial tcp 192.168.220.150:18201: connect: connection refused
9m18s       Normal    Killing                        Pod                       Killing container with id docker://mySer:Container failed liveness probe.. Container will be killed and recreated.
4m44s       Warning   BackOff                        Pod                       Back-off restarting failed container
...

上面报错明显是服务的/actuator/health接口不通呀,根据经验这个报错是因为k8s的就绪探针配置导致的,因为着急恢复业务,就先临时把这个配置给关掉了(后续问题彻底解决后又恢复了,但根据情况调整了一些参数。具体过程另开一个帖子讲吧,感觉可以作为一个单独的知识点分享,这样也便于后续针对场景搜索)。

再次定位(自动伸缩配置调整)

关掉健康检查并重启后,服务正常了,皆大欢喜。现场说还是成哥厉害,几分钟就搞定了,然而还没高兴两分钟,我看首页案件搜索又用不了了。

这???打脸来的太快,就像是龙卷风!刚刚说我厉害的人,悄悄回座位处理其他问题了,也不搭理我了…这可太疼了。

既然没有解决,继续看事件吧,看看有啥新思路没,然后事件列表基本都是以下内容

[root@node-133446 ~]# kubectl describe service/mySer -n myNamespace
# 这里其实是根据页面上的时间列表模拟的,上面的命令执行后,Events是none,网上说要配置权限,但我没配置出来
类型     事件原因            事件信息                                最后更新
Normal  ScalingReplicaSet  Scaled down replica set tm-... to 3    3 minutes ago
Normal  ScalingReplicaSet  Scaled up replica set tm-... to 4      9 minutes ago
Normal  ScalingReplicaSet  Scaled up replica set tm-... to 3      10 minutes ago
Normal  ScalingReplicaSet  Scaled down replica set tm-... to 2    13 minutes ago
Normal  ScalingReplicaSet  Scaled up replica set tm-... to 1      21 minutes ago
Normal  ScalingReplicaSet  Scaled down replica set tm-... to 0    22 minutes ago
Normal  ScalingReplicaSet  Scaled up replica set tm-... to 4      30 minutes ago

这Pod的个数怎么在反复伸缩呀?咨询了一下arterydocker支持,按步骤检查了下

  • 集群资源充足吗?->集群内每个机器都还有不少资源呢
  • 被攻击或其他管理员手工修改了?->密码没几个人知道,都在一个屋,基本不可能。为了保险,还是修改了密码,但问题依旧,所以排除该选项
  • 查看Pod的yaml最下面的事件有啥东西没?->没有这个节点(其实这里跟上面脚本的内容是一样的,估计是没权限)
  • 查看Pod的yaml里面有没有kind: HorizontalPodAutoscaler关键字?->查看了没有(其实问题就在这里,只是Pod的deploy资源和HPA资源是分别管理的,入口错了)
  • 那就得再研究研究了,之前也没遇到过。

陷入瓶颈了呀,咋办?网上各种找资料,说的都是自动伸缩的事儿,各种瞎点,还真给点出来了(位置在docker5控制台->资源->HPA->里面搜索出问题的服务->编辑->最小副本、最大副本控制自动伸缩)。

[root@node-133446 ~]# kubectl get hpa -n myNamespace
# 查看指定命名空间内所有的hpa配置
NAME            REFERENCE                          TARGETS      MINPODS   MAXPODS   REPLICAS   AGE
...
hpa-mySer       Deployment/mySer                   32m/6144m    1         4         1          319d
...

[root@node-133446 ~]# kubectl get hpa -n myNamespace hpa-mySer
# 查看指定hpa配置
NAME        REFERENCE             TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
hpa-mySer   Deployment/mySer      33m/6144m   1         4         1          319d

[root@node-133446 ~]# kubectl get hpa -n myNamespace hpa-mySer -o yaml
# 查看指定hpa完整yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2022-04-09T04:23:10Z","reason":"ReadyForNewScale","message":"recommended
      size matches current size"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2023-02-22T10:54:45Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2023-02-20T14:02:11Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageValue":"33m"}}]'
    autoscaling.alpha.kubernetes.io/metrics: '[{"type":"Resource","resource":{"name":"cpu","targetAverageValue":"6144m"}}]'
    field.cattle.io/displayName: ""
  creationTimestamp: "2022-04-09T04:22:55Z"
  labels:
    io.cattle.field/appId: myNamespace
  name: hpa-mySer
  namespace: myNamespace
  resourceVersion: "235189306"
  selfLink: /apis/autoscaling/v1/namespaces/myNamespace/horizontalpodautoscalers/hpa-mySer
  uid: ba923625-b7bc-11ec-a55a-3cd2e55b71c6
spec:
  maxReplicas: 4 # 这个就是最大副本数,最多会扩容到这个数字
  minReplicas: 1 # 这个是最小副本数,最小不会少于这个数字(手工调整pod个数,估计会自动增加回来)
  scaleTargetRef:
    apiVersion: apps/v1beta2
    kind: Deployment
    name: mySer
status:
  currentReplicas: 1
  desiredReplicas: 1
  lastScaleTime: "2023-02-22T10:49:29Z"

把这里的最大和最小都限制成1,然后再观察,该pod就没有自动伸缩了。但服务依然不可用(实际这个估计没影响业务,还是当时业务本身有问题,问题根除后,这里也恢复了),那就得继续排查了。

最终定位(服务实际内存占用超过服务配置最大限制导致重启)

既然自己没发现什么明显问题,那继续谷歌吧。

按照网上的文章,各种实验,最终有效果的脚本如下:

[root@node-133446 ~]# kubectl describe pod -n myNamespace mySer-5f5c8666f5-ll9kj
# 查看指定pod资源的详细信息(重点关注【Last State:     Terminated】部分的【Reason:       OOMKilled】)
Name:               mySer-5f5c8666f5-ll9kj
Namespace:          myNamespace
Priority:           0
PriorityClassName:  <none>
Node:               node-133448/133.4.4.8
Start Time:         Mon, 20 Feb 2023 21:57:58 +0800
Labels:             app=mySer
                    appid=myNamespace
                    pod-template-hash=5f5c8666f5
Annotations:        cattle.io/timestamp: 2023-02-20T13:53:34Z
                    field.cattle.io/ports:
                      [[{"containerPort":18201,"dnsName":"mySer","hostPort":0,"kind":"ClusterIP","name":"18201tcp02","protocol":"TCP","sourcePort":0},{"conta...
Status:             Running
IP:                 192.168.118.5
Controlled By:      ReplicaSet/mySer-5f5c8666f5
Init Containers:
  init:
    Container ID:  docker://f75bf1e90de373487464fbc84329a786c970d9265c3adcd5b5ef5fe7a382afe9
    Image:         ...
    Image ID:      ...
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      wget --spider ...
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Mon, 20 Feb 2023 21:57:59 +0800
      Finished:     Mon, 20 Feb 2023 21:57:59 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-488jb (ro)
Containers:
  mySer:
    Container ID:  docker://facfd64a6d6a6e4d087d7a1434e768e76d0e143639189193d764f76b713d3aaf
    Image:         ...
    Image ID:      ...
    Ports:         18201/TCP, 18202/TCP
    Host Ports:    0/TCP, 0/TCP
    Command:
      /bin/sh
      -c
      sh /install/run mySer  2.24.0
    State:          Waiting
      Reason:       CrashLoopBackOff
# 重点关注这一段,可以看到状态是已停止,原因是OOMKilled,内存溢出被杀掉了
# 重点关注这一段,可以看到状态是已停止,原因是OOMKilled,内存溢出被杀掉了
# 重点关注这一段,可以看到状态是已停止,原因是OOMKilled,内存溢出被杀掉了
    Last State:     Terminated
      Reason:       OOMKilled
      Exit Code:    0
      Started:      Mon, 20 Feb 2023 22:12:33 +0800
      Finished:     Mon, 20 Feb 2023 22:16:28 +0800
    Ready:          False
    Restart Count:  3
    Limits:
      cpu:     4
      memory:  8196Mi # 这里的8196Mi其实是研发已经调整过的了
    Requests:
      cpu:     1
      memory:  4Gi
    Environment:
      ...
      MYHOSTIP:                        (v1:status.hostIP)
  ...
Events:
  Type     Reason     Age                  From                  Message
  ----     ------     ----                 ----                  -------
  Normal   Scheduled  19m                  default-scheduler     Successfully assigned myNamespace/mySer-5f5c8666f5-ll9kj to node-133448
  Normal   Pulled     19m                  kubelet, node-133448  Container image "registry...com:5000/.../busybox-amd64:1.33" already present on machine
  Normal   Created    19m                  kubelet, node-133448  Created container
  Normal   Started    19m                  kubelet, node-133448  Started container
  Normal   Created    19m                  kubelet, node-133448  Created container
  Normal   Pulling    19m                  kubelet, node-133448  pulling image "registry...com:5000/.../...-monitor-amd64:2.2.0"
  Normal   Pulled     19m                  kubelet, node-133448  Successfully pulled image "registry...com:5000/.../...-monitor-amd64:2.2.0"
  Normal   Started    19m                  kubelet, node-133448  Started container
  Normal   Created    4m41s (x4 over 19m)  kubelet, node-133448  Created container
  Normal   Started    4m41s (x4 over 19m)  kubelet, node-133448  Started container
  Normal   Pulled     4m41s (x4 over 19m)  kubelet, node-133448  Successfully pulled image "registry...com:5000/../...-7.6.1810"
  Normal   Pulling    4m41s (x4 over 19m)  kubelet, node-133448  pulling image "registry...com:5000/...-7.6.1810"
  Warning  BackOff    34s (x5 over 10m)    kubelet, node-133448  Back-off restarting failed container

从上面的状态信息及原因可以得知,是因为内存溢出导致容器被杀掉并自动重启了,然后查看pod崩溃前的日志,也看到了如下关键字(可以使用kubectl logs -f podName -n myNamespace --previous命令查看,或者docker5在对应pod更多的查看日志功能页面左下角有个以前的容器均可查看崩溃前容器日志):

[com.thunisoft.tm.rocketmq.listener.MQConsumerListenerConcurrently:56]-[ERROR] 
java.lang.OutOfMemoryError: Java heap space

以上信息足以证明,当前容器反复自动重启,是因为限制的内存不足导致。

但已经8G内存了还不够,都占用到哪儿去了?进入容器后使用top命令查看,内存基本都被mySer这个java进程占用了。内存调整到16G再观察,服务启动后,几分钟内mySer服务的内存占用又到了14G左右,但好歹重启频率降低了,基本不重启了。一个服务需要吃那么多内存,感觉不太正常,把排查过程给对应产品研发负责人反馈,找了个研发介入跟进。

后来研发给了个新包,换上以后内存占用不怎么明显了,启动后长期保持在2-3G的样子,业务高峰期内存占用也没超过6G,单节点配置8G也够用了。

持续观察两天,未再复现服务不可用情况,问题解决,健康检查及自动伸缩配置功能还原(参数有所微调),完事儿。

参考资料

Pod 水平自动扩缩:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/

HorizontalPodAutoscaler 演练:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

kubectl describe pod Error from server (NotFound):pods not found: https://blog.csdn.net/u013288190/article/details/109125059

kubectl describe pod 里边没有看到events问题解决【详细步骤】: https://blog.csdn.net/marlinlm/article/details/122150345

K8S 查看 Pod 日志: https://blog.51cto.com/u_1472521/4909721

[云原生] Kubernetes(k8s)健康检查详解与实战演示(就绪性探针 和 存活性探针):https://www.cnblogs.com/liugp/p/16630873.html

健康检查配置:https://imroc.cc/kubernetes/best-practices/configure-healthcheck.html文章来源地址https://www.toymoban.com/news/detail-436516.html

到了这里,关于现场问题排查-k8s(docker)上某服务pod频繁自动重启的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S集群中Pod资源处于CrashLoopBackOff状态排查思路

    CrashLoopBackOff状态一般都是Pod资源中的容器出现了问题,可以有以下几点原因: 容器中部署的程序存在Bug,无法正常启动,就会出现此状态,可以查询容器的启动日志,从日志中获取重要线索,逐个进行排查。 定义Pod资源时,对于Pod中的容器进行了资源限额,可能限额的资源

    2024年01月21日
    浏览(45)
  • k8s pod一直处于pending状态一般有哪些情况,怎么排查?

    一个pod一开始创建的时候,它本身就是会处于pending状态,这时可能是正在拉取镜像,正在创建容器的过程。 如果等了一会发现pod一直处于pending状态, 那么我们可以使用kubectl describe命令查看一下pod的Events详细信息。一般可能会有这么几种情况导致pod一直处于pending状态: 1、

    2024年01月17日
    浏览(56)
  • K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路

    故障一:Pod数量太多超出物理节点的限制 每一台Node节点中默认限制最多运行110个Pod资源,当一个应用程序有成百上千的Pod资源时,如果不扩容Node节点或者修改最大Pod数量限制,那么就会导致部分Pod资源无法正常运行,因为节点已经没有资源可以被调度了。 解决思路就是扩容

    2024年02月02日
    浏览(44)
  • 【故障排查】VMware挂起后恢复,k8s集群无法ping/curl通pod/svc/ingress

    一、master/node节点,去curl pod IP,一直卡着,没反应。timeout。 二、挂起恢复后,harbor服务无法正常访问503 ,需要重启harbor服务。 进容器curl localhost,是正常的。 而网络CNI 、flannel 、 coreDNS等都是running状态。 (发现restarts的次数有点多) .这里的metrics-server一直失败的。 可参考

    2023年04月17日
    浏览(43)
  • 【k8s问题定位】k8s中的pod不停的重启,定位问题原因与解决方法

    现象: running的pod,短时间内重启次数太多   定位问题方法: 查看pod日志 本次使用以下命令,解决了问题 问题原因: OOM,pod被kill掉,重启了( 内存不够用 )   查看该服务的deployment.yaml文件 发现我们deployment.yaml对服务的内存使用,做了限制 解决方法: 将limit的memory数值提高,然后

    2024年02月09日
    浏览(58)
  • K8s出现问题时,如何排查解决!

    K8s问题的排查 1、POD启动异常、部分节点无法启动pod 容器里管理应用 pod出现异常的原因: 2. 审视集群状态 审视集群状态 K8S的集群状态是排查故障的关键起点。使用kubectl get nodes命令来检查节点状态。如果有节点未能就绪或出现异常状态,可能会对应用程序造成故障。确保基

    2024年02月02日
    浏览(52)
  • K8S集群中PLEG问题排查

    k8s集群排障真的很麻烦 今天集群有同事找我,节点报 PLEG is not healthy 集群中有的节点出现了NotReady,这是什么原因呢? PLEG is not healthy 也是一个经常出现的问题 POD 生命周期事件生成器 先说下PLEG 这部分代码在kubelet 里,我们看一下在kubelet中的注释: 也就是说kubelet 会定时把

    2024年02月02日
    浏览(57)
  • K8S第四讲 Kubernetes删除pod阻塞问题

    在Kubernetes中,当您尝试删除一个Pod时,可能会遇到Pod一直阻塞的情况。这通常是由于Pod正在运行或被其他资源(例如ReplicaSet或Deployment)控制而导致的。以下是一些可能的解决方案: 1: 确认Pod是否正在运行:在执行删除Pod命令之前,请先检查Pod的状态,确保它没有在运行中

    2024年02月05日
    浏览(67)
  • K8S Error getting node问题的排查思路

    在安装K8S集群或者运行过程中,大家可能会遇到 \\\"Error gettting node\\\" 的问题,例如: 排查这类问题的方法是执行如下命令查看具体错误原因: 找到最初的报错,根据不同的错误进行处理。 根据我遇到过的问题,主要有以下可能: 没有禁用swap内存 pause镜像没有下载成功(这里尤

    2024年02月13日
    浏览(37)
  • k8s中的pod不停的重启,定位问题原因与解决方法

    现象: running的pod,短时间内重启次数太多   定位问题方法: 查看pod日志 本次使用以下命令,解决了问题 问题原因: OOM,pod被kill掉,重启了( 内存不够用 )   查看该服务的deployment.yaml文件 发现我们deployment.yaml对服务的内存使用,做了限制 解决方法: 将limit的memory数值提高,然后

    2024年02月15日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包