iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Kubernetes中如何使用临时容器进行故障排查
  • 437
分享到

Kubernetes中如何使用临时容器进行故障排查

2023-06-29 14:06:10 437人浏览 安东尼
摘要

小编给大家分享一下kubernetes中如何使用临时容器进行故障排查,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言容器及其周围的生态系统改变了工程师部署、维护

小编给大家分享一下kubernetes中如何使用临时容器进行故障排查,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

前言

容器及其周围的生态系统改变了工程师部署、维护和排查工作负载故障的方式。但是,在 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 podsNAME                                READY   STATUS    RESTARTS   AGEnginx-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.8PING 8.8.8.8 (8.8.8.8): 56 data bytes64 bytes from 8.8.8.8: seq=0 ttl=112 time=9.797 ms64 bytes from 8.8.8.8: seq=1 ttl=112 time=9.809 ms^C/ # nc --helpBusyBox v1.34.1 (2021-11-11 01:55:05 UTC) multi-call binary.Usage: nc [OPTioNS] HOST PORT  - connectnc [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 auxPID   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/nginxconf.d koi-utf mime.types nginx.conf uwsgi_params fastcgi_params koi-win modules scgi_params win-utf

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

以上是“Kubernetes中如何使用临时容器进行故障排查”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Kubernetes中如何使用临时容器进行故障排查

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-14
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-14
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-14
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-14
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-14
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-14
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-14
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-14
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-14
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-14
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作