Containers

目录

理解 Containers

请参考 Kubernetes 官方网站文档:Containers

Container 是一个轻量级、可执行的软件包,包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。虽然 Pod 是最小的可部署单元,但 containers 是 Pod 内的核心组件。

理解 Ephemeral Containers

调试 Containers
请参考 Kubernetes 官方网站文档:Ephemeral Containers

Kubernetes 的 Ephemeral Containers 功能提供了一种强大的方式,通过向现有 Pod 注入专用的调试工具(系统、网络和磁盘工具)来调试正在运行的 containers。

虽然通常可以使用 kubectl exec 直接在运行中的 container 内执行命令,但许多生产环境的 container 镜像故意保持精简,可能缺少关键的调试工具(例如 bash、net-tools、tcpdump),以减小镜像体积和攻击面。Ephemeral Containers 解决了这一限制,提供了一个预配置的环境,内置丰富的调试工具,非常适合以下场景:

  • 故障诊断:当主应用 container 出现问题(如意外崩溃、性能下降、网络连接异常)时,除了查看标准的 Pod 事件和日志外,通常需要在 Pod 的运行环境中进行更深入的交互式排查。
  • 配置调优与实验:如果当前应用配置表现不佳,可能需要临时调整组件设置或测试新配置,直接在运行中的 container 内观察即时效果并制定改进方案。

实现原理:利用 Ephemeral Containers

调试功能是通过 Ephemeral Containers 实现的。Ephemeral Container 是一种专门用于内省和调试的特殊 container。它与现有的主 containers 共享 Pod 的网络命名空间和进程命名空间(如果启用),可以直接与应用进程交互和观察。

你可以动态地向运行中的 Pod 添加一个 Ephemeral Container(例如 my-app-debug),并使用其预装的调试工具。该 Ephemeral Container 的诊断结果直接关联于同一 Pod 内主应用 containers 的行为和状态。

:::Notes * 不能通过直接修改 Pod 的静态清单(PodSpec)来添加 Ephemeral Container。Ephemeral Containers 功能设计用于动态注入运行中的 Pods,通常通过 API 调用(如 kubectl debug)实现。 * 通过调试功能创建的 **Ephemeral Containers** 不具备资源(CPU/内存)或调度保证(即不会阻塞 Pod 启动,也没有独立的 QoS 类别),且退出后不会自动重启。因此,避免在其中运行持久业务应用,它们仅限于调试用途。 * 如果 Pod 所在的 Node 正处于高资源利用率或接近资源枯竭状态,使用调试功能时需谨慎。即使 Ephemeral Container 资源占用极小,也可能在严重资源压力下加剧 Pod 被驱逐的风险。 :::

使用 CLI 调试 Ephemeral Containers

Kubernetes 1.25+ 提供了 kubectl debug 命令来创建 ephemeral containers。此方法为调试提供了强大的命令行替代方案。

命令

kubectl debug -it <pod-name> --image=<debug-image> --target=<target-container-name> -n <namespace>
# --image:指定包含必要工具的调试镜像(例如 busybox、ubuntu、nicolaka/netshoot)。
# --target:(可选)指定 Pod 中目标 container 的名称。若省略且只有一个 container,则默认该 container;若有多个,则默认第一个。
# -n:指定命名空间。

Pod YAML 文件示例

示例:调试 my-nginx-pod 中的 nginx

  • 首先,确保有一个正在运行的 Pod:

    kubectl apply -f pod-example.yaml
  • 现在,在 my-nginx-pod 内创建一个名为 debugger 的 ephemeral 调试 container,目标为 my-nginx-container,使用 busybox 镜像:

    kubectl debug -it my-nginx-pod --image=busybox --target=nginx -- /bin/sh

    该命令会将你连接到 debugger ephemeral container 内的 shell,可以使用 busybox 工具调试 my-nginx-container。

  • 查看 Pod 附加的 ephemeral containers:

    kubectl describe pod my-nginx-pod

    在输出中查找 Ephemeral Containers 部分。

使用 Web 控制台调试 Ephemeral Containers

  1. 进入 Container Platform,在左侧导航栏选择 Workloads > Pods

  2. 找到想要查看的 Pod,点击 ⋮ > Debug

  3. 选择 Pod 中想要调试的具体 container。

  4. (可选)如果界面提示需要 初始化(例如设置必要的调试环境),点击 Initialize

    INFO

    初始化 Debug 功能后,只要 Pod 未被重建,即可直接进入 Ephemeral Container(例如 Container A-debug)进行调试。

  5. 等待调试终端窗口准备就绪,开始调试操作。
    提示:点击终端右上角的“命令查询”选项,可查看常用调试工具及其使用示例。

    INFO

    点击右上角的命令查询查看常用工具及用法。

  6. 调试完成后,关闭终端窗口。

与 Containers 交互

你可以使用 kubectl exec 命令直接与运行中的 container 内部实例交互,执行任意命令行操作。此外,Kubernetes 还提供了方便的文件上传和下载功能。

使用 CLI 与 Containers 交互

Exec

在 Pod 中的特定 container 内执行命令(例如获取 shell、运行诊断命令等):

kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- <command>
# -it:确保交互模式和伪终端(TTY),适合 shell 会话。
# -c:指定 Pod 中目标 container 名称。Pod 仅有一个 container 时可省略。
# --:分隔 kubectl 参数和容器内执行的命令。
  • 示例:进入 my-nginx-podnginx 的 Bash shell

    kubectl exec -it my-nginx-pod -c nginx -n default -- /bin/bash
  • 示例:列出 container /tmp 目录下的文件

    kubectl exec my-nginx-pod -c nginx -n default -- ls /tmp

文件传输

  • 从本地复制文件到 Pod 中的 container:

    kubectl cp <local-file-path> <namespace>/<pod-name>:<container-file-path> -c <container-name>
    # -c:(可选)指定 Pod 中目标 container 名称(多 container Pod 时需要)。
    
    # 示例:上传 my-config.txt 到 Nginx 的 HTML 目录
    kubectl cp my-config.txt default/my-nginx-pod:/usr/share/nginx/html/my-config.txt -c nginx
  • 从 Pod 中的 container 复制文件到本地:

    kubectl cp <namespace>/<pod-name>:<container-file-path> <local-file-path> -c <container-name>
    
    # 示例:下载 Nginx 访问日志
    kubectl cp default/my-nginx-pod:/var/log/nginx/access.log ./nginx_access.log -c nginx

使用 Web 控制台与 Containers 交互

通过 Applications 进入 Container

你可以使用 kubectl exec 命令进入 container 内部实例,在 Web 控制台窗口执行命令行操作。同时,支持文件上传和下载功能,方便在 container 内传输文件。

  1. 进入 Container Platform,在左侧导航栏选择 Application > Applications

  2. 点击 Application Name

  3. 找到关联的工作负载(如 Deployment、StatefulSet),点击 EXEC,然后选择想要进入的具体 Pod Name。再选择 EXEC > Container Name

  4. 输入想要执行的命令。

  5. 点击 OK,进入 Web 控制台窗口,执行命令行操作。

  6. 点击 File Transfer

    • 输入 Upload Path,将本地文件上传到 container(例如测试用配置文件)。
    • 输入 Download Path,将日志、诊断数据或其他文件从 container 下载到本地进行分析。

通过 Pod 进入 Container

  1. 进入 Container Platform,在左侧导航栏选择 Workloads > Pods

  2. 找到目标 Pod,点击其旁边的垂直省略号(⋮),选择 EXEC,然后选择该 Pod 中想要进入的具体 Container Name。

  3. 输入想要执行的命令。

  4. 点击 OK,进入 Web 控制台窗口,执行命令行操作。

  5. 点击 File Transfer

    • 输入 Upload Path,将本地文件上传到 container(例如测试用配置文件)。
    • 输入 Download Path,将日志、诊断数据或其他文件从 container 下载到本地进行分析。