如何像专业人士一样调试 Kubernetes 应用程序错误(一)

2023年 9月 12日 73.3k 0

在当今迅速发展的技术景观中,从单体架构迁移到微服务架构正变得越来越普遍。然而,对于那些在这个领域经验较少的人来说,适应这些新资源可能会带来重大的挑战。

无论您是开发团队、DevOps、基础设施还是其他技术团队的一部分,本文都将为您提供关于如何优化您的调试过程的有价值的见解。

您将了解到我个人使用的工具和策略,这些都是为了节省时间并提高调试微服务时的效率。

继续阅读以发现关于如何像专家一样调试微服务的专家建议和技巧!

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等

调试Kubernetes中的错误的关键是对应用程序有完美的理解。这不仅仅是知道其他应用程序之间存在依赖关系,或者需要暴露某个端口,或者需要连接到同一个Kubernetes集群中的另一个应用程序。

要真正成功地调试Kubernetes错误,关键是要完全沉浸在开发者的世界中,并深入了解这些应用程序是如何工作的,以及它们为了正常运行需要什么。这样,您将更有能力处理可能出现的任何错误,并确保您的应用程序顺利高效地运行。

因此,请花时间充分了解您的应用程序及其依赖关系,您将大大提高成为Kubernetes调试专家的速度!

本文主要关注的是当您的应用程序已经在Kubernetes中并且遇到问题时该怎么做,而不是应用程序本身存在错误或外部因素阻碍它时该怎么做。我们还将介绍一些常见的错误情境。

在调试方面,我有两种方法,取决于应用的关键性和熟悉程度:自上而下和自下而上。

自上而下的方法

当我们熟悉该应用,并确信问题出在Kubernetes方面时,我们会使用这种方法,而紧急呼叫和解决问题是优先考虑的。

我们首先要查看入口。

图片

从上图中我们可以看到,用户试图通过一个名为“testing.jjotah.com”的域名连接到Kubernetes的入口。通常,如果出现错误,是因为用户无法连接到应用程序,或者他们遇到了一些应用程序错误。从图中可以看出,当发生错误时,用户尝试与入口建立连接,这可能是或可能不是问题所在。

我将与您分享一些对我非常有效的命令。

  • nc → 一个用于在两个计算机网络之间读取和写入数据的命令行工具 
  • curl → 一个命令行工具,可以通过终端在设备和服务器之间交换数据 
  • kubectl → 一个命令行工具,用于使用Kubernetes API与Kubernetes集群的控制平面通信。(别名k) 

在这种情况下,我们尝试使用nc命令检查端口是否开放。

nc -v test.jjotah.com 443

在调试与端口域验证相关的问题时,考虑所有涉及的因素是很重要的。在这种情况下,当出现“未知的名称或服务”错误时,我建议按照以下步骤操作:

1.在您的域名提供商中验证DNS设置。 对于这个场景,我们需要确认域名“test.jjotah.com”指向了ingress控制器创建的负载均衡器。为了检查这一点,我们可以使用“dig”命令,并确认它指向了我们的kind集群中使用MetalLB创建的负载均衡器的IP,如图所示。

在我的情况下,我没有创建DNS,所以在创建DNS后,我将DNS名称指向了我的负载均衡器IP地址。

dig test.jjotah.com | grep test.jjotah.com

2.确保集群级别的外部网络连接已正确配置。 这意味着需要审查可能影响客户端机器的DNS的任何安全设置或其他因素,特别是如果问题只影响一个人。通过仔细检查所有这些因素,我们可以有效地调试这个问题,并尽快使我们的应用程序重新运行。

INGRESS部分

当我们已经创建了DNS,我们可以再次测试到“443端口”的连接。

图片

现在这个问题是“无法到达主机”,所以我建议检查:

  • 用户和ingress之间是否有东西,如防火墙、CDN或在集群外工作的东西
  • Ingress定义
  • kubectl get ing
    

    这里我们找到了第一个问题:我们正在做检查,看看“443端口”是否开启,我们是否可以访问“80端口”,所以我们必须尝试“80端口”。

    如果检查“80端口”你还是遇到同样的问题,也许你应该从自下而上的方法开始。

    首先检查容器。我们知道,在Kubernetes中,最小的资源是包含容器的pods。因此,我们需要检查pod是否正确运行。假设你正在你的应用程序所在的命名空间工作,我们可以使用以下命令检查pod的状态:

    kubectl get ing
    

    图片

    在这种情况下,应用程序重启了三次,最后一次重启是六分钟前。因此,我们需要确定问题的根本原因。为此,执行以下命令,用你的应用程序pod的名字替换POD-NAME。

    kubectl logs POD-NAME
    
    kubectl describe pod POD-NAME
    
    kubectl get events
    

    检查是否有任何错误,如果没有,你可以切换到kube-system命名空间,检查主要组件,在以下pods上执行相同的命令。

    • ETCD
    • Apiserver
    • Controller-Manager
    • Scheduler

    图片

    如果问题仍然存在,你可能需要连接到容器来检查应用程序。尽管以下命令已被弃用,但它仍然可以用来连接到容器:

    kubectl exec -it POD-NAME bash
    

    图片

    在容器内部,我们需要检查我们的应用程序是否正在运行(在我的情况下,我检查了“nginx”是否正在运行并公开了正确的端口)。我们可以在localhost上使用curl命令来验证应用程序在容器级别是否正常工作。

    curl localhost
    

    图片

    但是,有些容器可能没有安装像curl/nc/telnet这样的命令或执行它们所需的权限。这些容器被称为无发行版的。在这种情况下,最好在我们的应用程序定义中创建一个Sidecar,以安装调试所需的所有内容。

    如果我们只有一个带有“nginx”的pod,我们应该将它转换为部署并添加一个sidecar来调试它。为此,我们可以删除“nginx”pod并创建一个部署定义。

    kubectl delete pod nginx
    

    在下一部分,我们将继续学习如何像专家一样调试。

    作者:JJotah

    更多技术干货请关注公众号 “云原生数据库”

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论