Kubernetes 应用故障的一些定位方法
- 常备工作
- 准备一个工具镜像
- 其中包含 nslookup, ping, curl, 甚至是 ab、siege 等常用工具以及一个顺手的 Shell。一言不合就可以用静态 Pod 的方式将其运行到 Kubernetes 之中进行内部诊断。
- sysctl -a | grep forwarding
- 你猜这是干啥的?
- 服务状态查询
- 各个 Kubernetes 组件的状态检查。可以使用 Ansible 之类的工具进行快速查询。
- Service 不通
- 这里我们首先假设 Pod 工作正常
- 目前我们的应用均采用的是 NodePort 模式对外提供服务:
- 逻辑:Service 将 符合其选择器的 Pod 暴露的端口 从 各个 Node 的同一端 口暴露出来对外进行监听。
- 技术:Kube-proxy 通过网络插件,一般利用 Iptables vxLan 等乌七八糟的蜜汁技术,完成对外服务负载均衡,并分发给各个 Pod 的内部 IP 的相应端口。
- 前面我们假设 Pod 是正常工作的,因此,这里只考虑 Service 的情况。
- 通过上面的陈述我们能看到大致的一些要素,下面从内向外进行列表:
- Pod 能够正常工作
- 见后文
- Service 的选择器能够正确的找到 Pod
- 这里我们可以使用
kubectl describe svc panic-service
命令,查看输出内容的endpoint
一节内容,如果其中有 Pod 地址,也就说明选择器和 Pod 的标签是匹配的。如果为空,则需要对服务或者 Pod Controller 的定义进行排查。
- Proxy 的工作状态
- 首先可以使用
systemctl -l Kube-proxy
来查看服务状况。 - 还可以使用其他 Node 的同一端口测试访问,看是否单一节点的故障。
- DNS 工作状态
- Kubectl 查看 DNS 各个 Pod 的存活状态。
- 利用上面提到的工具 Pod 尝试解析服务。失败了其实也没啥办法,删 DNS Pod 重启吧。
- 端口是否定义正确
- 看 Pod 的端口是否能够正确侦听,是否符合服务定义。例如 Service 定义了到 Pod 8080 端口的访问,而 Pod 开放的却是 80,这样的情况跟标签无法匹配一样,是很常见的问题。
- 说完了服务,我们来说说 Pod
- 两个顺手的命令:
-
kubectl get po -o wide | grep -v Running
kubectl describe po unhealthy
- 一般来说,一个行为端正的 Pod,应该是以 Running 状态持续运行的。在进入 Running 之前,大致有调度、创建、初始化等几个环节,如果正常运行之后出了故障,会发生重启。如果在启动容器内进程时出现问题,则会进入 CrashLoopBackOff 的状态。
- 除了 Running/Complet 以及 CrashLoopBackOff:
- 这几种情况其实不同,不过随性写到这,就不深究了,首先是 describe 一下。
- Pod 启动有几个条件:
- 有符合要求的节点供其运行
- Taint 隔离的节点,要求 Pod 有显式声明对该种 Taint 的容错能力,才可以在其上运行。
- 节点和 Pod 的亲和性定义
- Node Selector 的定义
- 符合其需求的资源
- CPU 和 内存的 request limit 定义
- 可能存在的第三方资源需求定义
- 加载卷(nfs gluster ceph 等)/Secret/Configmap 的定义
- 镜像必须存在,可 Pull
- 调度部分一般来说查看 Pod 定义,和节点的 Describe 进行匹配即可,Describe 内容中也会明确说出无合适 Pod。
- 资源部分 CPU 和内存的 Describe 结果也会很明显。
- 存储部分,往往就需要更复杂的排查:
- 首先看看是不是每个 Node 都如此。
- 是否安装了对应的客户端驱动。
- 对分布式存储的访问网络是否可用。
- 存储服务容量是否足够分配。
- 是否能够成功的手工 Mount。
- 至于对 ConfigMap 和 Secret 的依赖,很简单,Kubectl 查询即可。
- CrashLoopBackOff 以及 Restart 大于 1
- 这种情况一般来说属于业务内部的问题,可以通过
kubectl logs -f
命令进行查看,目前经验比较多的非业务情况是:
- 对于 Kubernetes API 进行访问的应用,经常会是因为RBAC 权限不足导致无法启动
- 依赖的 Service 无法访问。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
选K8S是对的,但是用不好就是你的不对了
2013年以来Docker像一股旋风席卷IT界,Docker指的是容器技术,其字面意思是集装箱,此中类比有深意。 小小的集装箱不简单,曾有人著书《集装箱改变世界》,说他改变了世界经济,围绕其中的有一大串复杂又很有趣的现象。 集装箱是装在船上来运输的,船上的舵手把集装箱送往全世界。IT世界的Docker装在数据中心的Linux系统环境中,容器何去何从由Kubernetes这个舵手说了算。 有人说Kubernetes出身好(谷歌的基因),活儿好,但是不好管理,作为老船长的几个IT管理者又拿出了Sextant来驯服Kubernetes,Sextant是什么东西呢? 字面意思是六分仪,也是海上航行的家伙事儿。看来,技术人员的情怀不是遥远的星辰,而是可望又可及的大海。 今天我们主要介绍下——Sextant(请忽略这个名字前几个单词的意思)。这是百度、百分点、云之声的几位技术人员作出的很严肃的东西,如上所说就是为了管理Docker容器的,那么Sextant是什么呢? Sextant和Kubernetes(K8S)的关系,就好比RedHat、Suse、CentOS、Ubuntu和Linux的关系一样...
- 下一篇
在Kubernetes上使用Sateful Set部署RabbitMQ集群
前面我们已经在Kubernetes上部署了Redis – 《在Kubernetes上使用Sateful Set部署Redis》。 本篇我们继续把RabbitMQ也跑在K8S上。 1.RabbitMQ的基础知识 在正式开始部署工作之前,我们先来复习一下RabbitMQ的一些基础知识。 RabbitMQ内建的集群功能可以实现其高可用,允许消费者和生产者在RabbitMQ节点崩溃的情况下继续工作,同时可以通过添加更多的节点来提高消息处理的吞吐量。 RabbitMQ内部主要包含以下四种Meta Data: vhost meta data:为RabbitMQ内部的Queue, Exchange, Binding提供命名空间级别的隔离 exchange meta data:记录Exchange的名称、类型、属性等 binding meta data:表示Routing Key和Queue之间的绑定关系,即描述如何将消息路由到队列Queue中 queue meta data: 记录队列的名称及其属性 单个节点的RabbitMQ会将这些meta data保存到内存中,同时对于那些属性为持久化的信息,例...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用