与 Pod 交互

KubernetesBeginner
立即练习

简介

在本实验中,你将学习与运行中 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 中出现问题时,你都会首先使用它们来诊断问题。