深入理解Kubernetes Pod调试

news2025/1/11 16:44:09

调试运行中的容器和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.coloradmin.cn/o/1017224.html

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

相关文章

TS泛型的使用

函数中使用泛型&#xff1a; function identity<T>(arg: T): T {return arg; }let result identity<number>(10); // 传入number类型&#xff0c;返回number类型 console.log(result); // 输出: 10let value identity<string>(Hello); // 传入string类型&a…

【微信小程序】scroll-view的基本使用

| scss里面的.item:nth-child(1) index.wxml <view class"scroll"> <scroll-view scroll-x><navigator url"" wx:for"{{6}}" wx:key"index" class"item"><image class"pic" src"/sta…

12.建造者模式

如果你需要将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示的意图时&#xff0c;我们需要应用于一个设计模式&#xff0c;‘建造者&#xff08;Builder&#xff09;模式’&#xff0c;又叫生成器模式。建造者模式可以将一个产品的内部表象…

差分方程模型:基金运作与管理

背景 诺贝尔奖 在他逝世的前一年&#xff0c;立嘱将其遗产的大部分(约920万美元)作为基金&#xff0c;将每年所得利息分为5份&#xff0c;设立物理、化学、生理或医学、文学及和平5种奖金(即诺贝尔奖)&#xff0c;授予世界各国在这些领域对人类作出重大贡献的人。其中炸药为最…

深度解析shell脚本的命令的原理之ls

ls是一个常用的Unix和Linux命令&#xff0c;它的功能是列出目录内容。当运行ls命令时&#xff0c;操作系统会执行一系列步骤&#xff0c;以获取和显示指定目录中的文件和子目录。以下是对这个命令的深度解析&#xff1a; 解析参数和选项&#xff1a;首先&#xff0c;ls命令会解…

微服务 第三章 Spring Cloud 简介

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 文章目录 系列文章目录[TOC](文章目录) 前言&#xff1a;Spring Cloud是一款基于 Spring Boot 实现的微服务框架1、Spring Cloud 的常用组件如下表所示。2、Spring…

每日一博 - 常见的数据结构

文章目录 概述图解Use Case 概述 &#x1f539; 链表&#xff08;List&#xff09;&#xff1a;用于保存Twitter的信息流。 &#x1f539; 栈&#xff08;Stack&#xff09;&#xff1a;支持文字编辑器的撤销/重做功能。 &#x1f539; 队列&#xff08;Queue&#xff09;&…

【李沐深度学习笔记】数据操作实现

课程地址 数据操作实现p2 数据操作 首先导入PyTorch包&#xff08;import torch)&#xff0c;虽然叫PyTorch&#xff0c;但实际上要导入torch。 import torch张量 张量表示的是一个数值组成的数组&#xff0c;这个数组可以有很多个维度。 # 生成0-11的顺序序列构成的一维…

海康威视热成像实时测温java - 23版

在20年写了一篇实时测温demo博客&#xff0c;看来帮了不少人。今天刚好又有需求&#xff0c;需要采温。也碰到了不少问题&#xff0c;特此记录 1、环境 摄像头&#xff1a;海康 型号&#xff1a;DS-2TD2528T-7/Q 序列&#xff1a;EA0406775 服务器&#xff1a;winServer J…

Leetcode168. Excel表列名称

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题解&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码如下&#xff1a; class Solution {public String convertToTitle(int columnNumber) {StringBuild…

【无公网IP】安装Wnmp并结合内网穿透,实现灵活可靠的外网访问内网服务!

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

pytorch迁移学习训练图像分类

pytorch迁移学习训练图像分类 一、环境配置二、迁移学习关键代码三、完整代码四、结果对比 代码和图片等资源均来源于哔哩哔哩up主&#xff1a;同济子豪兄 讲解视频&#xff1a;Pytorch迁移学习训练自己的图像分类模型 一、环境配置 1&#xff0c;安装所需的包 pip install …

工业检测 ocr

采用OpenCV和深度学习的钢印识别_菲斯奇的博客-CSDN博客采用OpenCV和深度学习的钢印识别[这个帖子标题党了很久&#xff0c;大概9月初立贴&#xff0c;本来以为比较好做&#xff0c;后来有事情耽搁了&#xff0c;直到现在才有了一些拿得出手的东西。肯定不会太监的。好&#xf…

RL 暂态电路与磁能

前言 RL 电路是一个电阻 R 和 自感线圈 L 组成的 RL 电路&#xff0c;在连接或者接通电源U 的时候&#xff0c;由于自感电动势的作用&#xff0c;电路中的电流不会瞬间改变&#xff0c;而是一个连续的渐变的过程&#xff0c;通常这个时间很短暂&#xff0c;所以被称为暂态过程…

MySQL 面试题——MySQL 基础

目录 1.什么是 MySQL&#xff1f;有什么优点&#xff1f;2.MySQL 中的 DDL 与 DML 是分别指什么&#xff1f;3.✨数据类型 varchar 与 char 有什么区别&#xff1f;4.数据类型 BLOB 与 TEXT 有什么区别&#xff1f;5.DATETIME 和 TIMESTAMP 的异同&#xff1f;6.✨MySQL 中 IN …

xss-labs实操

文章目录 1.Level2.Level23.Level34.Level45.Level56.Level67.Level78.Level89.Level910.Level1011.Level1112.Level1213.Level13 1.Level 无过滤法 2.Level2 “>闭合 “>&submit搜索 通过观察发现alert里的引号没了&#xff0c;是不是被过滤了呢 因为如果该语句类…

leetcode:69. x 的平方根

一、题目 函数原型&#xff1a;int mySqrt(int x) 二、思路 利用二分查找思想&#xff0c;在0与x区间进行查找。 设置左边界 left &#xff08;初始值为0&#xff09;&#xff0c;右边界 right&#xff08;初始值为x&#xff09;和中值 mid &#xff08;值为区间的中间值&#…

VCP-DCV VMware vSphere:安装、配置和管理[V8.x]

VMware官方授权合作活动&#xff0c;全国招生&#xff01; VCP-DCV VMware vSphere&#xff1a;安装、配置和管理[V8.x] 课程名称&#xff1a;VMware vSphere安装、配置和管理[V8.x] 培训课时&#xff1a;40课时 培训天数&#xff1a;5天 课程介绍&#xff1a;本课程重点讲…

MySQL优化技巧:提升数据库性能

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

盐碱地改良通用技术 铁尾砂改良学习

声明 本文是学习GB-T 42828.1-2023 盐碱地改良通用技术 第1部分&#xff1a;铁尾砂改良. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了铁尾砂改良盐碱地技术的技术原理&#xff0c;规定了技术要求、田间管理和效果评价。 本文…