0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

K8s容器debug高级技巧

马哥Linux运维 来源:51CTO 2024-01-12 11:31 次阅读

使用 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 中运行的其他容器共享系统资源。

考虑去检查在 podpostpod中的容器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 ssh和kubectl 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 工作。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指令
    +关注

    关注

    1

    文章

    606

    浏览量

    35617
  • AI
    AI
    +关注

    关注

    87

    文章

    29780

    浏览量

    268063
  • 容器
    +关注

    关注

    0

    文章

    492

    浏览量

    22027
  • DEBUG
    +关注

    关注

    3

    文章

    89

    浏览量

    19845

原文标题:K8s容器debug高级技巧

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    摘要: 今天,日志服务再次升级Kubernetes(k8s)的日志解决方案。1分钟内即可完成整个集群部署,支持动态扩容,提供采集宿主机日志、容器日志、容器stdout等所有数据源的一站式采集。点此
    发表于 02-28 12:49

    K8S容器编排的互通测试

    K8S容器编排之NetWorkPolicy官方实例
    发表于 06-06 11:28

    OpenStack与K8s结合的两种方案的详细介绍和比较

    OpenStack与K8S结合主要有两种方案。一是K8S部署在OpenStack平台之上,二是K8S和OpenStack组件集成。
    的头像 发表于 10-14 09:38 2.7w次阅读

    k8s容器运行时演进历史

    在docker/k8s时代,经常听到CRI, OCI,containerd和各种shim等名词,看完本篇博文,您会有个彻底的理解。 典型的K8S Runtime架构 从最常见的Docker说起
    的头像 发表于 02-02 13:50 1887次阅读
    <b class='flag-5'>k8s</b><b class='flag-5'>容器</b>运行时演进历史

    Docker不香吗为什么还要用K8s

    Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了。 这时候就需要我们的主角 Kubernetes 上场了,先来了解一下 K8s 的基本概念,后面再介绍实践,由浅入深步步为营
    的头像 发表于 06-02 11:56 3393次阅读

    简单说明k8s和Docker之间的关系

    这篇文章主要介绍了k8s和Docker关系简单说明,本文利用图文讲解的很透彻,有需要的同学可以研究下 最近项目用到kubernetes(以下简称k8sks之间有
    的头像 发表于 06-24 15:48 3324次阅读

    K8S集群服务访问失败怎么办 K8S故障处理集锦

    问题1:K8S集群服务访问失败?     原因分析:证书不能被识别,其原因为:自定义证书,过期等。 解决方法:更新证书即可。 问题2:K8S集群服务访问失败? curl: (7) Failed
    的头像 发表于 09-01 11:11 1.6w次阅读
    <b class='flag-5'>K8S</b>集群服务访问失败怎么办 <b class='flag-5'>K8S</b>故障处理集锦

    K8S(kubernetes)学习指南

    K8S(kubernetes)学习指南
    发表于 06-29 14:14 0次下载

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    k8s是什么意思? kubernetes简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful
    发表于 07-19 13:14 1084次阅读

    什么是K3sK8sK3sK8s有什么区别?

    Kubernetes,通常缩写为 K8s,是领先的容器编排工具。该开源项目最初由 Google 开发,帮助塑造了现代编排的定义。该系统包括了部署和运行容器化系统所需的一切。
    的头像 发表于 08-03 10:53 7142次阅读

    k8s生态链包含哪些技术

    1. Apache APISIX Ingress 定义   在 K8s 生态中,Ingress 作为表示 K8s 流量入口的一种资源,想要让其生效,就需要有一个 Ingress Controller
    的头像 发表于 08-07 10:56 1145次阅读
    <b class='flag-5'>k8s</b>生态链包含哪些技术

    跑大模型AI的K8s与普通K8s的区别分析

    Kubernetes是一个在大量节点上管理容器的系统,其主要功能总结起来,就是在想要启动容器的时候,负责“找一个「空闲」节点,启动容器”。但是它默认考虑的启动因素(资源类)主要就是“CPU+内存”。就是
    发表于 09-03 12:07 849次阅读

    K8s多集群管理:为什么需要多集群、多集群的优势是什么

    随着K8s和云原生技术的快速发展,以及各大厂商在自己的数据中心使用K8s的API进行容器化应用编排和管理,让应用交付本身变得越来越标准化和统一化,并且实现了与底层基础设施的完全解耦,为多集群和混合云提供了一个坚实技术基础。
    发表于 09-14 10:48 1117次阅读
    <b class='flag-5'>K8s</b>多集群管理:为什么需要多集群、多集群的优势是什么

    K8S落地实践经验分享

    k8s 即 Kubernetes,是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。
    的头像 发表于 01-02 11:45 1002次阅读
    <b class='flag-5'>K8S</b>落地实践经验分享

    常用的k8s容器网络模式有哪些?

    常用的k8s容器网络模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s容器网络模
    的头像 发表于 09-19 11:29 176次阅读