【Kubernetes】当K8s出现问题时,从哪些方面可以排查

这篇具有很好参考价值的文章主要介绍了【Kubernetes】当K8s出现问题时,从哪些方面可以排查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Kubernetes】当K8s出现问题时,从哪些方面可以排查,恒川的日常汇报,kubernetes,容器,云原生,运维
前言

kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。


📕作者简介:热爱跑步的恒川,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。
📗本文收录于恒川的日常汇报系列,大家有兴趣的可以看一看
📘相关专栏C语言初阶、C语言进阶系列等,大家有兴趣的可以看一看
📙Python零基础入门系列,Java入门篇系列正在发展中,喜欢Python、Java的朋友们可以关注一下哦!

1. POD启动异常、部分节点无法启动pod

【Kubernetes】当K8s出现问题时,从哪些方面可以排查,恒川的日常汇报,kubernetes,容器,云原生,运维

容器里管理应用

  • pod是k8S中最小调度单元,POD里面的容器共享pod的空间、资源、网络、存储等。
  • pod管理一个容器。
  • pod管理多个容器。

pod出现异常的原因:

  1. 资源过剩: 大量POD在同一个物理节点,出现资源占用太多导致物理节点宕机。
  2. 内存和CPU超标:pod中的应用出现内存泄露,导致pod内存迅速增多,pod kill 了影响节点正常提供服务。(解决办法:压测占用多少内存和CPU,做资源限制;)
  3. 网络问题:导致POD无法通信(解决办法:检查calico网络插件情况)
  4. 存储问题:pod挂载的共享存储连接不上导致pod启动异常(解决办法:查看共享存储是否正常,存储卷是否正常)
  5. 代码问题:应用程序代码在容器启动后失败(解决办法:排查应用程序代码)
  6. 配置问题:在部署deployment和statefulset时,资源清单编写有问题,导致pod无法正常创建(解决办法:查看资源配置的清单)
  7. 借助监控系统排查以上问题。

2. 审视集群状态

审视集群状态
  K8S的集群状态是排查故障的关键起点。使用kubectl get nodes命令来检查节点状态。如果有节点未能就绪或出现异常状态,可能会对应用程序造成故障。确保基本组件,如etcd、kubelet和kube-proxy等,正常运行。

3. 追踪事件日志

追踪事件日志
  深入了解集群中发生的事件是解决K8S故障的重要环节。通过kubectl get events命令查看事件日志。事件日志记录了与集群中重要事件和错误相关的信息。透过事件日志的检查,能够了解K8S组件或应用程序中存在的潜在故障,并准确定位问题。

4. 聚焦Pod状态

第三方面:聚焦Pod状态
  通过运行kubectl get pods --all-namespaces命令,获取集群中所有Pod的状态。若有Pod未处于运行状态(例如挂起、错误或未就绪等),很可能与容器或应用程序相关的问题有关。借助kubectl describe pod命令,获取特定Pod的详细信息,以便深入排查。

5. 检查网络连通性

检查网络连通性
  确保网络连接正常。审查服务、Pod和节点之间的网络通信是否存在问题。运行kubectl get services命令查看服务状态,使用kubectl describe service获取相关服务的详细信息。同时,验证网络策略和防火墙规则的正确配置。

6. 审视存储配置

审视存储配置
  如果你的应用程序使用持久性存储(例如Persistent Volumes和Storage Classes),务必确保存储配置正确。检查存储卷声明、存储类和持久卷的状态。通过kubectl get pv、kubectl get pvc和kubectl get storageclass命令,获取与存储相关的信息。

7. 研究容器日志

研究容器日志
  深入容器的日志能够提供关于应用程序故障的重要线索。使用kubectl logs命令查看特定Pod中容器的日志输出。如果Pod内含多个容器,你可以使用kubectl logs-c来查看特定容器的日志。

8. K8S集群网络通信

【Kubernetes】当K8s出现问题时,从哪些方面可以排查,恒川的日常汇报,kubernetes,容器,云原生,运维

K8S集群有自己独立的内部网络,整个集群的通信都需要依赖网络插件,常见的网络插件有Calico、Flannel、Canel等等。

  • Calico网络插件支持IP地址的分配以及网络策略的调整,性能和Flannel不相上下。
  • Flannel网络插件只支持IP地址分配。
  • Canel是Calico和Flannel网络插件的结合体。

K8S集群中的网络通信主要有以下几种:

  • 同一个Pod内多个容器之间的网络通信。
  • Pod与Pod之间的网络通信。
  • Pod与Service的通信。
  • Service资源与集群外部的通信。

9. 问题:Service 是否通过 DNS 工作?

【Kubernetes】当K8s出现问题时,从哪些方面可以排查,恒川的日常汇报,kubernetes,容器,云原生,运维

  从相同 Namespace 下的 Pod 中运行:

u@pod$ nslookup hostnames
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

Name:      hostnames
Address 1: 10.0.1.175 hostnames.default.svc.cluster.local

  如果失败,那么您的 Pod 和 Service 可能位于不同的 Namespace 中,请尝试使用限定命名空间的名称:

u@pod$ nslookup hostnames.default
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

Name:      hostnames.default
Address 1: 10.0.1.175 hostnames.default.svc.cluster.local

  如果成功,那么需要调整您的应用,使用跨命名空间的名称去访问服务,或者,在相同的 Namespace 中运行应用和 Service。如果仍然失败,请尝试一个完全限定的名称:

u@pod$ nslookup hostnames.default.svc.cluster.local
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

Name:      hostnames.default.svc.cluster.local
Address 1: 10.0.1.175 hostnames.default.svc.cluster.local

  注意这里的后缀:”default.svc.cluster.local”。”default” 是我们正在操作的 Namespace。”svc” 表示这是一个 Service。”cluster.local” 是您的集群域,在您自己的集群中可能会有所不同。

  您也可以在集群中的 Node 上尝试此操作:

注意:10.0.0.10 是我的 DNS Service,您的可能不同)

u@node$ nslookup hostnames.default.svc.cluster.local 10.0.0.10
Server:         10.0.0.10
Address:        10.0.0.10#53

Name:   hostnames.default.svc.cluster.local
Address: 10.0.1.175

  如果您能够使用完全限定的名称查找,但不能使用相对名称,则需要检查 /etc/resolv.conf 文件是否正确。

u@pod$ cat /etc/resolv.conf
nameserver 10.0.0.10
search default.svc.cluster.local svc.cluster.local cluster.local example.com
options ndots:5

  nameserver 行必须指示您的集群的 DNS Service,它通过 --cluster-dns 标志传递到 kubelet。

  search 行必须包含一个适当的后缀,以便查找 Service 名称。在本例中,它在本地 Namespace(default.svc.cluster.local)、所有 Namespace 中的 Service(svc.cluster.local)以及集群(cluster.local)中查找服务。根据您自己的安装情况,可能会有额外的记录(最多 6 条)。集群后缀通过 --cluster-domain 标志传递给 kubelet。本文档中,我们假定它是 “cluster.local”,但是您的可能不同,这种情况下,您应该在上面的所有命令中更改它。

  options 行必须设置足够高的 ndots,以便 DNS 客户端库考虑搜索路径。在默认情况下,Kubernetes 将这个值设置为 5,这个值足够高,足以覆盖它生成的所有 DNS 名称。

10. 总结

  当然,具体的排查方法还取决于你的集群配置、应用程序部署方式以及故障的具体现象。根据实际情况,可能需要进一步调查或采取其他排查措施。立足于这些方向,你将更有把握解决K8S故障,并确保应用程序持续稳定运行。


如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞👍作为鼓励,并评论收藏一下,谢谢大家!!!
制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。文章来源地址https://www.toymoban.com/news/detail-628783.html

到了这里,关于【Kubernetes】当K8s出现问题时,从哪些方面可以排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S集群中PLEG问题排查

    k8s集群排障真的很麻烦 今天集群有同事找我,节点报 PLEG is not healthy 集群中有的节点出现了NotReady,这是什么原因呢? PLEG is not healthy 也是一个经常出现的问题 POD 生命周期事件生成器 先说下PLEG 这部分代码在kubelet 里,我们看一下在kubelet中的注释: 也就是说kubelet 会定时把

    2024年02月02日
    浏览(50)
  • K8S Error getting node问题的排查思路

    在安装K8S集群或者运行过程中,大家可能会遇到 \\\"Error gettting node\\\" 的问题,例如: 排查这类问题的方法是执行如下命令查看具体错误原因: 找到最初的报错,根据不同的错误进行处理。 根据我遇到过的问题,主要有以下可能: 没有禁用swap内存 pause镜像没有下载成功(这里尤

    2024年02月13日
    浏览(28)
  • k8s排查Java应用CPU负载过高问题

    因为k8s发布的pod还未加入资源的监控,在查看pod负载时发现其中pod占用1核CPU 2.1通过debug排查 下一步可以到对应的node节点查看对应进程的信息,也可以通过debug在当前节点进行排查(当节点太多懒得登录过去时) top命令找到所在节点进程信息,找到问题进程 查看详细线程 通

    2024年02月05日
    浏览(37)
  • 现场问题排查-k8s(docker)上某服务pod频繁自动重启

    根因:应用内存占用不合理(个人认为)+现场配置内存不够导致频繁触发OOM引发该现象。 为啥要写这个文章? 之前没有k8s下pod频繁重启的问题处理经验,这次实战沉淀思路及过程,供后续自己处理相同问题提供参考资料 为其他遇到类似问题的人提供一些排查思路 现场反馈

    2024年02月03日
    浏览(31)
  • k8s故障排查个案:当Pod内存持续增长,OOM问题如何解决?

    pod 运行一段时间后,内存持续增长,甚至 oom 的情况. 容器化过程中,我们经常会发现 kubernetes 集群内 pod 的内存使用率会不停持续增长,加多少内存吃多少内存,如果对 cgroup 内存的构成不是很清楚的情况下,单纯看监控看不出什么问题。 经过一番查阅,目前总结出大致有

    2024年02月22日
    浏览(41)
  • K8S第四讲 Kubernetes删除pod阻塞问题

    在Kubernetes中,当您尝试删除一个Pod时,可能会遇到Pod一直阻塞的情况。这通常是由于Pod正在运行或被其他资源(例如ReplicaSet或Deployment)控制而导致的。以下是一些可能的解决方案: 1: 确认Pod是否正在运行:在执行删除Pod命令之前,请先检查Pod的状态,确保它没有在运行中

    2024年02月05日
    浏览(45)
  • 关于k8s中的node_exporter异常write: broken pipe问题排查

    公司网络更改重启服务器后,发现Prometheus监控中node节点三个挂掉了,实际上节点服务器是正常的,但是监控的node_exporter请求http://IP:9100/metrics超过10秒没有获取返回数据则认为服务挂掉。 到各个节点服务器用curl命令检测多久返回数据 time_connect :连接时间,从开始到TCP三次握

    2024年02月10日
    浏览(37)
  • k8s中,kubelet 出现问题, k8s-master node not found.

    由于一些其他问题,需要kubeadm reset,在做完kubeadm reset后,出现以下问题。 执行systemctl restart kubelet。 出现 k8s-master node not found,尽管 kubelet依旧是active状态 排查 hostname、etc/hosts等均正常。 通过journalctl -xe kubelet查看,依旧是如下错误。  经过多方尝试未果。又尝试着kubelet初

    2024年02月07日
    浏览(32)
  • 【Azure K8S】AKS升级 Kubernetes version 失败问题的分析与解决

    创建Azure Kubernetes Service服务后,需要升级AKS集群的 kubernetes version。在AKS页面的 Cluster configuration 页面中,选择新的版本 1.25.5,确认升级。等待50分钟左右,却等到了升级失败的消息: Failed to save Kubernetes service \\\'xxxx-aks3\\\'. Error: Drain of aks-agentpool-xxxxxxxx-vmss00000j did not complete: Too

    2024年02月08日
    浏览(28)
  • 【大数据】kubernetes(k8s)calico跨节点网络不通的问题及排错过程

    进入节点 k8s-node27 的pod,ping k8s-node28 节点上的pod的ip都不通,k8s-node28 节点ping k8s-node27 也不通,但是k8s-node27,k8s-node28 之间他们各自节点上的pod的ip之间是可以相互ping通。 排查过程: 这种情况让我们想起了当时设置路由转发时候的配置,主机上有多个网卡,而k8s的calico网络

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包