kubernetes常见异常处理

2023-11-19

一、kubernetes常见Pod异常状态的处理

  一)一般排查方式

  无论 Pod 处于什么异常状态,都可以执行以下命令来查看 Pod 的状态

  • kubectl get pod <pod-name> -o yaml 查看 Pod 的配置是否正确
  • kubectl describe pod <pod-name> 查看 Pod 的事件
  • kubectl logs <pod-name> [-c <container-name>] 查看容器日志

  二)Pod常见异常及处理

  1、Pod --Pending状态

  Pending 说明 Pod 还没有调度到某个 Node 上面。可以通过 
  kubectl describe pod <pod-name> 命令查看到当前 Pod 的事件,进而判断为什么没有调度。可能的原因包括

  • 资源不足,集群内所有的 Node 都不满足该 Pod 请求的 CPU、内存、GPU 等资源
  • HostPort 已被占用,通常推荐使用 Service 对外开放服务端口

  2、Pod --Waiting 或 ContainerCreating状态

  首先还是通过 kubectl describe pod <pod-name> 命令查看到当前 Pod 的事件。可能的原因包括

  • 镜像拉取失败,比如配置了镜像错误、Kubelet 无法访问镜像、私有镜像的**配置错误、镜像太大,拉取超时等
  • CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如无法配置 Pod 、无法分配 IP 地址
  • 容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数

  3、Pod -- ImagePullBackOff状态

  这也是我们测试环境常见的,通常是镜像拉取失败。这种情况可以使用 docker pull <image> 来验证镜像是否可以正常拉取。

  或者docker images | grep <images>查看镜像是否存在(系统有时会因为资源问题自动删除一部分镜像),

  4、Pod -- CrashLoopBackOff状态 

  CrashLoopBackOff 状态说明容器曾经启动了,但可能又异常退出了。此时可以先查看一下容器的日志

kubectl logs <pod-name> kubectl logs --previous <pod-name>

  这里可以发现一些容器退出的原因,比如

  • 容器进程退出
  • 健康检查失败退出

  5、Pod --Error 状态

  通常处于 Error 状态说明 Pod 启动过程中发生了错误。常见的原因包括

  • 依赖的 ConfigMap、Secret 或者 PV 等不存在
  • 请求的资源超过了管理员设置的限制,比如超过了 LimitRange 等
  • 违反集群的安全策略,比如违反了 PodSecurityPolicy 等
  • 容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定

  6、Pod --Terminating 或 Unknown 状态

  从 v1.5 开始,Kubernetes 不会因为 Node 失联而删除其上正在运行的 Pod,而是将其标记为 Terminating 或 Unknown 状态。想要删除这些状态的 Pod 有三种方法:

  • 从集群中删除该 Node。使用公有云时,kube-controller-manager 会在 VM 删除后自动删除对应的 Node。而在物理机部署的集群中,需要管理员手动删除 Node(如 kubectl delete node <node-name>。
  • Node 恢复正常。Kubelet 会重新跟 kube-apiserver 通信确认这些 Pod 的期待状态,进而再决定删除或者继续运行这些 Pod。
  • 用户强制删除。用户可以执行 kubectl delete pods <pod> --grace-period=0 --force 强制删除 Pod。除非明确知道 Pod 的确处于停止状态(比如 Node 所在 VM 或物理机已经关机),否则不建议使用该方法。
    特别是 StatefulSet 管理的 Pod,强制删除容易导致脑裂或者数据丢失等问题。

  7、Pod -- Evicted状态

  出现这种情况,多见于系统内存或硬盘资源不足,可df-h查看docker存储所在目录的资源使用情况,如果百分比大于85%,就要及时清理下资源,尤其是一些大文件、docker镜像。

  清除状态为Evicted的pod:

kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod

  删除所有状态异常的pod:

kubectl delete pods $(kubectl get pods | grep -v Running | cut -d ' ' -f 1)

  删除集群中没有在使用的docker镜像(慎用):

docker image prune -f

  查看pod对应的服务(镜像)版本:

kubectl --server=127.0.0.1:8888 get rc -o yaml | grep image: |uniq | sort | grep ecs-core

  附:

  删除某类历史镜像(仅保留当前使用的)

docker images | grep ecs-core | grep -v `docker images | grep ecs-core -m 1 | awk '{print $2}'` | awk '{print $3}' | xargs docker rmi -f

二、kubernetes网络问题

  一)flannel网络插件

  1、flannel插件安装失败:Error registering network: failed to acquire lease

  环境:单节点k8s

    问题描述

  部署flannel网络插件失败:

NAMESPACE      NAME                             READY   STATUS              RESTARTS   AGE
kube-flannel   kube-flannel-ds-55nbz            0/1     CrashLoopBackOff    3          3m48s

    查看日志和事件

  查看日志

# kubectl logs -f -n kube-flannel   kube-flannel-ds-zcg88
I1015 08:01:17.973247       1 match.go:259] Using interface with name ens33 and address 10.0.0.10
I1015 08:01:17.973300       1 match.go:281] Defaulting external address to interface address (10.0.0.10)
I1015 08:01:17.973485       1 vxlan.go:138] VXLAN config: VNI=1 Port=0 GBP=false Learning=false DirectRouting=false
E1015 08:01:17.974560       1 main.go:330] Error registering network: failed to acquire lease: node "k8s-node-1" pod cidr not assigned
W1015 08:01:17.974846       1 reflector.go:436] github.com/flannel-io/flannel/subnet/kube/kube.go:402: watch of *v1.Node ended with: an error on the server ("unable to decode an event from the watch stream: context canceled") has prevented the request from succeeding
I1015 08:01:17.974943       1 main.go:447] Stopping shutdownHandler...

  查看事件

# kubectl get events

    解决:修改controller配置文件

vim /etc/kubernetes/manifests/kube-controller-manager.yaml
增加参数:
--allocate-node-cidrs=true
--cluster-cidr=10.244.0.0/16

  重启kubelet

systemctl restart kubelet

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kubernetes常见异常处理 的相关文章

随机推荐

  • vue项目中批量删除如何实现的

    简单回答 与单个删除的接口为同一个 然后通过数组对象的id来删除
  • 光模块组装过程中常见问题分析及解决方法

    光模块组装过程中会出现一些问题 经常使用光模块的人可能会知道 下面就分享了组装光模块的问题及原因分析 并附有解决方案 大家参考下 希望对大家有帮助 在光模块组装过程中会出现一些问题 经常使用光模块的人可能会知道 组装光模块的问题 分析如下
  • 【嵌入式基础】串口中断通信VS串口DMA通信

    目录 目录 前言 一 串口通信 1 通信方式 2 通信速率 3 串口通信的三种工作方式 二 串口中断通信 1 串口中断特点 2 CubeMX配置初始化串口中断相关外设 3 串口中断程序分析 4 实验效果 三 串口DMA通信 1 关于DMA
  • 数字后端知识点扫盲——后端设计流程及使用工具

    1 DFT Design For Test 可测性设计 芯片每一步往往都自带测试电路 DFT的目的就是在设计的时候就考虑将来的测试 DFT的常见方法是 在设计中插入scan chain 将非扫描单元 如寄存器 变为扫描单元 DFT工具是sy
  • VS包含目录、库目录、附加依赖项、环境变量详解

    首先 提出一个问题 我们编译一个程序 都需要哪些文件 1 头文件 2 静态库lib 3 动态库dll 针对这三个文件 我们便可以设置工程的相关属性 1 头文件 我们要用到一个头文件 需要知道这个头文件的名字 然后用 include将它包含进
  • Java高级-包装类、BigDecimal和BigInteger

    基本数据类型和包装类 基本数据类型和包装类如下所示 基本类型 包装类 int java lang Integer 父类为java lang Number long java lang Long 父类为java lang Number dou
  • Maven中:可以被子模块继承的元素

    即使是长期从事 Maven 工作的开发人员也不能完全掌握聚合 多模块 和 Parent 继承的关系 在使用多模块时 子模块总要指定聚合的 pom 为
  • Linux中如何修改文件或目录的权限?

    在Linux系统中 文件权限是非常重要的一个概念 它能够决定谁可以访问文件 以及可以执行哪些操作 正确地设置文件权限可以确保系统的安全性和稳定性 那么如何设置文件权限呢 以下是详细的内容 在 Linux 系统中 可以使用 chmod 命令来
  • unity中的一些快捷键(齐)

    重命名的快捷键是F2 ALT 鼠标左键点击Hierarchy对象可以展开和收起对象的所有子物体 SHIFT 空格 可以对当前窗口进行放大缩小
  • 部署docker

    1 移除之前安装过的Docker sudo yum y remove docker docker client docker client latest docker common docker latest docker latest l
  • maven怎么引入jdom_如何在Maven项目中引入自己的jar包

    1 一般情况下jar包都可以使用pom xml来配置管理 但也有一些时候 我们项目中使用了一个内部jar文件 但是这个文件我们又没有开放到maven库中 我们会将文件放到我们项目中 以下以java工程为例随便放了个地方 2 jar包的引入和
  • RK3308 Ubuntu16.04移植

    一 概述 本章将介绍Ubuntu在RK平台上的移植以及AP配网 常用的fs为buildroot编译出来的linux文件系统 而本次则是ubuntu文件系统 系统启动后需要手动对WIFI驱动进行加载并配网 二 配置Kernel 为了支持ubu
  • python requests 爬虫--爬取HTML源码不显示正文已解决

    爬虫第一步 获取整个网页的HTML信息 源代码如下 coding UTF 8 import requests if name main target https www biqukan com 1 1094 5403177 html req
  • Wireshark过滤规则及使用方法

    前言 我看到的这篇文章是转载的 但我也不知道他是从哪转载的 o 转自 Wireshark 基本语法 基本使用方法 及包过滤规则 1 过滤IP 如来源IP或者目标IP等于某个IP 例子 ip src eq 192 168 1 107 or i
  • Java基础:常用类Compare

    Compare类 Comparable接口 自然排序 1 像String 包装类等实现了Comparable接口 重写了compareTo 方法 2 String 包装类重写了compareTo 方法后 进行了从小到大的排列 Test pu
  • Linux内核内存管理算法Buddy和Slab

    文章目录 Buddy分配器 CMA Slab分配器 总结 Buddy分配器 假设这是一段连续的页框 阴影部分表示已经被使用的页框 现在需要申请一个连续的5个页框 这个时候 在这段内存上不能找到连续的5个空闲的页框 就会去另一段内存上去寻找5
  • AtCoder Beginner Contest 169 B Multiplication 2 long long竟然不够用

    AtCoder Beginner Contest 169 比赛人数11374 比赛开始后15分钟看到A题 在比赛开始后第20分钟看到所有题 AtCoder Beginner Contest 169 B Multiplication 2 lo
  • OpenGL ES 2.0升级到3.0配置win32环境以及编译所遇bug

    安装win32平台的OpenGL ES 3 0模拟器 一 安装3 0模拟器 一般用32位的 https developer arm com products software development tools graphics devel
  • ctfshow-网络迷踪-初学再练( 一座雕像判断军事基地名称)

    ctf show 网络迷踪第4关 题目中只有一座雕像 需要根据雕像提交军事基地的名称 推荐使用谷歌识图 溯源到一篇博客 答案就在文章标题中 给了一座雕像 看样子不像是国内的风格 扔谷歌识图找找线索 访问谷歌识图 根据图片搜索 https w
  • kubernetes常见异常处理

    一 kubernetes常见Pod异常状态的处理 一 一般排查方式 无论 Pod 处于什么异常状态 都可以执行以下命令来查看 Pod 的状态 kubectl get pod