kubernetes故障排查

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: kubernetes故障排查

pod故障排查

调试pod的第一步是看一下这个pod的信息,用如下命令查看一下pod的当前状态和最近的事件:

$ kubectl describe pods ${POD_NAM

查看一下pod中的容器所处的状态。这些容器的状态都是Running吗?最近有没有重启过?后面的调试都是要依靠pods的状态的。

1.pod停留在pending状态

如果一个pod卡在Pending状态,则表示这个pod没有被调度到一个节点上。通常这是因为资源不足引起的。敲一下kubectl describe ...这个命令,输出的信息里面应该有显示为什么没被调度的原因。常见原因如下:

  • 资源不足: 你可能耗尽了集群上所有的CPU和内存,此时,你需要删除pods,调整资源请求,或者增加节点。更多信息请参阅Compute Resources document
  • 使用了hostPort: 如果绑定一个pod到hostPort,那么能创建的pod个数就有限了。多数情况下,hostPort是非必要的,而应该采用服务来暴露pod。如果确实需要使用hostPort,那么能创建的pod的数量就是节点的个数。

2.pod停留在waiting状态

如果一个pod卡在Waiting状态,则表示这个pod已经调试到节点上,但是没有运行起来。再次敲一下kubectl describe ...这个命令来查看相关信息。最常见的原因是拉取镜像失败。可以通过以下三种方式来检查:

  • 使用的镜像名字正确吗?
  • 镜像仓库里有没有这个镜像?
  • docker pull <image>命令手动拉下镜像试试。

3.pod处于crashing状态或者unhealthy

首先,看一下容器的log:

$ kubectl logs ${POD_NAME} ${CONTAINER_NAME}

如果容器是crashed的,用如下命令可以看到crash的log:

$ kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}

或者,用exec在容器内运行一些命令:

$ kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN}

注意:

当一个pod内只有一个容器时,可以不带参数-c ${CONTAINER_NAME}。

例如,名为Cassandra的pod,处于running态,要查看它的log,可运行如下命令:

$ kubectl exec cassandra -- cat /var/log/cassandra/system.log

如果以上方法都不起作用,找到这个pod所在的节点并用SSH登录进去做进一步的分析。通常情况下,是不需要在Kubernetes API中再给出另外的工具的。因此,如果你发现需要ssh进一个主机来分析问题时,请在GitHub上提一个特性请求,描述一个你的场景并说明为什么已经提供的工具不能满足需求。

4.pod处于running态,但是没有正常工作

如果创建的pod不符合预期,那么创建pod的描述文件应该是存在某种错误的,并且这个错误在创建pod时被忽略掉。通常pod的定义中,章节被错误的嵌套,或者一个字段名字被写错,都可能会引起被忽略掉。例如,希望在pod中用命令行执行某个命令,但是将command写成commnd,pod虽然可以创建,但命令并没有执行。如何查出来哪里出错?首先,删掉这个pod再重新创建一个,重创时,像下面这样带着--validate这个参数: kubectl create --validate -f mypod.yamlcommand写成commnd的拼写错误就会打印出来了。

I0805 10:43:25.129850   46757 schema.go:126] unknown field: commnd
I0805 10:43:25.129973   46757 schema.go:129] this may be a false alarm, see https://github.com/kubernetes/kubernetes/issues/6842
pods/mypod

如果上面方法没有看到相关异常的信息,那么接下来就要验证从apiserver获取到的pod是否与期望的一致,比如创建Pod的yaml文件是mypod.yaml。

运行如下命令来获取apiserver创建的pod信息并保存成一个文件: kubectl get pods/mypod -o yaml > mypod-on-apiserver.yaml

然后手动对这两个文件进行比较: apiserver获得的yaml文件中的一些行,不在创建pod的yaml文件内,这是正常的。如果创建Pod的yaml文件内的一些行,在piserver获得的yaml文件中不存在,可以说明创建pod的yaml中的定义有问题。

控制器故障排查

RC相当简单。他们要么能创建pod,要么不能。如果不能创建pod,请参阅上述Debugging Pods。

也可以使用kubectl describe rc ${CONTROLLER_NAME}命令来监视RC相关的事件。

Services故障排查

服务提供了多个Pod之间的负载均衡功能。有一些常见的问题可以造成服务无法正常工作。以下说明将有助于调试服务的问题。首先,验证服务是否有端点。对于每一个Service对像,apiserver使endpoints资源可用。通过如下命令可以查看endpoints资源:

$ kubectl get endpoints ${SERVICE_NAME}

确保endpoints与服务内容器个数一致。例如,如果你创建了一个nginx服务,它有3个副本,那么你就会在这个服务的endpoints中看到3个不同的IP地址。

服务缺少endpoints

如果缺少endpoints,请尝试使用服务的labels列出所有的pod。假如有一个服务,有如下的label:

...
spec:
  - selector:
     name:nginx
     type:frontend

你可以使用如下命令列出与selector相匹配的pod,并验证这些pod是否归属于创建的服务:

$ kubectl get pods --selector=name=nginx,type=frontend

如果pod列表附合预期,但是endpoints仍然为空,那么可能没有暴露出正确的端口。如果服务指定了containerPort,但是列表中的Pod没有列出该端口,则不会将其添加到端口列表。

验证该pod的containerPort与服务的containerPort是否匹配。

网络故障排查

服务提

如果可以连接到服务上,但是连接立即被断开了,并且在endpoints列表中有endpoints,可能是代理和pods之间不通。

确认以下3件事情:

  • Pods工作是否正常?看一下重启计数,并参阅Debugging Pods;
  • 可以直接连接到pod上吗?获取pod的IP地址,然后尝试直接连接到该IP上;
  • 应用是否在配置的端口上进行服务?Kubernetes不进行端口重映射,所以如果应用在8080端口上服务,那么containerPort字段就需要设定为8080。
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
运维 Ubuntu Linux
k8s-CKS真题-故障排查Sysdig & falco
k8s-CKS真题-故障排查Sysdig & falco
134 0
|
27天前
|
容器 Perl Kubernetes
深入 Kubernetes 网络:实战K8s网络故障排查与诊断策略
本文介绍了Kubernetes网络的基础知识和故障排查经验,重点讨论了私有化环境中Kubernetes网络的挑战。首先,文章阐述了Kubernetes网络模型的三大核心要素:Pod网络、Service网络和CNI,并强调了其在容器通信和服务发现中的作用。接着,通过三个具体的故障案例,展示了网络冲突、主节点DNS配置更改导致的服务中断以及容器网络抖动问题的解决过程,强调了网络规划、配置管理和人员培训的重要性。最后,提到了KubeSkoop exporter工具在监控和定位网络抖动问题中的应用。通过这些案例,读者可以深入了解Kubernetes网络的复杂性,并学习到实用的故障排查方法。
146283 18
|
29天前
|
运维 Kubernetes 调度
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
|
1月前
|
运维 Kubernetes 监控
避免业务中断,K8s节点故障排查攻略,速来围观!
避免业务中断,K8s节点故障排查攻略,速来围观!
59 0
|
1月前
|
运维 Kubernetes 网络安全
k8s学习-CKA真题-集群故障排查kubelet
k8s学习-CKA真题-集群故障排查kubelet
148 0
|
8月前
|
运维 Kubernetes Shell
Kubernetes —集群故障排查(Kubectl 、telepresence)
Kubernetes —集群故障排查(Kubectl 、telepresence)
101 2
|
7月前
|
运维 Kubernetes 安全
5 分钟搞懂 K8S Pod Terminating/Unknown 故障排查
5 分钟搞懂 K8S Pod Terminating/Unknown 故障排查
666 0
|
8月前
|
JSON 运维 Kubernetes
Kubernetes集群故障排查—使用 crictl 对 Kubernetes 节点进行调试
Kubernetes集群故障排查—使用 crictl 对 Kubernetes 节点进行调试
154 0
|
11月前
|
存储 缓存 JSON
Kubernetes集群故障排查—审计
Kubernetes集群故障排查—审计
135 1
Kubernetes集群故障排查—审计
|
11月前
|
Prometheus 运维 Kubernetes
Kubernetes 故障排查工具- Robusta 解析
Hello folks,我是 Luga,今天我们来分享一款用于 Kubernetes Cluster 故障排查的开源工具 - Robusta (罗布斯塔)。作为一个用于多集群 Kubernetes 监控、故障排除和自动化的开源平台,就像 Docker 用于部署应用程序的基础设施即代码一样,Robusta 用于维护 Kubernetes Cluster 应用程序和处理其警报的基础设施即代码。
348 0