网站建设 盘网互联,建筑工程合同书范本,php网站建设思路,装饰装修材料前言 kubernetes#xff0c;简称K8s#xff0c;是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的#xff0c;用于管理云平台中多个主机上的容器化的应用#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效#xff08;powerful#xff09;,Kub… 前言 kubernetes简称K8s是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的用于管理云平台中多个主机上的容器化的应用Kubernetes的目标是让部署容器化的应用简单并且高效powerful,Kubernetes提供了应用部署规划更新维护的一种机制。 作者简介热爱跑步的恒川致力于C/C、Java、Python等多编程语言热爱跑步喜爱音乐的一位博主。 本文收录于恒川的日常汇报系列大家有兴趣的可以看一看 相关专栏C语言初阶、C语言进阶系列等大家有兴趣的可以看一看 Python零基础入门系列Java入门篇系列正在发展中喜欢Python、Java的朋友们可以关注一下哦 K8s问题的排查 1. POD启动异常、部分节点无法启动pod2. 审视集群状态3. 追踪事件日志4. 聚焦Pod状态5. 检查网络连通性6. 审视存储配置7. 研究容器日志8. K8S集群网络通信9. 问题Service 是否通过 DNS 工作10. 总结 1. POD启动异常、部分节点无法启动pod 容器里管理应用
pod是k8S中最小调度单元,POD里面的容器共享pod的空间、资源、网络、存储等。pod管理一个容器。pod管理多个容器。
pod出现异常的原因
资源过剩 大量POD在同一个物理节点出现资源占用太多导致物理节点宕机。内存和CPU超标pod中的应用出现内存泄露导致pod内存迅速增多pod kill 了影响节点正常提供服务。解决办法压测占用多少内存和CPU做资源限制网络问题导致POD无法通信解决办法检查calico网络插件情况存储问题pod挂载的共享存储连接不上导致pod启动异常(解决办法查看共享存储是否正常,存储卷是否正常)代码问题应用程序代码在容器启动后失败解决办法排查应用程序代码配置问题在部署deployment和statefulset时资源清单编写有问题导致pod无法正常创建(解决办法查看资源配置的清单)借助监控系统排查以上问题。
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集群网络通信 K8S集群有自己独立的内部网络整个集群的通信都需要依赖网络插件常见的网络插件有Calico、Flannel、Canel等等。
Calico网络插件支持IP地址的分配以及网络策略的调整性能和Flannel不相上下。Flannel网络插件只支持IP地址分配。Canel是Calico和Flannel网络插件的结合体。
K8S集群中的网络通信主要有以下几种
同一个Pod内多个容器之间的网络通信。Pod与Pod之间的网络通信。Pod与Service的通信。Service资源与集群外部的通信。
9. 问题Service 是否通过 DNS 工作 从相同 Namespace 下的 Pod 中运行
upod$ nslookup hostnames
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.localName: hostnames
Address 1: 10.0.1.175 hostnames.default.svc.cluster.local如果失败那么您的 Pod 和 Service 可能位于不同的 Namespace 中请尝试使用限定命名空间的名称
upod$ nslookup hostnames.default
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.localName: hostnames.default
Address 1: 10.0.1.175 hostnames.default.svc.cluster.local如果成功那么需要调整您的应用使用跨命名空间的名称去访问服务或者在相同的 Namespace 中运行应用和 Service。如果仍然失败请尝试一个完全限定的名称
upod$ nslookup hostnames.default.svc.cluster.local
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.localName: 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您的可能不同
unode$ nslookup hostnames.default.svc.cluster.local 10.0.0.10
Server: 10.0.0.10
Address: 10.0.0.10#53Name: hostnames.default.svc.cluster.local
Address: 10.0.1.175如果您能够使用完全限定的名称查找但不能使用相对名称则需要检查 /etc/resolv.conf 文件是否正确。
upod$ cat /etc/resolv.conf
nameserver 10.0.0.10
search default.svc.cluster.local svc.cluster.local cluster.local example.com
options ndots:5nameserver 行必须指示您的集群的 DNS Service它通过 --cluster-dns 标志传递到 kubelet。 search 行必须包含一个适当的后缀以便查找 Service 名称。在本例中它在本地 Namespacedefault.svc.cluster.local、所有 Namespace 中的 Servicesvc.cluster.local以及集群cluster.local中查找服务。根据您自己的安装情况可能会有额外的记录最多 6 条。集群后缀通过 --cluster-domain 标志传递给 kubelet。本文档中我们假定它是 “cluster.local”但是您的可能不同这种情况下您应该在上面的所有命令中更改它。 options 行必须设置足够高的 ndots以便 DNS 客户端库考虑搜索路径。在默认情况下Kubernetes 将这个值设置为 5这个值足够高足以覆盖它生成的所有 DNS 名称。
10. 总结 当然具体的排查方法还取决于你的集群配置、应用程序部署方式以及故障的具体现象。根据实际情况可能需要进一步调查或采取其他排查措施。立足于这些方向你将更有把握解决K8S故障并确保应用程序持续稳定运行。 如果这份博客对大家有帮助希望各位给恒川一个免费的点赞作为鼓励并评论收藏一下⭐谢谢大家 制作不易如果大家有什么疑问或给恒川的意见欢迎评论区留言。