记一次K8s排错实战

标签: k8s 排错 | 发表时间:2021-06-03 14:18 | 作者:kaliarch
出处:https://juejin.cn/backend

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

一 背景

收到测试环境集群告警,登陆K8s集群进行排查。

二 故障定位

2.1 查看pod

查看kube-system node2节点calico pod异常

  • 查看详细信息,查看node2节点没有存储空间,cgroup泄露

2.2 查看存储

  • 登陆node2查看服务器存储信息,目前空间还很充足

  • 集群使用到的分布式存储为ceph,因此查看ceph集群状态

三 操作

3.1 ceph修复

目前查看到ceph集群异常,可能导致node2节点cgroup泄露异常,进行手动修复ceph集群。

   数据的不一致性(inconsistent)指对象的大小不正确、恢复结束后某副本出现了对象丢失的情况。数据的不一致性会导致清理失败(scrub error)。
CEPH在存储的过程中,由于特殊原因,可能遇到对象信息大小和物理磁盘上实际大小数据不一致的情况,这也会导致清理失败。
复制代码

由图可知,pg编号1.7c 存在问题,进行修复。

  • pg修复
   ceph pg repair 1.7c
复制代码

  • 进行修复后,稍等一会,再次进行查看,ceph集群已经修复

3.2 进行pod修复

对异常pod进行删除,由于有控制器,会重新拉起最新的pod

查看pod还是和之前一样,分析可能由于ceph异常,导致node2节点cgroup泄露,网上检索重新编译

  1. Google一番后发现与 github.com/rootsongjc/… 这个同学的问题基本一致。 存在的可能有,
  • Kubelet 宿主机的 Linux 内核过低 - Linux version 3.10.0-862.el7.x86_64
  • 可以通过禁用kmem解决

查看系统内核却是低版本

3.3 故障再次定位

最后,因为在启动容器的时候runc的逻辑会默认打开容器的kmem accounting,导致3.10内核可能的泄漏问题

在此需要对no space left的服务器进行 reboot重启,即可解决问题,出现问题的可能为段时间内删除大量的pod所致。

初步思路,可以在今后的集群管理汇总,对服务器进行维修,通过删除节点,并对节点进行reboot处理

3.4 对node2节点进行维护

3.4.1 标记node2为不可调度

   kubectl cordon node02
复制代码

3.4.2 驱逐node2节点上的pod

   kubectl drain node02 --delete-local-data --ignore-daemonsets --force
复制代码
  • --delete-local-data 删除本地数据,即使emptyDir也将删除;
  • --ignore-daemonsets 忽略DeamonSet,否则DeamonSet被删除后,仍会自动重建;
  • --force 不加force参数只会删除该node节点上的ReplicationController, ReplicaSet, DaemonSet,StatefulSet or Job,加上后所有pod都将删除;

目前查看基本node2的pod均已剔除完毕

此时与默认迁移不同的是,pod会 先重建再终止,此时的 服务中断时间=重建时间+服务启动时间+readiness探针检测正常时间,必须等到 1/1 Running服务才会正常。 因此在单副本时迁移时,服务终端是不可避免的

3.4.3 对node02进行重启

重启后node02已经修复完成。

对node02进行恢复

  • 恢复node02可以正常调度
   kubectl uncordon node02
复制代码

四 反思

  • 后期可以对部署k8s 集群内核进行升级。
  • 集群内可能pod的异常,由于底层存储或者其他原因导致,需要具体定位到问题进行针对性修复。

参考链接

相关 [k8s 排错] 推荐:

记一次K8s排错实战

- - 掘金 后端
这是我参与更文挑战的第3天,活动详情查看:. 收到测试环境集群告警,登陆K8s集群进行排查. 查看kube-system node2节点calico pod异常. 查看详细信息,查看node2节点没有存储空间,cgroup泄露. 登陆node2查看服务器存储信息,目前空间还很充足. 集群使用到的分布式存储为ceph,因此查看ceph集群状态.

CentOS7 安装 K8S

- - 企业架构 - ITeye博客
前提:VirtualBox CentOS7. 物理机IP   192.168.18.8. 虚拟机1IP:192.168.18.100(VMaster master). 虚拟机2IP:192.168.18.101(VServer1 node1). 虚拟机3IP:192.168.18.102(VServer2 node2).

k8s docker集群搭建 - CSDN博客

- -
一、Kubernetes系列之介绍篇.     - 一次构建,到处运行. 2.什么是kubernetes.   首先,他是一个全新的基于容器技术的分布式架构领先方案. Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg). 在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性.

深入掌握K8S Pod - Yabea - 博客园

- -
K8S configmap介绍. Pod是k8s中最小的调度单元,包含了一个“根容器”和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的基本使用,但是为了更好的应用,你需要深入了解pod的配置、调度、升级和扩缩容等. pod包含一个或多个相对紧密耦合的容器,处于同一个pod中的容器共享同样的存储空间、IP地址和Port端口.

浅谈 k8s ingress controller 选型 - 知乎

- -
大家好,先简单自我介绍下,我叫厉辉,来自腾讯云. 业余时间比较喜欢开源,现在是Apache APISIX PPMC. 今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容需要大家对 K8S 有一定的了解,下面是我的分享. 阅读本文需要熟悉以下基本概念:. 集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等云资源.

SkyWalking探针在 k8s 中集成

- - 掘金 后端
最近公司需要在 k8s 环境接入 SkyWalking,要让应用无感知接入. 开始打算的是把agent文件放到基础镜像中,这样应用只需要引用包含agent的基础镜像即可. 但是这样会有几个问题,首先不好管理agent,升级需要应用重新打镜像部署,动静太大. 第二,不是所有应用都需要接入,要按需引入不同基础镜像,这样就多个一个步骤,应用会有感知.

使用kube-proxy让外部网络访问K8S service的ClusterIP

- - zzm
kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是:. 修改master的/etc/kubernetes/proxy,把KUBE_PROXY_ARGS=”“改为KUBE_PROXY_ARGS=”–proxy-mode=userspace”.

k8s外网如何访问业务应用之Service 池化pod

- - IT瘾-geek
一、废话:先讲述一个k8s重要概念,我觉得这个概念是整个k8s集群实现微服务的最核心的概念. Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象. Service提供了一个统一的服务访问入口以及服务代理和发现机制,用户不需要了解后台Pod是如何运行. 只需要将一组跑同一服务的pod池化成一个service,k8s集群会自动给这个service分配整个集群唯一ip和端口号(这个端口号自己在yaml文件中定义),一个service定义了访问pod的方式,就像单个固定的IP地址和与其相对应的DNS名之间的关系.

K8S的SDN容器网络解决方案及其价值

- - SegmentFault 最新的文章
编者按:关于容器网络的解决方案业界已经有较多的讨论,笔者无意继续赘述. K8S及其网络模型体现了鲜明的解耦设计思想,采用SDN技术实现K8S容器网络,并与相应的生态组件形成SDN监管控一体化解决方案,可以更好地提高整个系统的运营水平,更有效地提升企业的核心竞争力. 本文拟抛砖引玉,从K8S的网络实现入手,重点阐述SDN在容器网络中的应用价值.

构建生产就绪的K8S集群的16点清单

- - SegmentFault 最新的文章
Kubernetes是用于构建高度可扩展系统的强大工具. 结果,许多公司已经开始或正在计划使用它来协调生产服务. 不幸的是,像大多数强大的技术一样,Kubernetes也很复杂. 我们整理了以下清单,以帮助你生产环境最佳实践Kubernetes. Kubernetes提供了一种编排容器化服务的方法,因此,如果您没有按顺序实践你的容器,那么集群一开始就不会处于良好状态.