深入理解Kubernetes Pod调试

调试运行中的容器和Pod不像直接调试进程那么容易,本文介绍了通过临时容器共享命名空间的方式调试业务容器进程的方法。原文: Debugging Kubernetes Pods: Deep Dive

Zan@Unsplash
Zan@Unsplash

调试pod最简单的方法是在有问题的pod中执行命令,并尝试排除故障。这种方法很简单,但有许多缺点。

  • 正在运行的应用pod可能没有排除现有问题所需的所有工具。
  • 如果想执行一些需要额外权限的操作,需要重新启动应用pod,以添加新的权限。
  • 在docker镜像中添加调试工具会引入安全风险,提升容器权限也是如此。

因此,我们需要探索其他调试pod的方法。

使用临时调试容器进行调试

kubectl exec不够用时(比如容器已经崩溃,或者容器镜像没有包含调试实用程序,比如distroless镜像),或者正在运行的pod没有调试所需的特权时,[临时容器(ephemeral container)](https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/ "临时容器(ephemeral container "临时容器(ephemeral container)")")对于交互式故障排除非常有用。

临时容器背后的主要思想是,K8S将具有选定自定义镜像的新容器添加到现有pod中,而不需要重新启动该pod。这个新的容器可以共享目标容器的资源,包括:

  • Linux网络命名空间
  • Linux进程命名空间
  • 访问共享卷
  • 访问K8S节点

我将为每个用例提供一个示例。

在开始演示前,需要有一个版本为1.23的k8s集群,建议使用```kind```[1],但也可以使用其他任何配置器。

我们从创建演示集群开始。

创建kind集群

创建新集群很简单,只需运行命令kind create cluster

示例: alt

一旦创建了集群,需要验证是否启动并可访问。

示例: alt

所有操作都将从主kind节点执行,所以需要通过docker exec -it <kind-container-id> bash访问。

示例: alt

创建简单工作负载

假设需要调试Nginx,我们创建一个单副本Nginx部署,通过运行以下命令来完成。

kubectl create deployment nginx --image=nginx
alt
诊断网络故障

诊断网络故障需要共享网络命名空间。当将临时容器附加到运行中的pod时,这是默认的Linux命名空间。

接下来我们创建第一个临时容器,使用nicolaka/netshoot作为新的临时容器的镜像,该镜像包含许多故障排除工具,如tcpdumpstrace

kubectl debug -it pod-name --image=<ephemeral-container> -- command

示例: alt

我们确认一下两个容器共享相同的Linux命名空间。在主节点上打开一个新shell,并运行此命令:

systemd-cgls -u kubelet-kubepods-besteffort.slice

示例: alt

从上面的例子中,可以得到两个容器的主进程ID:

  • 2612 -> 临时容器的主进程ID
  • 2259 -> Nginx容器的主进程ID

接下来,检查每个进程的Linux命名空间。

alt

从截图中可以发现,两个进程具有相同的Linux网络命名空间ID。

现在我们从临时容器中抓取Nginx容器的网络数据包。

从临时容器shell运行此命令:

tcpdump -n port 80

示例: alt

现在,试着从k8s主节点向这个pod发送一些请求。

curl http://pod-ip-adderss
alt

现在观察临时容器终端,会发现TCP报文会被打印出来:

alt

第一个演示完成,现在我们可以从临时容器捕获网络数据包了。

接下来看第二个用例。

利用临时容器跟踪/分析进程

下一个用例是从临时容器跟踪应用容器中运行的进程。

为此,我们需要:

  • 这两个容器必须共享相同的Linux进程命名空间。
  • 临时容器必须具有Linux capability SYS_PTRACE

创建临时容器时,通过添加额外参数--target <container-name>,可以轻松共享Linux进程命名空间。

kubectl debug -it <pod-name > --image=nicolaka/netshoot --target <container-name> -- bash

示例: alt

正如上面截图可以看到:

  1. 为了共享进程命名空间,需要添加额外的命令行参数 --target <container-name>
  2. 从临时容器中,可以看到 nginx容器中所有正在运行的进程
  3. 因为临时容器没有 ptrace系统调用所需权限,因此无法跟踪 nginx进程。该系统调用被 strace命令用来暂停Linux进程,记录 nginx发送给内核的每个系统调用。

如何解决这个问题?很不幸,我没有找到从kubectl命令向临时容器传递额外权限的方法。因此,我们将构造并发送HTTP请求到kube API服务器,而不使用kubectl命令。

curl -v -XPATCH -H "Content-Type: application/json-patch+json" \
'http://127.0.0.1:8001/api/v1/namespaces/default/pods/nginx-8f458dc5b-wkvq4/ephemeralcontainers' \
--data-binary @- << EOF
[{
"op""add""path""/spec/ephemeralContainers/-",
"value": {
"command":[ "/bin/sh" ],
"stdin"true"tty"true,
"image""nicolaka/netshoot",
"name""debug-strace",
"securityContext": {"capabilities": {"add": ["SYS_PTRACE"]}},
"targetContainerName""nginx" }}]
EOF

现在可以在权限不被拒绝的情况下调用strace

alt

本例给临时容器添加了执行SYS_PTRACE的权限,但具体给什么权限取决于所用的调试器,或者简单点可以给临时容器特权访问,从而不需要担心需要允许哪个系统调用。

另外,可以从临时容器访问nginx容器的文件系统。根文件系统位于/proc/<process-id>/root目录下。

我们看看是否可以从临时容器访问nginx配置。

示例: alt

好了,接下来我们看一下临时容器的最后一个用例。

通过节点上的shell进行调试

有时候我们需要访问k8s节点,但却没有对节点的ssh或控制台访问权限。

这时候可以通过临时容器访问节点。

kubectl debug node/<node-name> -it --image=<image-name>

在节点上创建调试会话时,请记住:

  • kubectl debug会根据节点名称自动生成新Pod的名称。
  • 容器运行在主机IPC、Network和PID命名空间中。
  • 节点根文件系统将挂载在 /host上。

如果希望临时容器的根文件系统与节点相同,只需要将chroot /host

示例: alt

延伸阅读
Debug Running Pods[2]
Manage containers in namespaces by using nsenter[3] Debugging With Ephemeral Containers[4]

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

参考资料

[1]

kind: https://kind.sigs.k8s.io

[2]

Debug Running Pods: https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod

[3]

Manage containers in namespaces by using nsenter: https://www.redhat.com/sysadmin/container-namespaces-nsenter

[4]

Debugging With Ephemeral Containers: https://static.sched.com/hosted_files/kccnceu2022/70/Ephemeral_Containers.pdf

- END -

本文由 mdnice 多平台发布

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

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

相关文章

软件定制开发的优势与步骤|APP搭建|小程序

软件定制开发的优势与步骤|APP搭建|小程序 定制开发的优势&#xff1a; 1. 满足特定需求&#xff1a;定制开发可以根据客户的实际需求进行设计和开发&#xff0c;使得软件系统能够更好地满足客户的业务目标。 2. 优化用户体验&#xff1a;通过深入了解客户的需求&#xff0c;定…

视频监控管理平台/视频汇聚/视频云存储EasyCVR安全检查的相关问题及解决方法3.0

智能视频监控系统/视频云存储/集中存储/视频汇聚平台EasyCVR具备视频融合汇聚能力&#xff0c;作为安防视频监控综合管理平台&#xff0c;它支持多协议接入、多格式视频流分发&#xff0c;视频监控综合管理平台EasyCVR支持海量视频汇聚管理&#xff0c;可应用在多样化的场景上&…

若依前端使用

初始化页面时&#xff0c;路由上加参数 1. 多个菜单对应一个页面&#xff0c;默认查询的数据状态不一样 vue 页面上 通过 debugger; 查看所有的参数&#xff0c; 最后取到了 2. Vue warn]: Error in callback for immediate watcher “fileList”: “TypeError: Cannot read p…

双系统ubuntu20.04(neotic版本)从0实现Gazebo仿真slam建图

双系统ubuntu20.04(neotic版本)从0实现Gazebo仿真slam建图 昨晚完成了ROS的多机通讯&#xff0c;还没来得及整理相关操作步骤&#xff0c;在进行实际小车的实验之前&#xff0c;还是先打算在仿真环境中进行测试&#xff0c;熟悉相关的操作步骤&#xff0c;计划通过虚拟机&…

【深度学习】 Python 和 NumPy 系列教程(九):NumPy详解:1、创建数组的n种方式

目录 一、前言 二、实验环境 三、NumPy 0. 多维数组对象&#xff08;ndarray&#xff09; a. 多维数组的属性 1. 创建数组 a. 使用numpy.array函数&#xff1a; b. 使用numpy.zeros函数 c. 使用numpy.ones函数 d. 使用numpy.arange函数 e. 使用numpy.linspace函数 …

2023Q2全球可穿戴腕带出货量达 4400 万台

全球可穿戴设备市场在2023年第二季度继续保持增长态势&#xff0c;总出货量达到了4400万台&#xff0c;同比增长了6%。这一增长得益于消费者对于可穿戴设备的需求不断增加&#xff0c;以及不同细分市场的需求反弹。 根据市场研究机构 Canalys 的最新报告&#xff0c;全球可穿戴…

Android EditText筛选+选择功能开发

在日常开发中经常会遇到这种需求&#xff0c;EditText既需要可以筛选&#xff0c;又可以点击选择。这里筛选功能用的是AutoCompleteTextView&#xff0c;选择功能使用的是第三方库https://github.com/kongzue/DialogX。 Android AutoCompleteTextView(自动完成文本框)的基本使用…

【物联网】简要解释RTK(Real-Time Kinematic)>>实时动态差分定位

引言&#xff1a; RTK&#xff08;Real-Time Kinematic&#xff09;技术是一种基于差分GPS的高精度定位技术&#xff0c;它通过实时通信和数据处理&#xff0c;能够提供厘米级甚至亚米级的定位精度。RTK技术在许多领域都得到了广泛应用&#xff0c;如测绘、航空航天、农业等。本…

详解Nacos和Eureka的区别

文章目录 Eureka是什么Nacos是什么Nacos的实现原理 Nacos和Eureka的区别CAP理论连接方式服务异常剔除操作实例方式自我保护机制 Eureka是什么 Eureka 是Spring Cloud 微服务框架默认的也是推荐的服务注册中心, 由Netflix公司与2012将其开源出来,Eureka基于REST服务开发,主要用…

【C++STL基础入门】list改、查操作

文章目录 前言一、list查操作1.1 迭代器循环1.2 for_each函数 二、list改操作2.1 迭代器修改2.2 assign函数2.3 运算符 总结 前言 C标准模板库&#xff08;STL&#xff09;是C语言中非常重要的部分&#xff0c;它提供了一组通用的模板类和函数&#xff0c;用于处理常见的数据结…

七、运算符

运算符 1.运算符1.1.赋值运算符1.2.算数运算符1.3.自增和自减运算符1.4.比较运算符1.5.逻辑运算符1.6.位运算符1.6.1.按位与运算1.6.2.按位或运算1.6.3.按位取反运算1.6.4.按位异或运算1.6.5.移位操作1.6.6.复合赋值运算符1.6.7.三元运算符1.6.8.运算符优先级 1.7.训练11.8.训练…

win系统环境搭建(九)——Windows安装chatGPT

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;九&#xff09;——Windows安装chatGPT 本系列windows环境搭建开始讲解如何给win系统搭建环境&#xff0c;本人所用系统是腾讯云服务器的Windows Server 2022&#xff0c;你可以理解成就是你用的windows…

上位机在自动化控制中的作用和优势是什么?

上位机在自动化控制中的作用和优势是什么&#xff1f; 自动化控制编程领域包括单片机、PLC、机器视觉和运动控制等方向。输入“777”&#xff0c;即刻获取关于上位机开发和数据可视化的专业学习资料&#xff0c;近年来&#xff0c;上位机编程逐渐兴起&#xff0c;正在逐步替代…

亚马逊、敦煌网、国际站自养号测评需要哪些资源与技术门槛?

测评服务商说的天花乱坠&#xff0c;实际真假难辨&#xff0c;FB等社交软件自找测评犹如大海捞针。产品都要上架了&#xff0c;靠谱的测评服务还是没找到&#xff0c;亚马逊测评求人不如求己&#xff0c;今天来教你怎么养一批安全、可控的买家号。 亚马逊等跨境平台测评自养号…

【运维篇】三、SLF4J与Logback

文章目录 0、Java的门面设计模式1、SLF4J2、作用3、调试4、SpringBoot采用SLF4JLogback5、切换SpringBoot的日志框架6、logback的配置加载7、logback的配置组成8、logback之logger9、logback之appender10、logback之pattern11、appender的Filter12、logback.xml全解释13、logba…

【校招VIP】测试方案之测试需求分析

考点介绍&#xff1a; 需求分析就是要弄清楚用户需要的是什么功能&#xff0c;用户会怎样使用系统。这样我们测试的时候才能更加清楚的知道系统该怎么样运行&#xff0c;才能更好的设计测试用例&#xff0c;才能更好的测试。 测试方案之测试需求分析-相关题目及解析内容可点击…

Qt事件处理

1. 事件 众所周知Qt是一个基于C的框架&#xff0c;主要用来开发带窗口的应用程序&#xff08;不带窗口的也行&#xff0c;但不是主流&#xff09;。我们使用的基于窗口的应用程序都是基于事件&#xff0c;其目的主要是用来实现回调&#xff08;因为只有这样程序的效率才是最高…

优化系统报错提示信息,提高人机交互(一)

1、常规报错及处理 package com.example.demo.controller;import com.example.demo.service.IDemoService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.w…

机器视觉应用系统包括哪些硬件?

导语&#xff1a;机器视觉是一个软硬件相结合的综合技术&#xff0c;需要软件对图像做处理&#xff0c;也需要硬件提供稳定和高质量的图像&#xff0c;两者同样重要。作为开发&#xff0c;软件模块比较熟悉&#xff0c;硬件系统的相关知识储备弱一些&#xff0c;本文对机器视觉…

卷运维不如卷网络安全

最近发现很多从事运维的选择了辞职&#xff0c;重新规划自己的职业发展方向。运维工程师这个岗位在IT行业里面确实是处于最底层的&#xff0c;不管什么环节出现问题&#xff0c;基本都是运维背锅。背锅也就罢了&#xff0c;薪资水平也比不上别的岗位。 一般运维的薪资水平大多数…