Kubernetes 是一个强大的平台,用于管理容器,但在处理生产环境中的问题时,即使是经验最丰富的工程师也可能感到迷茫。本文将引导你使用最佳实践和 kubectl
命令,高效地排查 Kubernetes 集群在生产环境中的问题。
我会在运行中的集群上执行所有命令,并附上结果的截图。这确保示例准确,反映实际情况。你可以放心,提供的步骤已在真实的Kubernetes环境中经过彻底测试。
调试问题的首要步骤是检查集群的整体健康状况。这有助于识别有问题的组件或承受压力的资源。
节点是集群的骨干。如果某个节点出了问题,运行在其上的 pod 也受影响。
# 运行以下命令来查看节点 kubectl get nodes
此命令会列出所有节点及其状态(Ready
,NotReady
等)。如果某个节点标记为 NotReady
,,则需要进一步检查相关的事件,以符合中文标点符号的使用习惯和更符合口语化表达。
列出节点
# 查看节点的详细信息 kubectl describe node <node-name>
此命令可以提供节点为何处于NotReady
状态的详细信息,例如内存问题、磁盘压力、Pod不耐受的污点容忍度... 它是一个非常有用的命令,可帮助您获取节点的详细信息,例如节点上运行的Pod和标签。
描述一个节点的详情
(二) 检查核心组件来
像 kube-apiserver
,kube-scheduler
和 kube-controller-manager
这样的关键组件必须正常运行以保证集群的健康状态。
# 下面的命令在 Kubernetes 1.9 及更早版本中已弃用 kubectl get componentstatuses # 可以使用下面的命令替换 kubectl get --raw=/readyz?verbose
这条命令用来检查核心组件的状态。如果发现任何组件状态为 不健康
,则需要立即处理。
检查组件状态
Pod 是 Kubernetes 中的执行单元,而大多数生产问题表现为失败的 Pod。
此命令将扫描所有命名空间中的所有 pod,并列出那些不在运行状态的 pod,快速识别有问题的 pod。
# 获取所有非 Running 状态的 pod,不论它们所在的命名空间 kubectl get pod -A | grep -v "Running"
而不是扫描整个命名空间,您可以检查相关命名空间中所有Pod的总体状态。
kubectl get pods -n <namespace-name>
检查 gisalind 命名空间中的 pod 状态
STATUS
、RESTARTS
和 AGE
列提供了哪些 Pod 存在问题的初步指示。如需查看特定 Pod 的更多详细信息,可以使用:
kubectl describe pod <pod-name> -n <namespace-name> # 其中 <pod-name> 是 Pod 名称,<namespace-name> 是命名空间名称
此命令显示出一些最近的相关事件、错误信息和状态更新。
如果一个 pod 出现故障或出现表现异常,容器的日志文件通常能提供有用的线索:
kubectl logs <pod-name> -n <namespace-name> --previous
使用这个命令可以查看指定pod的前一个日志记录。你可以使用这个命令来查看指定pod在之前的日志记录。
--previous
标志符特别有用的功能,可以查看之前崩溃并重启的容器的日志。
你可以使用这个命令来查看或追踪你 Pod 的最后 x 行日志。
查看你的 pod 的最后 200 行日志 kubectl logs <pod-name> -n <namespace-name> --tail=200
获取 danielscool-backend 的最近 200 行日志信息
--tail
参数特别有用,可以用来查看容器的最后 x 条日志。如果你想实时查看日志,可以直接使用 -f
选项,不需要指定数字。
为了更深入地探索,可能需要在运行中的容器里执行命令。
在终端中输入以下命令以进入指定的Pod:请在终端中输入以下命令:
kubectl exec -it <Pod名称> -n <命名空间名称> -- /bin/bash
这会打开一个交互 shell,让你可以在容器里检查文件、配置或运行诊断等。
尝试连接 MySQL 容器
在像 Kubernetes 这样的分布式环境中,网络连接问题很常见。以下是一些诊断连接问题的步骤。
Kubernetes服务抽象Pod并提供一个稳定的网络接口,如果服务没有正常运行,首先检查配置是否正确。
kubectl get svc -n <namespace-name> # 获取指定命名空间下的服务列表
在命名空间 ‘danielscool’ 里找服务
接下来,检查端点,确保后端服务的 pod 正确连接,
运行以下命令来获取服务端点信息:``kubectl get endpoints <service-name> -n <namespace-name>```
服务没有端点可能意味着后端Pod可能已经失败或无法访问。
查找与 Danielscool 服务相关的端点
对于集群外部暴露的应用程序,入口控制器和负载均衡器起着至关重要的作用。可以通过以下命令检查它们的状态:
kubectl describe ingress <ingress-name> -n <namespace-name>
此命令会显示出配置的详细信息和相关的事件。查找配置中的错误、缺少SSL证书的情况或路由方面的问题等。
要测试 pod 之间的连接,您可以在一个 pod 中使用 curl
和 ping
命令来检查与另一个 pod 的连接。
kubectl exec -it <source-pod-name> -n <namespace-name> -- curl <destination-service>:<port> # 执行命令以从源Pod向目标服务发送curl请求,需要将命名空间名称和Pod名称替换为实际值。
要是连接出了问题,可能意味着更深层次的网络问题,比如防火墙规则拦截了流量,或者网络策略设置不当。
• 4. 高级调试工具来调试
除了 kubectl
,还有一些专门的工具来解决生产中的复杂问题。
kubectl-debug
工具允许你启动一个用于调试的容器(如 busybox
或 alpine
),并将其附加到现有的 Pod 上,从而让你有更多的灵活性来检查运行时的环境。
使用 kubectl 调试命令:kubectl debug <pod-name> -n <namespace-name> --image=busybox --target=<container-name>。例如,如果你想调试一个名为 my-pod 的 pod,你可以使用 kubectl debug my-pod -n my-namespace --image=busybox --target=my-container
。
此工具特别适合处理需要管理员权限或原容器中缺少的其他工具的问题。
k9s
是一个基于终端的用户界面工具,用于与 Kubernetes 集群进行交互。它提供实时查看 pod、服务及其他资源的功能,让快速发现和解决问题变得更加容易。
k9s
k9s
的一大优点是它能在一个界面上显示日志、事件和配置,显著加快了调试工作的速度。
k9s命令的截图
kail
是一个基于终端的用户界面工具,用于与 Kubernetes 集群进行交互。它能实时显示所选命名空间中的 pod 日志。
kail -n danielscool # 这个命令是给danielscool的
kail 命令行位于 danielscool 命名空间
调试 Kubernetes 生产问题需要采取系统化的方法,并有效利用手头的工具。通过使用上述提到的 kubectl
命令,你可以快速发现问题并采取适当措施。记住,关键是先进行全面诊断,然后再深入细节。
分享您的经历,并随意分享您在生产环境中调试您的Kubernetes集群时使用的其他技巧和工具。祝调试顺利!
我在本书中分享了这些内容及更多,这本书在亚马逊有售:https://amzn.eu/d/4R3gf5j
我是Hervé-Gaël KOUAMO,HK-TECH的创始人兼首席技术官,我们是一家位于法国的科技公司,专注于设计、构建和优化应用程序。我们还帮助企业顺利完成云端迁移,确保无缝迁移并最大化其数字潜力。您可以在LinkedIn上关注我(我主要用法语发文):https://www.linkedin.com/in/herv%C3%A9-ga%C3%ABl-kouamo-157633197/