K8s容器debug高级技巧

使用 kubectl exec 执行指令

如果您在 Kubernetes 上运行软件,您会想要在某些时候去调试您所部署的软件的一些方面。对于习惯于使用虚拟机 (VMs) 的人来说能自然使用的一种简单的调试方法,就是连接到一个正在运行的 pod,然后进行解译:
 

kubectl exec -it podname -c containername -- bash

 
这通常行之有效,而且非常管用。然而,至少有两种 Kubernetes "最佳实践 "限制了 exec 的实用性:
 

  • 不以 root 用户身份运行。容器尽可能以最少的特权运行,甚至可能使用随机的用户标识符 (UID) 运行。
     
  • 最小化镜像。镜像尽可能小,你甚至可以将二进制文件写入到 distroless image。
     

当应用这些最佳实践时,使用 kubectl exec连接到您的容器要么不可行,要么进入到不适合进行调试的环境。
 

kubectl exec 指令不允许指定用户标志或能力以启动进程,而是会从目标容器的主指令中复制这些设置。

 

调试容器

在解决运行容器问题时,Kubernetes 提供了一种原生化调试策略,即使用 kubectl debug。调试指令会在运行中的 pod 中启动一个新的容器。这个新容器能够以不同的用户身份以及从您选择的任何镜像去运行。由于调试容器与目标容器位于同一个 pod 中运行(因此在同一个节点上),两者之间不需要绝对的隔离。调试容器可以与同一 pod 中运行的其他容器共享系统资源。
 

考虑去检查在 pod postpod中的容器 postcont里运行的 PostgreSQL 数据库的 CPU 使用情况。这个 pod 并不以 root 用户身份运行,并且 Postgres 镜像没有安装类似 top 或 htop 的工具,也就是说,kubectl exec指令几乎没有作用。您可以按照以下的指令去运行:
 

kubectl debug -it \ --container=debug-container \ --image=alpine \ --target=postcont \ postpod

 
您将以 root 身份登录(这是 Alpine 镜像的默认设置),并可以轻松安装您最喜欢的交互式进程查看器 htop (apt add htop)。您与 postcont容器共享同一个进程命名空间,可以查看并甚至终止在此运行的所有进程!当您退出进程时,临时容器也会终止。
 

如果希望调试容器与 postcont共享相同的进程命名空间,即使 postcont是在 postpod中运行的唯一容器,指定 --target是不具备选择性的 (non-optional)。
 
您可以按 CTRL+P CTRL+D 断开与临时容器/bash 会话 (session) 的连接,而无需退出 (终止) 它。再使用 kubectl attach即可重新连接。
 
kubectl debug提供的功能比这里概述的更多,比如使用一个修改后的启动指令复制 pods,或通过访问节点文件系统的启动一个 "节点 (node) " pod。

 

原理解释

以上的 kubectl debug指令是通过创建临时容器 (ephemeral container) 来实现。这些容器应在现有 pod 中临时运行,以支持故障排除等操作。“普通”容器和临时容器之间的区别很小。而查看 Kubernetes 在创立之初所做的基础架构选择最能让我们理解使用临时容器的原因:
 

Pod 应该是一次性的、可替换的,并且 Pod 规范也是不可改变的。

 
当 Kubernetes 主要用于部署无状态工作负载时,这一点更加合理——因为此时 pod 本身会被认为是临时的。在这个 Kubernetes 中它可能会受到限制。Pod 规范保持不变,但 Kubernetes 会将临时容器作为 Pod 的子资源建模。与“普通”容器不同,临时容器不属于 Pod 规范的一部分

 

挂载卷 (volumes)

内置指令 kubectl debug非常有用。它允许您在运行的 pod 中添加一个临时容器,并可选择与运行中的容器共享进程命名空间。不过,如果您希望使用 kubectl debug来检查或修改运行中容器文件系统的某个部分,那就不走运了——因为调试 pod 的文件系统与您将其连接到的容器的文件系统是分离的。幸运的是,我们可以做的更好。原理很简单:
 

  • 读取正在运行的目标容器的规范。
     
  • 将一个临时容器填充到 pod 中。将其配置成与目标容器共享相同的进程命名空间,并包含相同的卷挂载。

 

因为没有用于创建临时容器的 kubectl 命令,所以我们需要构建一个 PATCH 请求到 K8s API 来创建它。kubectl proxy指令允许访问 K8s API。这一过程对用户来说并不太友好,因此将这一过程封装到脚本或 kubectl 插件中是合理的。您可以在这里找到这样一个脚本实现示例:
 

https://github.com/JonMerlevede/kubectl-superdebug?source=post_page-----2ba160c47ef5------

 
需要注意的是,这种方法和脚本可以很容易地扩展到从目标容器中复制环境变量的规范。如果您将此脚本保存为 kubectl-superdebug,并将其放在您的路径上,就可以在任何地方以 kubectl superdebug的形式运行,如下所示:

 
还可以尝试扩展此脚本,将目标容器的其他方面复制到调试容器中,例如环境变量引用。

 

至此,Kubernetes 本机调试运行中的容器的方法概述就完成了,应该能满足大多数人的需求。
 

非 Kubernetes 原生方法

Kubernetes 不提供以 root 身份连接到正在运行的容器的方法(除非主进程以 root 身份运行),也不提供从另一个容器访问容器根文件系统的方法。但这并不意味着这些事情不可能做到。毕竟, Kubernetes 只是一个位于容器化引擎之上的容器编排器。如果出于某种原因,确实有必要的话,您通常可以通过移除抽象层来做任何您想做的事。
 

如果您使用的是 Docker 引擎,并且可以直接从节点或通过节点上运行的特权容器访问您的引擎,那么您就可以运行 docker exec --user,并以您选择的用户身份执行一个进程。

 

kubectl sshkubectl exec-user等插件实现了这种方法。但遗憾的是,containerd 和 CRI-O 等现代引擎不再提供 --user这样标志功能,这意味着这些插件无法在当下的 Kubernetes 安装上运行。
 

不过,即使是这些现代引擎,通常也只是与 Linux 命名空间接口。通过输入相应的 Linux 命名空间集,您可以在任何您想要的“容器”中运行指令。kpexec 工具实现了这种方法。它在与目标容器相同的节点上启动一个有权限的 pod,然后确定要针对哪些 (Linux) 命名空间,在这些 (Linux) 命名 空间中执行命令,最后将其输出流式传输到您的终端。作为额外的收获,它还能在目标容器的文 件系统之上叠加一套用于调试的工具。

 

与 kubectl exec 不同,kpexec 可以使用不同的 uid/gid 运行指令,甚至可以使用与容器主进程不同的功能。它与 containerd 和 cri-o 兼容。只是 kpexec 采用的方法有些笨重和脆弱,可能与集群的安全配置不兼容。但如果 kubectl (super) 调试无法满足您的需求,则值得考虑它。
 

需要注意,kpexec 使用 nsenter 是直接在命名空间中执行指令的。它与无处不在的容器运行时 runc 兼容,但与 Kata Containers 等运行时不兼容。

 

借助 Appilot 对话式诊断 K8s

Appilot 是一款面向 DevOps 场景的开源 AI 助手,它可以充分利用 AI 大语言模型的能力让用户直接输入自然语言进一步简化应用部署与管理体验。用户可以根据自身的需求和使用习惯,将 Appilot 集成到任意平台,进而实现通过输入自然语言即可调用后端平台的能力,轻松完成 Kubernetes debug 工作。
 
Appilot 项目地址 https://github.com/seal-io/appilot

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

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

相关文章

孩子还是有一颗网安梦——Bandit通关教程:Level 12 → Level 13

🕵️‍♂️ 专栏《解密游戏-Bandit》 🌐 游戏官网: Bandit游戏 🎮 游戏简介: Bandit游戏专为网络安全初学者设计,通过一系列级别挑战玩家,从Level0开始,逐步学习基础命令行和安全概念…

【算法】【动规】单词拆分

跳转汇总链接 👉🔗算法题汇总链接 1.4 单词拆分 🔗题目链接 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且…

飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型

5MW飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型,仿真运行速度快。 飞轮储能变流器采用双PWM环设计,并网电压电…

优先考虑静态成员类

在Java中,静态成员类(static nested class)是一种嵌套在另一个类中的类,且被声明为静态。静态成员类不依赖于外部类的实例,可以直接通过外部类的类名来访问。 优先考虑使用静态成员类的情况通常是当这个类与外部类的实…

ShenYu网关注册中心之HTTP注册原理

文章目录 1、客户端注册流程1.1、读取配置1.1.1、用于注册的 HttpClientRegisterRepository1.1.2、用于扫描构建 元数据 和 URI 的 SpringMvcClientEventListener 1.2、扫描注解,注册元数据和URI1.2.1、构建URI并写入Disruptor1.2.2、构建元数据并写入Disruptor1.2.…

【系统架构】集群、分布式概念及系统架构演进过程

集群、分布式概念: 对食物没有太高要求的人在肚子饿的时候一般都会选择去兰州拉面、沙县小吃等小饭馆,这类小饭馆有个很显著的特点:洗菜、切菜、炒菜都是同一个人完成,如果厨子不舒服可能饭馆还会歇业。而一些人流量较大的饭馆的分…

Axure的动态面板

目录 动态面板 什么是Auxre动态模板 动态模板的步骤 应用场景 实战案例 轮播图 多功能登录界面 主界面左侧菜单栏 动态面板 什么是Auxre动态模板 动态面板是Axure中的一个重要功能,它允许用户创建可交互的页面,并模拟用户与页面的交互。通过添加元素…

智能守护,数据安全稳中求胜!上海迅软DSE助力家具家电行业引领潮流!

随着中国经济的蓬勃发展,家具家电企业正迎来“精品制造”的时代,业内竞争日益激烈。为了提升产品竞争力、扩大市场占有率,企业亟需加强对自主品牌的安全建设,确保品牌的自主知识产权、产品生产资料以及销售信息等核心数据不受泄漏…

文本处理工具doctran(集成LLM和NLP库)

今天给大家推荐一款文本处理工具,可以Extract、Redact、Summarize、Refine、Translate、Interrogate,这个工具就是文档转换框架doctran。 欢迎关注公众号 doctran基于OpenAI的GPT模型和开源的NLP库来剖析文本数据。该工具也可以在LangChain框架document…

【HDFS】DFSPacket中lastPacketInBlock字段的关键作用

这篇文章介绍了DFSPacket对象的lastPacketInBlock字段相关的知识。 【HDFS Client】DFSPacket对象什么情况下是lastPacketInBlock? 本文继续深挖lastPacketInBlock这个字段在HDFS Client写数据时的重要作用。 可以这么说,如果这个lastPacketInBlock出问题的话,是会影响增量…

android 13.0 Launcher3禁止拖拽app图标到第一屏

1.概述 在13.0系统rom进行定制化开发Launcher3中,会对Launcher3 做些要求,比如现在的需求就是Launcher3第一屏的图标固定,不让其他屏的图标拖动到 第一屏所以说这个需求和 禁止拖拽图标到Hotseat类似,也是从WorkSpace.java里面寻找解决方案,然后实现相关功能 2.Launcher…

力扣64. 最小路径和

动态规划 思路: 假设 dp[i][j] 为 第 i 行、第 j 列的最小路径和;因为只能向右或者向下移动,所以状态转移方程: dp[i][j] min(dp[i - 1][j], dp[i][j - 1]) v[i][j]当 i 0 时,即第一行,只能向右移动&am…

【MODBUS】Modbus是什么?

Modbus协议,从字面理解它包括Mod和Bus两部分,首先它是一种bus,即总线协议,和12C、SP|类似,总线就意味着有主机,有从机,这些设备在同一条总线上。 Modbus支持单主机,多个从机&#xf…

Python (八)网络编程

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

​sys --- 系统相关的形参和函数​

该模块提供了一些变量和函数。这些变量可能被解释器使用,也可能由解释器提供。这些函数会影响解释器。本模块总是可用的。 sys.abiflags 在POSIX系统上,以标准的 configure 脚本构建的 Python 中,这个变量会包含 PEP 3149 中定义的ABI标签。…

最新CRMEB商城源码开源版v5.2.2版本+前端uniapp

CRMEB开源商城系统是一款全开源可商用的系统,前后端分离开发,全部100%开源,在小程序、公众号、H5、APP、PC端都能用,使用方便,二开方便!安装使用也很简单!使用文档、接口文档、数据字典、二开文…

java中 map和 json 字符串 互转

依赖包&#xff1a; <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId> </dependency>包&#xff1a; import com.fasterxml.jackson.core.JsonProcessingException; import com.fa…

鸿蒙(HarmonyOS)应用开发——保存应用数据(题目答案)

判断题 1.首选项是关系型数据库 错误(False) 2.应用中涉及到Student信息&#xff0c;如包含姓名&#xff0c;性别&#xff0c;年龄&#xff0c;身高等信息可以用首选项来存储。 错误(False) 3.同一应用或进程中每个文件仅存在一个Preferences实例。 正确(True) 单选题 …

边缘检测@获取labelme标注的json黑白图掩码mask

import cv2 as cv import numpy as np import json import os from PIL import Imagedef convertPolygonToMask(jsonfilePath):

探秘闭包:隐藏在函数背后的小秘密(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…