k8s运维之pod排错

K8S是一个开源的,用于管理云平台中多个主机上的容器化应用,Kubernetes的目标是让部署容器化变得简单并且高效

K8S的核心优势:
 1,基于yaml文件实现容器的自动创建、删除
 2,更快速实现业务的弹性横向扩容
 3,动态发现新扩容的容器并自动对用户提供访问
 4,更简单、更快速的实现业务代码升级和回滚

一般来说pod处于异常状态,都可以执行以下命令查看pod状态
kubectl get pod <pod-name> -o yaml   #查看pod配置
kubcctl get pod <pod-name> -o wide   #查看pod运行节点等信息 
kubectl describe pod <pod-name>      #查看pod事件
kubectl logs <pod-name>              #查看pod日志

Pod 简介

1. pod是k8s中的最小单元
 2. 一个pod中可以运行一个容器,也可以运行多个容器
 3. 运行多个容器的话,这些容器是一起被调度的
 4. Pod的生命周期是短暂的,不会自愈,是用完就销毁的实体
 5. 一般我们是通过Controller来创建和管理pod的
 
Pod生命周期:初始化容器、启动前操作、就绪探针、存活探针、删除pod操作

K8S中 Pod 创建过程
1,客户端向apiserver发起一个create pod请求
2,apiserver接收到pod创建请求后,生成一个包含创建信息的yaml
3,apiserver将yaml信息写入etcd数据库
4,根据scheduler调度器为pod分配node主机
5,node kubelet检测到有新的Pod调度过来,通过container runtime运行该pod
6,kubelet 获得pod状态,并更新到apiserver中

Pod一直处于Pending状态

pending说明pod还没调度到某个Node上面

可以通过以下命令查看
 kubectl describe pod <pod-name>  

可能原因:
 1,资源不足,集群内所有的 Node 都不满足该 Pod 请求的CPU、内存或者临时存储空间等资源。解决方法是降低资源使用率,可以删除不用的Pod或者添加新的Node节点``  kubectl describe node  #可以查看node资源情况     2,HostPort 端口已被占用,通常推荐使用 Service 对外开放服务端口    3,不满足 nodeSelector 如果Pod包含nodeSelector 指定了节点需要包含的 label,调度器将只会考虑将 Pod 调度到包含这些 label 的Node上,如果没有 Node 有这些 label或者有这些 label的 Node 其它条件不满足也将会无法调度 4,不满足 affinity nodeAffinity: 节点亲和性,可以看成是增强版的 nodeSelector,用于限制 Pod 只允许被调度到某一部分 Node podAffinity: Pod亲和性,用于将一些有关联的Pod调度到同一个地方,可以是指同一个节点或同一个可用区的节点等 podAntiAffinity: Pod反亲和性,用于避免将某一类Pod调度到同一个地方避免单点故障,比如将集群 DNS 服务的 Pod 副本都调度到不同节点,避免一个节点挂了造成整个集群DNS解析失败,使得业务中断

Pod 一直处于 Waiting 或 ContainerCreating 状态

首先还是通过以下命令查看:
kubectl describe pod

可能原因:

1,镜像拉取失败,比如配置了镜像错误、Kubelet 无法访问镜像、私有镜像的密钥配置错误、镜像太大,拉取超时等2,CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如无法配置 Pod 、无法分配 IP 地址3,容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数4,容器依赖的存储卷无法创建

Pod 处于 ImagePullBackOff 状态

这通常是镜像名称配置错误等导致镜像无法拉取。使用 docker pull <image> 来验证镜像是否可以正常拉取。

Pod 处于 Terminating 或 Unknown 状态

Kubernetes 不会因为 Node 失联而删除其上正在运行的 Pod,而是将其标记为 Terminating 或 Unknown 状态

想要删除这些状态的 Pod 有三种方法:

1,从集群中删除该Node。使用公有云时,kube-controller-manager 会在 VM 删除后自动删除对应的 Node。而在物理机部署的集群中,需要管理员手动删除 Node(如 kubectl delete node <node-name>。

2,Node恢复正常。Kubelet 会重新跟 kube-apiserver 通信确认这些 Pod 的期待状态,进而再决定删除或者继续运行这些 Pod。

3,用户强制删除。用户可以执行 kubectl delete pods <pod> --grace-period=0 --force 强制删除 Pod。除非明确知道 Pod 的确处于停止状态(比如 Node 所在 VM 或物理机已经关机),否则不建议使用该方法。特别是StatefulSet 管理的 Pod,强制删除容易导致脑裂或者数据丢失等问题

4,处于 Terminating 状态的 Pod 在 Kubelet 恢复正常运行后一般会自动删除。但有时也会出现无法删除的情况,并且通过 kubectl delete pods <pod> --grace-period=0 --force 也无法强制删除。此时一般是由于 finalizers 导致的,通过 kubectl edit 将 finalizers 删除即可解决。

Pod 一直处于 CrashLoopBackOff 状态

CrashLoopBackOff 状态说明容器曾经启动了,但又异常退出了。此时 Pod 的 Restart (重启次数) 通常是大于 0 的,可以先查看一下容器的日志

可能是: 容器进程退出,健康检查失败退出等方法有: kubectl get pod <pod-name> -o yamlkubectl describe pod <pod-name>kubectl logs <pod-name> kubectl exec -it <pod-name> bash  #进去容器查看kubectl get pod <pod-name> -o wide #查看pod运行在哪个node上,去查看node系统日志

Pod 处于 Error 状态

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

可能原因:
1,依赖的 ConfigMap、Secret 或者 PV 等不存在
2,请求的资源超过了管理员设置的限制,比如超过了 LimitRange 等
3,容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定

集群处于 NotReady状态

kubectl get nodes

kubectl describe node

kubectl logs -n kube-system

journalctl -l -u kubelet

Node 处于 NotReady 状态,大部分是由于 PLEG(Pod Lifecycle Event Generator)问题导致的
社区 issue 目前还处于未解决状态

常见的问题及修复方法为:

Kubelet 未启动或者异常挂起:重新启动Kubelet
CNI 网络插件未部署:部署CNI插件
Docker :重启Docker
磁盘空间不足:清理磁盘空间,比如镜像、文件等
** 集群排错**
排查集群状态异常问题通常从 Node 和 Kubernetes 服务的状态出发
常见原因有: 
 虚拟机或物理机宕机
 Kubernetes 服务未正常启动
 操作失误(配置错误等)

kube-apiserver无法启动:
 会导致集群不可访问,已有的pod正常运行
  
etcd集群异常:
 apiserver无法正常读写集群状态,kubelet无法周期性更新状态

kube-controller-manager/kube-scheduler异常:
 控制器无法工作,导致deployment、service等异常,新创建的pod无法调度

Node机器无法启动或kubelet无法启动:
 node上的pod无法正常运行
 已经运行的pod无法正常终止

k8s运维之pod排错的更多相关文章

  1. k8s运维处理

    k8s运维处理 驱逐节点容器,进行docker,等重要组件的重启时,打驱逐标记 kubectl drain [option --node ip] 进行重启docker或kubelet等其他操作,操作完 ...

  2. k8s运维记 - 如何让部署到k8s的kong网关托管自定义静态资源?

    目的 使用kong作为目录/data/reports的静态资源服务器,为了测试,已于目录/data/reports下创建文件report.html,如下: <html> <head& ...

  3. 【linux】 第1回 linux运维基础

    目录 1. 运维的本质 2. 电脑与服务器 2.1 电脑的种类 2.2 服务器种类 2.3 服务器品牌 2.4 服务器尺寸 2.5 服务器内部组成 3. 磁盘阵列 4. 系统简介 5. 虚拟化 6. ...

  4. 经典案例复盘——运维专家讲述如何实现K8S落地

    经典案例复盘——运维专家讲述如何实现K8S落地 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上,除少数访问量 ...

  5. 如何使用 K8s 两大利器"审计"和"事件"帮你摆脱运维困境?

    概述 下面几个问题,相信广大 K8s 用户在日常集群运维中都曾经遇到过: 集群中的某个应用被删除了,谁干的? Apiserver 的负载突然变高,大量访问失败,集群中到底发生了什么? 集群节点 Not ...

  6. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  7. 基于 Nebula Operator 的 K8s 自动化部署运维

    摘要:Nebula Operator 是 Nebula Graph 在 Kubernetes 系统上的自动化部署运维插件.在本文,你将了解到 Nebula Operator 的特性及它的工作原理. 从 ...

  8. 从一到万的运维之路,说一说VM/Docker/Kubernetes/ServiceMesh

    摘要:本文从单机真机运营的历史讲起,逐步介绍虚拟化.容器化.Docker.Kubernetes.ServiceMesh的发展历程.并重点介绍了容器化阶段之后,各项重点技术的安装.使用.运维知识.可以说 ...

  9. 灵雀云:etcd 集群运维实践

    [编者的话]etcd 是 Kubernetes 集群的数据核心,最严重的情况是,当 etcd 出问题彻底无法恢复的时候,解决问题的办法可能只有重新搭建一个环境.因此围绕 etcd 相关的运维知识就比较 ...

随机推荐

  1. Java SE 13 新增特性

    Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  2. Taurus.MVC 微服务框架 入门开发教程:项目集成:5、统一的日志管理。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  3. SyncFusion安装和使用

    1.Visual Studio 继承 Visual Studio菜单栏 → 扩展 → 扩展管理 → 搜索框中搜索 "Syncfusion Windows",单击 "Win ...

  4. tomcat 10无法使用jstl 如何添加依赖

    以Tomcat 10.0.23   idea 2021.1版本为例需要添加依赖 <dependency> <groupId>org.glassfish.web</grou ...

  5. Homework5

    问:什么是分而治之? 答:分而治之就是通过一系列的方法,将复杂的问题逐渐划分成若干份相对简单的问题的方法,对每个相对简单问题进行一一解决,若干个简单问题的解的集合就是一个复杂问题的解.分而治之的应用体 ...

  6. .NET 反向代理-YARP 根据域名转发

    前段时间发布过一个关于 YARP 的简单介绍,感兴趣的小伙伴恭请移步看看 .NET 反向代理-YARP - 一事冇诚 - 博客园 (cnblogs.com) 作为反向代理,必不可少的当然是根据域名代理 ...

  7. Chrome 浏览器缓存的问题

    浏览器缓存的问题 Chrome 在浏览器中设置: 1 Ctrl + Shift + Delete 2 Ctrl + F5 强制刷新 3 F12 打开控制台 ---> Network ---> ...

  8. k8s 中的 Pod 细节了解

    k8s中Pod的理解 基本概念 k8s 为什么使用 Pod 作为最小的管理单元 如何使用 Pod 1.自主式 Pod 2.控制器管理的 Pod 静态 Pod Pod的生命周期 Pod 如何直接暴露服务 ...

  9. ProxySQL 配置ProxySQL

    转载自:https://www.jianshu.com/p/212397a1be67 假定你已经对ProxySQL的架构有所了解.本文对ProxySQL的所有配置都是使用Admin管理接口完成的,该管 ...

  10. 查看docker容器占用的内存

    # 获取容器ID docker ps => 3b7fa46d9d43 # 根据容器ID获取对应的进程 docker top 3b7fa46d9d43 => 179733 # 查看进程占用的 ...