简介
在本实验中,你将学习与运行中 Pod 交互的基本方法。这些是 Kubernetes 中的核心调试技能,因为工作负载通常分布在多个位置,不像本地进程那样可以直接查看。
本实验将介绍三项强大的调试技能:
- 日志:读取应用程序的运行记录,了解它正在报告什么。
- Exec:进入容器内部查看环境并执行命令。
- 端口转发:创建一条临时隧道,从本地计算机访问应用程序。
这些技能是 DevOps 工程师和开发者都必须掌握的基础技能。完成本实验后,你将能够更有信心地排查运行中的 Pod。
查看日志
在本步骤中,你将学习如何检查运行中 Pod 的日志。可以把日志理解为应用程序的「声音」。如果出现问题,日志通常是查找线索的第一处位置。
在底层,kubectl logs 通常会读取主容器进程写入标准输出和标准错误的内容。因此,许多容器化应用程序会将日志输出到终端,而不是写入本地文件。在 Kubernetes 中,平台更容易统一收集和提供终端输出。
实验环境会在后台为你启动一个名为 my-nginx 的 Pod。首先,等待 Pod 创建完成:
until kubectl get pod my-nginx > /dev/null 2>&1; do sleep 2; done
然后等待容器就绪:
kubectl wait --for=condition=ready pod/my-nginx --timeout=300s
现在确认 Pod 正在运行:
kubectl get pods
你应该会看到 my-nginx,其状态为 Running。如果它还没有就绪,请稍等片刻后重试。
Pod 运行后,使用 kubectl logs 命令查看容器输出到标准输出的内容:
kubectl logs my-nginx
Nginx 是稳定的 Web 服务器,因此刚开始可能比较安静,输出内容很少,或者只显示一条表示已准备好接受连接的消息。
如需实时查看日志,可以添加 -f(follow,跟随)选项:
kubectl logs -f my-nginx
此时你会看到光标停留在终端中,等待新消息。这适合实时观察流量。按 Ctrl+C 停止跟随日志,并返回命令行提示符。
进入容器执行命令
在本步骤中,你将不再局限于查看日志,而是要在 Pod 内部执行命令。你可能需要检查配置文件是否存在、确认某个工具是否已安装,或者从 Pod 内部测试网络连接。
你可以使用 kubectl exec 命令完成这些操作。它可以在运行中的容器内执行命令。我们通常使用它打开交互式 shell,从而进入容器内部。
这里有一个重要区别:kubectl exec 不会像 SSH 那样把你「移动」到另一台机器。它会请求节点上的 kubelet,在已经运行的容器内启动一个新进程。因此,你看到的是容器的文件系统和环境,而不是本地终端的环境。
运行以下命令,在 my-nginx Pod 内打开 bash shell:
kubectl exec -it my-nginx -- /bin/bash
下面解释这些选项:
-i(Interactive,交互式):保持输入打开,以便你输入内容。-t(TTY):分配伪终端,使其看起来像普通的命令行提示符。--:告诉 kubectl「从这里开始的所有内容都是要在容器内执行的命令,而不是 kubectl 的参数」。
命令行提示符应该会变成类似 root@my-nginx:/# 的形式。现在,你已经进入 Kubernetes 集群中的指定容器!
尝试列出当前目录中的文件,以确认你已进入新的环境:
ls -F
你看到的是 Nginx 容器内的文件,这些文件与 LabEx 工作区中的文件完全分开。
检查环境
在本步骤中,你将检查容器内部的环境。常见的调试任务之一,是确认容器运行的操作系统(OS)。这有助于你了解哪些命令(例如 apt 或 apk)可用。
这也体现了容器中的一个常见规律:容器镜像决定了可用的用户空间工具和文件。两个 Pod 可能都是「Linux」,但由于其中一个镜像基于 Debian,另一个基于 Alpine,还有一个几乎不包含任何 shell 工具,它们之间仍可能存在很大差异。
当命令行提示符仍为 root@my-nginx:/# 时,运行以下命令读取 OS 发行版信息文件:
cat /etc/os-release
你将看到用于标识 Linux 发行版的输出,通常是「Debian GNU/Linux」。这是因为官方 Nginx 镜像构建在 Debian 之上。
探索完成后,需要退出容器并返回主终端。输入:
exit
命令行提示符将恢复为 labex:~/project。
为确认你已完成本次检查,创建名为 os_version.txt 的文件,并将你找到的 OS 名称(例如「Debian」)写入该文件。
echo "Debian" > ~/project/os_version.txt
端口转发
在本步骤中,你将通过端口转发访问 Nginx Pod。默认情况下,Pod 彼此隔离。它们就像封闭社区中的房屋:可以相互通信,但外部人员(例如在本地终端操作的你)无法轻易访问它们。
要从本地计算机访问 my-nginx 中运行的 Web 服务器,可以使用端口转发创建一条「临时隧道」。
端口转发是调试便利功能,并不是生产环境发布应用程序的常规方式。它会在当前工作站与某个 Pod 之间创建一条临时隧道。由于不需要创建完整的 Service 或修改外部网络策略,因此非常适合检查和快速测试。
运行以下命令,将本地端口 8080 转发到 Pod 的端口 80:
kubectl port-forward my-nginx 8080:80 &
注意末尾的 &! 它会告诉 Linux 在后台运行该进程。如果没有这个符号,命令会占用终端,你必须先停止它才能继续输入其他内容。
你应该会看到类似 Forwarding from 127.0.0.1:8080 -> 80 的消息。
现在,可以通过这条隧道使用 curl 访问 Nginx 网页:
curl localhost:8080
你应该会看到「Welcome to nginx!」页面的 HTML 代码。成功!你已经通过隧道访问了集群内部,并从中获取了数据。
总结
在本实验中,你练习了调试 Kubernetes 应用程序所需的三项基本技能:
- 日志:使用
kubectl logs检查应用程序的输出。 - Exec:使用
kubectl exec进入容器环境,检查文件并执行命令。 - 端口转发:使用
kubectl port-forward在本地访问内部服务。
这些工具就像你的听诊器和 X 光机。每当 Kubernetes 中出现问题时,你都会首先使用它们来诊断问题。


