返回顶部
首页 > 资讯 > 服务器 >Kubernetes中使用临时容器进行故障排查的方法
  • 799
分享到

Kubernetes中使用临时容器进行故障排查的方法

2024-04-02 19:04:59 799人浏览 薄情痞子
摘要

目录前言什么是临时容器? 临时容器的配置启动临时容器使用临时容器与临时容器共享进程命名空间结论前言 容器及其周围的生态系统改变了工程师部署、维护和排查工作负载故障的方式。但

前言

容器及其周围的生态系统改变了工程师部署、维护和排查工作负载故障的方式。但是,在 kubernetes 集群上调试应用程序有时可能会很困难,因为你可能在容器中找不到所需的调试工具。许多工程师使用基于精简、发行版构建无发行版的基础镜像,其中甚至没有包管理器或shell。甚至一些团队使用 scratch 作为基础镜像,并且只添加应用程序运行所需的文件。这种常见做法的一些原因是:

  • 具有较小的攻击区域。
  • 为了获得更快的扫描性能。
  • 减小了镜像大小。
  • 为了有更快的构建和更短CD/CI周期。
  • 减少依赖关系。

这些精简的基础镜像不包括用于对应用程序或其依赖项进行故障排查的工具。这是 Kubernetes 临时容器功能最大用途。临时容器允许创建包含可能需要的所有调试工具的容器镜像。一旦需要调试,就可以将临时容器部署到所选的正在运行的 Pod 中。

我们不能将容器添加到已部署的容器;您需要更新spec,并重新创建资源。但是,可以将临时容器添加到现有 Pod 中,以便对线上问题进行故障排查。

本文介绍如何使用临时容器进行Kubernetes上工作负载的问题排查。

什么是临时容器? 

临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启, 因此不适用于构建应用程序。 临时容器使用与常规容器相同的 ContainerSpec 节来描述,但许多字段是不兼容和不允许的。

  • 临时容器没有端口配置,因此像 ports,livenessProbe,readinessProbe 这样的字段是不允许的。
  • Pod 资源分配是不可变的,因此 resources 配置是不允许的。
  • 有关允许字段的完整列表,请参见 EphemeralContainer 参考文档。

临时容器是使用 api 中的一种特殊的 ephemeralcontainers 处理器进行创建的, 而不是直接添加到 pod.spec 段,因此无法使用 kubectl edit 来添加一个临时容器。

与常规容器一样,将临时容器添加到 Pod 后,将不能更改或删除临时容器。

临时容器的配置

临时容器与常规容器共享相同的spec。但是,某些字段被禁用,并且某些行为被更改。下面列出了一些重大变化;检查临时容器规范以获取完整列表。

  • 它们不会重新启动。
  • 不允许定义资源。
  • 不允许使用端口。
  • 不允许使用启动、活动和就绪探测。

启动临时容器

首先,检查是否启用了临时容器功能。

kubectl debug -it <POD_NAME> --image=busybox

如果未启用该功能,您将看到类似下面的消息。

Defaulting debug container name to debugger-wg54p.
error: ephemeral containers are disabled for this cluster (error from server: "the server could not find the requested resource").

将 EphemeralContainers=true 附加到 kubelet、kube-apiserver、kube-controller-manager、kube-proxy、kube-scheduler 参数中的--feature-gates=后, 例如:

...
--feature-gates=RemoveSelflink=false,EphemeralContainers=true
...

使用临时容器

现在,集群支持临时容器功能,让我们来试试吧。要创建临时容器,使用 kubectl 命令行工具的 debug 子命令。首先,创建一个Deployment

kubectl create deployment Nginx-deployment --image=nginx

获取需要debug的Pod的名称

$ kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-frsv9   1/1     Running   6          62d

以下命令将在 pod nginx-deployment-66b6c48dd5-frsv9 中创建一个新的临时容器。临时容器的镜像是busybox。-i 和 -t 参数允许我们附加到新创建的容器。

$ kubectl debug -it pods/nginx-deployment-66b6c48dd5-frsv9 --image=busybox

现在我们可以debug了

/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=112 time=9.797 ms
64 bytes from 8.8.8.8: seq=1 ttl=112 time=9.809 ms
^C
/ # nc --help
BusyBox v1.34.1 (2021-11-11 01:55:05 UTC) multi-call binary.
Usage: nc [OPTioNS] HOST PORT  - connect
nc [OPTIONS] -l -p PORT [HOST] [PORT]  - listen
...

当使用 kubectl describe pod <POD_NAME> 命令时,可以看到一个新字段 "Ephemeral Containers",此部分包含临时容器及其属性。

$ kubectl describe pods <POD_NAME>
...
...
Ephemeral Containers:
  debugger-thwrn:
    Container ID:   containerd://eec23aa9ee63D96b82970bb947b29cbacc30685bbc3418ba840dee109f871bf0
    Image:          busybox
    Image ID:       Docker.io/library/busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353
    Port:           <none>
    Host Port:      <none>

与临时容器共享进程命名空间

进程命名空间共享一直是一个很好的故障排查选项,此功能可用于临时容器。进程命名空间共享不能应用于现有容器,因此必须创建目标容器的副本。--share-processesflag 在与 --copy-to 一起使用时,可实现进程命名空间共享。这些标志将现有的 Pod spec定义复制到新定义中,并在spec中启用了进程命名空间共享。

$ kubectl debug -it <POD_NAME> --image=busybox --share-processes --copy-to=debug-pod

运行 ps 命令以查看正在运行的进程。正如您所期望的那样,您可以从 busybox 容器中看到 /pause,从 nginx-deployment 容器中看到 nginx 进程。

# ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 /pause
    6 root      0:00 nginx: master process nginx -g daemon off;
   11 101       0:00 nginx: worker process
   12 root      0:00 sh
   17 root      0:00 ps aux

使用进程命名空间,共享容器文件系统也是可访问的,这对于调试非常有用。您可以使用 /proc//root 链接访问容器。从上面的输出中,我们知道nginx的PID为6。

# ls /proc/6/root/etc/nginx
conf.d koi-utf mime.types nginx.conf uwsgi_params fastcgi_params koi-win modules scgi_params win-utf

在这里,我们可以看到目标容器上的Nginx目录结构和配置文件。

结论

临时容器功能无疑给调试排查问题带来了很大便利,而进程命名空间共享允许高级调试功能。如果你也使用在 Kubernetes 集群中运行的应用程序,那么值得花时间尝试这些功能。不难想象,一些团队甚至使用这些工具自动执行工作流,例如在readiness probes探针失败时自动修复其他容器。

到此这篇关于Kubernetes中使用临时容器进行故障排查的文章就介绍到这了,更多相关k8s故障排查内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Kubernetes中使用临时容器进行故障排查的方法

本文链接: https://lsjlt.com/news/143210.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Kubernetes中使用临时容器进行故障排查的方法
    目录前言什么是临时容器? 临时容器的配置启动临时容器使用临时容器与临时容器共享进程命名空间结论前言 容器及其周围的生态系统改变了工程师部署、维护和排查工作负载故障的方式。但...
    99+
    2024-04-02
  • Kubernetes中如何使用临时容器进行故障排查
    小编给大家分享一下Kubernetes中如何使用临时容器进行故障排查,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言容器及其周围的生态系统改变了工程师部署、维护...
    99+
    2023-06-29
  • Kubeflow使用Kubernetes进行机器学习的方法
    本篇内容主要讲解“Kubeflow使用Kubernetes进行机器学习的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Kubeflow使用Kubernetes进行机器学习的方法”吧!女主宣言...
    99+
    2023-06-04
  • Kubernetes上对应用程序进行故障排除的技巧有哪些
    这篇文章主要讲解了“Kubernetes上对应用程序进行故障排除的技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Kubernetes上对应用程序进...
    99+
    2024-04-02
  • 故障排查:阿里云轻量应用服务器中的MySQL容器自行停止
    博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录 问题...
    99+
    2023-08-24
    linux 阿里云 java mysql
  • ajax返回的json内容如何进行排序使用sort()方法实现
    ajax返回的json内容如何进行排序使用sort()方法实现,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 关键...
    99+
    2024-04-02
  • 使用 Loki 实现 Kubernetes 容器日志监控的方法
    目录一、基本介绍1.Loki 架构2.Loki 工作原理二、使用 Loki 实现容器日志监控1.安装 Loki2.安装 Promtail3.安装 Grafana4.验证一、基本介绍 ...
    99+
    2024-04-02
  • Mongodb中怎么使用sort()方法对数据进行排序
    这篇文章主要介绍Mongodb中怎么使用sort()方法对数据进行排序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python中使用sort()方法可以对列表排序,在编程数据库MongoDB中,排序方法也是sort...
    99+
    2023-06-14
  • 如何在ASP容器中使用Git进行实时协作?
    在现代软件开发中,团队协作已经成为了一种必不可少的方式。而Git作为一个强大的版本控制工具,也成为了各大团队协作的首选。本文将介绍如何在ASP容器中使用Git进行实时协作。 ASP容器是一种用于托管ASP.NET应用程序的容器。它可以运行...
    99+
    2023-08-28
    容器 实时 git
  • 如何进行Django中关联查询set.all() 方法的使用
    本篇文章给大家分享的是有关如何进行Django中关联查询set.all() 方法的使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。比如说有a b c三张表关系如下 a是b的父...
    99+
    2023-06-04
  • 最小权限的容器编排:编排器的使用方法探讨
      Docker 平台和容器已经成为打包、部署、和管理应用程序的标准。为了在一个集群内协调跨节点的容器,必须有一个关键的能力:一个容器编排器。container orchestrator  对于关键的集群化以及计划的任务,编排器是起重大作用...
    99+
    2023-06-04
  • Java stream sorted使用 Comparator 进行多字段排序的方法
    目录综述重写类的Comparable接口使用Comparator排序自然排序多字段排序注意事项Reference摘要:介绍使用Java Stream流排序器Comparator对Li...
    99+
    2023-03-06
    Java stream多字段排序 Java多字段排序
  • 教你使用docker查看运行中的容器
    下面先给大家介绍下docker 如何查看运行中的容器,内容如下所示: 列出所有在运行的容器信息: docker ps [root@enlich01 ~]# docker ps CON...
    99+
    2024-04-02
  • 怎么使用docker查看运行中的容器
    本文小编为大家详细介绍“怎么使用docker查看运行中的容器”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用docker查看运行中的容器”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。列出所有在运行的容器信...
    99+
    2023-06-30
  • Shell中建立与使用临时性文件的方法详解
    前言 在我们日常开发中经常会需要用到临时文件,本文就给大家介绍了关于Shell建立与使用临时性文件的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: 虽然使用管道可以省去建立临时性文件的...
    99+
    2022-06-04
    详解 文件 方法
  • mongodb中根据时间过滤进行查询的操作方法
    目录MongoDB中简单的根据时间过滤进行查询补充:如何根据日期过滤/查找MongoDB中的记录问题:如何根据日期过滤/查找MongoDB中的记录解答mongodb中简单的根据时间过滤进行查询 目的:查询当某天的文档信息...
    99+
    2023-05-12
    mongodb时间过滤查询 mongodb时间查询 mongodb时间过滤
  • Linux中使用wget进行下载的方法
    本篇内容主要讲解“Linux中使用wget进行下载的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux中使用wget进行下载的方法”吧!使用举例:1、下载单个文件代码如下:$ wget...
    99+
    2023-06-12
  • 大数据中对讲机使用过程中的常见故障及排除故障的解决方法是什么
    今天就跟大家聊聊有关大数据中对讲机使用过程中的常见故障及排除故障的解决方法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  对讲机使用过程中的常见故障及排除故障的解决方法  问...
    99+
    2023-06-05
  • 【服务器】无法进行ssh连接的问题逐一排查以及解决方法
    一、检查服务器网络 先检查是否是网络的问题。按快捷键Win+R,在弹出的对话框中输入cmd。 点击确定运行。在cmd窗口输入ping一下服务器的ip地址。 如果出现请求超时,解决办法如下: 在服务器端输入ifconfig命令,查看要连接...
    99+
    2023-08-18
    服务器 ssh 无法连接 报错
  • 服务器故障排除的瑞士军刀:利用监控数据进行诊断
    监控数据是服务器故障排除过程中的宝贵资源,可提供早期预警和深入见解: 第一步:识别异常 分析实时指标,如 CPU 利用率、内存使用情况和磁盘 I/O。 查找超出预设基线或阈值的异常值。 检查趋势和模式,以识别持续性或间歇性的问题。 第...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作