为什么 Kubernetes 调试如此成问题?

在 Kubernetes 集群中调试应用程序问题通常感觉就像在迷宫中穿行。容器在设计上是短暂的,一旦部署就不可改变。当出现问题并且我们需要深入研究问题时,这会带来独特的挑战。在深入研究调试工具和技术之前,必须掌握核心问题:为什么直接修改容器实例是个坏主意。这篇博文将带您了解 Kubernetes 调试的复杂性,提供见解和实用技巧,以有效地排除 Kubernetes 环境故障。

Kubernetes 的问题

视频

容器的不可变性

Kubernetes 的基本原则之一是容器实例的不变性。这意味着一旦容器运行,就不应该改变它。动态修改容器可能会导致不一致和不可预测的行为,尤其是当 Kubernetes 协调这些容器的生命周期并根据需要替换它们时。想象一下,当您试图诊断问题时,却发现您正在调查的容器已被修改,这使得很难一致地重现问题。

这种不变性背后的想法是确保容器的每个实例都与任何其他实例相同。这种一致性对于实现可靠、可扩展的应用程序至关重要。如果你开始修改容器,就会破坏这种一致性,导致一个容器的行为与另一个容器的行为不同,即使它们应该是相同的。

kubectl exec 的局限性

我们通常使用以下命令开始 Kubernetes 之旅:

$ kubectl -- exec -ti <pod-name>

这样就可以登录到容器中,感觉就像使用 SSH 访问传统服务器一样。但是,这种方法有很大的局限性。容器通常缺少基本的诊断工具——没有vim,没有traceroute,有时甚至没有 shell。对于那些习惯于功能齐全的 Linux 环境的人来说,这可能是一个沉重的打击。此外,如果容器崩溃,kubectl exec由于没有正在运行的实例可以连接,它将变得毫无用处。此工具不足以进行彻底的调试,尤其是在生产环境中。

想象一下,登录容器后发现甚至无法打开一个简单的文本编辑器来检查配置文件,这是多么令人沮丧的事情。缺乏基本工具意味着您通常只有很少的选项来诊断问题。此外,许多容器镜像的简约性(旨在减少其攻击面和占用空间)加剧了这个问题。

避免直接修改

虽然使用 之类的命令动态安装缺失的工具可能很诱人apt-get install vim,但这种做法违反了容器不变性的原则。在生产中,动态安装软件包可能会引入新的依赖项,从而可能导致应用程序故障。风险很高,因此维护部署清单的完整性至关重要,确保所有配置都是预定义且可重现的。

想象一下,生产中的快速修复需要安装缺失的软件包。这可能会解决眼前的问题,但可能会导致无法预料的后果。新软件包引入的依赖项可能会与现有依赖项冲突,从而导致应用程序不稳定。此外,这种方法使得重现确切的环境变得具有挑战性,而这对于调试和扩展应用程序至关重要。

进入临时容器

解决上述问题的关键在于临时容器。Kubernetes 允许在与您需要调试的应用程序容器相同的 pod 中创建这些临时容器。这些临时容器与主应用程序隔离,确保任何修改或安装的工具都不会影响正在运行的应用程序。

临时容器提供了一种在不违反不变性和一致性原则的情况下绕过限制的方法kubectl exec。通过在同一个 pod 中启动单独的容器,您可以在不改变其状态的情况下检查和诊断应用程序容器。这种方法可以保持生产环境的完整性,同时为您提供有效调试所需的工具。

使用 kubectl debug

该kubectl debug命令是一个功能强大的工具,可简化临时容器的创建。kubectl exec与登录到现有容器不同,kubectl debug它会在同一命名空间内创建一个新容器。此容器可以运行不同的操作系统、挂载应用程序容器的文件系统并提供所有必要的调试工具,而无需更改应用程序的状态。此方法可确保您即使原始容器无法运行也可以检查和诊断问题。

例如,让我们考虑使用临时 Ubuntu 容器调试容器的场景:

kubectl debug <myapp> -it <pod-name> --image=ubuntu --share-process --copy-to=<myapp-debug>

此命令会在同一 pod 中启动一个基于 Ubuntu 的新容器,从而提供完整的环境来诊断应用程序容器。即使原始容器缺少 shell 或崩溃,临时容器仍可正常运行,允许您执行必要的检查并根据需要安装工具。它依赖于我们可以在同一个 pod 中拥有多个容器的事实,这样我们就可以检查被调试容器的文件系统而无需实际进入该容器。

临时容器的实际应用

为了说明这一点,让我们深入研究一下如何在实际场景中使用临时容器。假设您有一个容器由于神秘问题而不断崩溃。通过部署带有一整套调试工具的临时容器,您可以监控日志、检查文件系统和跟踪进程,而不必担心原始容器环境的限制。

例如,您可能会遇到应用程序容器由于未处理的异常而崩溃的情况。通过使用kubectl debug,您可以创建一个与原始容器共享相同网络命名空间的临时容器。这允许您捕获网络流量并对其进行分析,以了解是否存在与连接或数据损坏相关的任何问题。

安全注意事项

虽然临时容器降低了影响生产环境的风险,但它们仍然存在安全风险。限制对调试工具的访问并确保只有授权人员才能部署临时容器至关重要。对这些系统的访问要像交出基础设施的钥匙一样谨慎。

临时容器本质上可以访问 pod 内的敏感信息。因此,必须实施严格的访问控制和审计日志,以跟踪谁在部署这些容器以及正在采取哪些操作。这可确保调试过程不会引入新的漏洞或暴露敏感数据。

插曲:可观察性的作用

kubectl exec虽然和等工具kubectl debug对于故障排除非常有用,但它们并不能替代全面的可观察性解决方案。可观察性让您可以实时监控、跟踪和记录应用程序的行为,从而无需进行侵入式调试会话即可更深入地了解问题。

这些工具并不适合日常调试:该角色应由各种可观察性工具承担。我将在下一篇文章中更详细地讨论可观察性。

命令行调试

kubectl exec虽然和这样的工具非常kubectl debug有用,但有时你需要深入研究应用程序代码本身。这时我们就可以使用命令行调试器了。命令行调试器允许你以非常精细的级别检查应用程序的状态,逐步执行代码、设置断点和检查变量状态。就我个人而言,我并不经常使用它们。

例如,Java 开发人员可以使用jdbJava 调试器,它类似于C/C++ 程序。以下是您在 Kubernetes 环境中gdb如何使用的基本概述:jdb

1. 设置调试

首先,您需要在启用调试的情况下启动 Java 应用程序。这通常涉及向 Java 命令添加调试标志。但是,正如我在此处的帖子中所讨论的那样,还有一种更强大的方法,不需要重新启动:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar myapp.jar

2. 端口转发

由于调试器需要连接到应用程序,因此您将设置端口转发以将 pod 的调试端口公开到本地计算机。这很重要,因为JDWP 很危险:

kubectl port-forward <pod-name> 5005:5005

3. 连接调试器

完成端口转发后,您现在可以连接jdb到远程应用程序:

jdb -attach localhost:5005

在这里,您可以使用jdb命令设置断点、逐步执行代码和检查变量。此过程允许您调试代码本身的问题,这对于诊断通过日志或表面检查无法立即发现的复杂问题非常有用。

连接标准 IDE 进行远程调试

到目前为止,我更喜欢 IDE 调试。除了演示之外,我从未将 JDB 用于任何其他用途。现代 IDE 支持远程调试,通过利用 Kubernetes 端口转发,您可以将 IDE 直接连接到 pod 内正在运行的应用程序。

要设置远程调试,我们从与命令行调试相同的步骤开始。配置应用程序并设置端口转发。

1.配置IDE

在您的 IDE(例如 IntelliJ IDEA、Eclipse)中,设置远程调试配置。将主机指定为,localhost将端口指定为5005。

2. 开始调试

在 IDE 中启动远程调试会话。现在,您可以直接在 IDE 中设置断点、逐步执行代码和检查变量,就像调试本地应用程序一样。

结论

调试 Kubernetes 环境需要结合传统技术和专为容器编排设计的现代工具。了解kubectl exec临时容器的局限性和优势可以显著增强您的故障排除过程。但是,最终目标应该是在您的应用程序中构建强大的可观察性,减少临时调试的需求并实现主动问题检测和解决。

通过遵循这些准则并利用正确的工具,您可以自信而准确地应对 Kubernetes 调试的复杂性。在本系列的下一篇文章中,我们将深入探讨 Kubernetes 中的常见配置问题以及如何有效解决这些问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/28754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openlayers 使用WMTS和XYZ加载天地图切片服务

openlayers 使用WMTS和XYZ加载天地图切片服务 本篇介绍一下使用openlayers加载天地图切片&#xff0c;两种方法&#xff1a; 使用WMTS使用XYZ 1 需求 openlayers加载天地图 2 分析 主要是不同类型source的使用 WMTS&#xff08;Web Map Tile Service&#xff09; 是 OGC…

一道全等三角形证明题

接着上次那道题 一道初中一年级几何题解析&#xff0c;再来做一道初中一年级下半学期几何题目&#xff1a; 傍晚丢垃圾散步时看到小小的学生学习群里丢了这个题目&#xff0c;想到一个解法。实在构造不出契合题干阅读材料结论的三角形&#xff0c;索性先根据这结论做一个推论…

ByteTrack

1. 论文中伪代码表示的流程图 2. 简要版 此图源自&#xff1a; ByteTrack多目标跟踪原理&#xff0c;白老师人工智能学堂 3. 详细版 根据ByteTrack-CPP-ncnn代码的数据流画的较为详细的流程图&#xff1a; 4. ByteTrack-CPP-ncnn的UML类图 Reference ByteTrack多目标跟踪原…

Excel小技巧| 批量多列多行转为一列

前期刘小生Star分享了Excel批量一列转多列多行&#xff0c;你学会了嘛&#xff01; 前期刘小生遇到需“对多列对行数据合并并找到唯一不重复的信息”&#xff0c;今天举一反三&#xff0c;继续沿用“替换等号”方法&#xff0c;将多列多行转为一列&#xff01; 下面一个模拟案…

xml与动态SQL

XML映射文件 规范 XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。 ● XML映射文件的namespace属性为Mapper接口全限定名一致。 ● XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。 动态SQL &…

Excel批量一列转多列多行

你在公司或学校是否遇到过对人员进行分组&#xff0c;你是否曾一个一个复制粘贴&#xff0c;如只有100人&#xff0c;尚有时间一一分组&#xff0c;如1000人&#xff0c;甚至更多&#xff0c;不知分到“地老天荒”是否可以完成&#xff01; 今天刘小生分享一个方法“用替换等号…

环信beta版鸿蒙IM SDK发布!深度适配HarmonyOS NEXT系统

环信beta版鸿蒙IM SDK已正式发布&#xff01;欢迎有需求开发者体验集成&#xff01; 版本亮点 提供原生鸿蒙 SDK&#xff0c;支持原生 ArkTS 语言&#xff0c;全面拥抱鸿蒙生态提供鸿蒙系统上单聊、群聊、会话等能力和服务覆盖消息管理、用户属性、群租管理、离线推送.多设备…

【Echarts系列】平滑折线面积图

【Echarts系列】平滑折线面积图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 平滑折线面积图如图所示&#xff1a; 数据格式 data [{name: 2020年,value: 150},{name: 2021年,value: 168},{name: 2…

tmux 移植到ARM板端运行环境搭建

tmux源码下载&#xff1a; Home tmux/tmux Wiki GitHub 依赖的库代码下载&#xff1a; libevent&#xff1a; ncurses: 第一步&#xff1a;将以上三个代码解压放在同一个目录下&#xff0c;逐个编译 1. cd ./libevent-2.1.12-stable ./configure --host"arm-nextvp…

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷 题目总数&#xff1a;16 总分数&#xff1a;100 单选题 第 1 题 单选题 默认小猫角色&#xff0c;以下哪个Scratch程序可以在点击绿旗后让小猫说”你好!"一共10秒? A. B. C. D. 第 2 题 单选题 …

50etf期权交易规则杠杆怎么计算?

今天带你了解50etf期权交易规则杠杆怎么计算&#xff1f;近年来&#xff0c;期权交易在股票市场中变得愈发流行&#xff0c;其中50ETF期权备受关注。作为一种金融衍生品&#xff0c;50ETF期权为投资者提供了更灵活的投资方式和更多的策略选择。 50etf期权交易规则杠杆怎么计算&…

CCF 矩阵重塑

第一题&#xff1a;矩阵重塑&#xff08;一&#xff09; 本题有两种思路 第一种 &#xff08;不确定是否正确 但是100分&#xff09; #include<iostream> using namespace std; int main(){int n,m,p,q,i,j;cin>>n>>m>>p>>q;int a[n][m];for(i…

现代易货:创新交易模式引领物品交换新潮流

在繁华的现代经济浪潮中&#xff0c;物品交换的文化逐渐崭露头角&#xff0c;引领了一种新颖的交易潮流——现代易货交易模式。这种模式不仅是对古老“以物易物”交易的现代化诠释&#xff0c;更是对物品价值多元化和交换方式创新的深入探索。那么&#xff0c;现代易货交易究竟…

员工入职平台ChiefOnboarding

什么是 ChiefOnboarding &#xff1f; ChiefOnboarding 是一个免费开源的员工入职平台。您可以通过 Slack 或门户网站让新员工入职。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 chiefonboarding &#xff0c;选择第一个 chiefonboarding/chiefonboarding&#xff0c…

R语言dplyr统计指定列里面种类个数和比例

输入数据框&#xff1a;dfuorf&#xff0c;Type列有uORF和overlpaORF两种类型 dfuorf1 <- dfuorf %>%group_by(Type) %>% summarise(Countn()) %>% mutate(percentCount/sum(Count)) %>% mutate(percent1 (paste0(round((Count/sum(Count)), 2)*100,"%&…

示例:WPF中使用DecodePixelHeight和DecodePixelWidth优化Image性能

一、目的&#xff1a;在使用Image控件时&#xff0c;如果图片太大或者图片数量过多时加载出来的程序内存会非常的大&#xff0c;但一般图片多时我们只要预览缩略图就可以&#xff0c;查看时再显示原图&#xff0c;这个时候需要通过通过设置BitmapImage的DecodePixelHeight和Dec…

YOLOv5目标检测——基于YOLOv5的吊车安全监测

移动式起重机是建筑施工中使用的重要设备。 遵守正确的操作程序对于防止事故很重要。 然而&#xff0c;其中存在人为错误的因素。 这里我将举一个例子来说明计算机视觉&#xff08;CV&#xff09;如何帮助解决这个问题。 1、移动式起重机操作的安全问题 为简单起见&#xff0…

MySQL 离线安装客户端

1. 官方网址下载对应架构的安装包。 比如我的是centOs 7 x64。则需下载如图所示的安装包。 2. 安装 使用如下命令依次安装 devel , client-plugins, client. rpm -ivh mysql-community-*.x86_64.rpm --nodeps --force 在Linux系统中&#xff0c;rpm是一个强大的包管理工具&…

Python基础教程(二十四):日期和时间

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

springboot弘德图书馆座位预约管理系统-计算机毕业设计源码07028

摘 要 在面对当今培育人才计划的压力&#xff0c;人们需要汲取更多的不同领域的知识来不断扩充自己的知识层面&#xff0c;因此他们对学习的欲望不断扩大&#xff0c;图书馆作为我们的学习宝地&#xff0c;有着不可替代的地位。但是在信息化时代&#xff0c;传统模式下的图书馆…