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

VSole2022-03-21 07:31:54

容器及其周围的生态系统改变了工程师部署、维护和排查工作负载故障的方式。但是,在 Kubernetes 集群上调试应用程序有时可能会很困难,因为你可能在容器中找不到所需的调试工具。

许多工程师使用基于精简、发行版构建无发行版的基础镜像,其中甚至没有包管理器或shell。甚至一些团队使用 scratch 作为基础镜像,并且只添加应用程序运行所需的文件。这种常见做法的一些原因是:

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

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

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

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

临时容器的配置

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

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

启动临时容器

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

kubectl debug -it  --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 命令时,可以看到一个新字段 "Ephemeral Containers",此部分包含临时容器及其属性。

$ kubectl describe pods 

...
...
Ephemeral Containers:
  debugger-thwrn:
    Container ID:   containerd://eec23aa9ee63d96b82970bb947b29cbacc30685bbc3418ba840dee109f871bf0
    Image:          busybox
    Image ID:       docker.io/library/busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353
    Port:           
    Host Port:      

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

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

$ kubectl debug -it  --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容器
本作品采用《CC 协议》,转载必须注明作者和本文链接
第一个已知的挖掘 Dero 硬币的加密劫持操作被发现针对具有暴露 API 的易受攻击的 Kubernetes 容器编排器基础设施。
CrowdStrike的云威胁研究团队在CRI-O(一个支撑Kubernetes容器运行时引擎)中发现了一个新的漏洞(CVE-2022-0811),被称为“cr8escape”。
报告称,许多攻击者使用被动扫描,利用 Shodan 等服务或 Nmap 等工具查找托管 Docker 守护程序或 Kubernetes 容器编排平台的服务器,试图使用窃取的凭据或漏洞攻击这些平台。此外,创建和使用容器的开发人员往往不关注安全性。报告指出,一个新的蜜罐在五小时内遭到第一次攻击。2021 年,攻击者的重点似乎将从破坏单个容器转向由 Kubernetes 或 K8s 管理的容器集群。
他们直接联系AWS API,进一步枚举帐户,进而收集信息和泄露数据。不幸的是,AWS集群角色错误配置,拥有过大的读取权限。本意是允许读取特定的S3存储桶,但权限允许角色读取帐户中的一切,这使攻击者得以进一步了解AWS帐户,包括Lambda。受影响的AWS帐户中有不同的Lambda函数,主要与帐户自动化有关。还有证据表明攻击者执行了盗取的软件。
戴尔科技集团2021年全球数据保护指数(GDPI)调查结果显示,由于勒索软件的持续威胁以及云原生应用、Kubernetes容器和人工智能等新兴技术的使用,各组织正面临着一些数据保护挑战。
·严格遵守法规,确保网络安全。在安全策略定期升级或安全漏洞的情况下,旧证书将会无效。根据NIST的规定,美国所有非军事、政府机构和供应商必须遵守联邦信息处理标准。类似地,系统和组织控制标准规定了服务组织处理客户数据的方式。因此,对于任何在北美以外运营的公司来说,遵守诸如FIPS和SOC-2之类的法规是很重要的。
搭建 k8s docker 漏洞环境
Palo Alto Networks宣布了一种新的下一代防火墙,该防火墙使用机器学习帮助组织检测和阻止威胁。这些最新版本的防火墙操作系统PAN-OS ,预计将在7月中旬上市。该公司表示,PAN-OS 带来了70多种新功能,包括改进的针对未知恶意软件和网络钓鱼攻击的保护,简化的TLS解密,对受感染设备的自动隔离和实时签名流可以更快地进行检测。PAN OS 还引入了CN系列防火墙,这是专门为Kubernetes容器环境设计的。
据外媒报道,思科于本周三发布了 16 项安全警告,其中包括 3 个 CVSSv3 严重程度评分为满分 10 分的高危漏洞,根据思科介绍,这 3 个漏洞分别是思科全数字化网络架构中心(Cisco DNA Center)的一个后门帐户和两个认证系统的 bypass。 Cisco DNA Center 是一款针对企业客户的软件,它提供了一个中央系统,用于在大型网络中设计和部署设备配置。
大家或许都发现了,开发人员愈发依赖开源代码来快速为其专有软件添加功能。据估计,开源代码占专有应用程序代码库的 60-80%。相伴而来的,除了更高的效率,还有更高的风险。因此,管理开源代码对于降低组织的安全风险至关重要。那么,如何管理开源代码呢? 软件成分分析(SCA)又是如何管理开源代码的呢?开发人员的任务是比以往更快地创建功能强大且可靠的应用程序。为了实现这一目标,他们严重依赖开源代码
VSole
网络安全专家