查看 Pod 和节点

教程目标

  • 了解 Kubernetes Pod。
  • 了解 Kubernetes 节点。
  • 对已部署的应用进行故障排查。

Kubernetes Pod

模块 2 中创建 Deployment 时,Kubernetes 创建了一个 Pod 来托管你的应用实例。 Pod 是 Kubernetes 抽象出来的,表示一组一个或多个应用容器(如 Docker), 以及这些容器的一些共享资源。这些资源包括:

  • 卷形式的共享存储
  • 集群内唯一的 IP 地址,用于联网
  • 有关每个容器如何运行的信息,例如容器镜像版本或要使用的特定端口

Pod 为特定于应用的“逻辑主机”建模,并且可以包含相对紧耦合的不同应用容器。 例如,Pod 可能既包含带有 Node.js 应用的容器,也包含另一个不同的容器, 用于提供 Node.js 网络服务器要发布的数据。Pod 中的容器共享 IP 地址和端口, 始终位于同一位置并且共同调度,并在同一节点上的共享上下文中运行。

Pod 是 Kubernetes 平台上的原子单元。当我们在 Kubernetes 上创建 Deployment 时, 该 Deployment 会创建其中包含容器的 Pod(而不是直接创建容器)。 每个 Pod 都与被调度所在的节点绑定,并保持在那里直到(根据重启策略)终止或删除。 如果节点发生故障,则相同的 Pod 会被调度到集群中的其他可用节点上。

Pod 概述

节点

一个 Pod 总是运行在某个 Node(节点) 上。节点是 Kubernetes 中工作机器, 可以是虚拟机或物理计算机,具体取决于集群。每个 Node 都由控制面管理。 节点可以有多个 Pod,Kubernetes 控制面会自动处理在集群中的节点上调度 Pod。 控制面的自动调度考量了每个节点上的可用资源。

每个 Kubernetes 节点至少运行:

  • kubelet,负责 Kubernetes 控制面和节点之间通信的进程;它管理机器上运行的 Pod 和容器。

  • 容器运行时(如 Docker)负责从镜像仓库中拉取容器镜像、解压缩容器以及运行应用。

节点概述

使用 kubectl 进行故障排查

模块 2 中, 你使用了 kubectl 命令行界面。你将继续在第 3 个模块中使用 kubectl 来获取有关已部署应用及其环境的信息。最常见的操作可以使用以下 kubectl 子命令完成:

  • kubectl get - 列出资源
  • kubectl describe - 显示有关资源的详细信息
  • kubectl logs - 打印 Pod 中容器的日志
  • kubectl exec - 在 Pod 中的容器上执行命令

你可以使用这些命令查看应用的部署时间、当前状态、运行位置以及配置。

现在我们了解了有关集群组件和命令行的更多信息,让我们来探索一下我们的应用。

检查应用配置

让我们验证之前场景中部署的应用是否在运行。我们将使用 kubectl get 命令查看现存的 Pod:

kubectl get pods

如果没有 Pod 在运行,请等几秒,让 Pod 再次列出。一旦看到一个 Pod 在运行,就可以继续操作。 接下来,要查看 Pod 内有哪些容器以及使用了哪些镜像来构建这些容器,我们运行 kubectl describe pods 命令:

kubectl describe pods

我们在这里看到了 Pod 的容器相关详情:IP 地址、所使用的端口以及 Pod 生命期有关的事件列表。

describe 子命令的输出宽泛,涵盖了一些我们还未讲到的概念,但不用担心, 这节课结束时你就会熟悉这些概念了。

在终端中显示应用

回想一下,Pod 运行在隔离的、私有的网络中 —— 因此我们需要代理访问它们,这样才能进行调试和交互。 为了做到这一点,我们将使用 kubectl proxy 命令在第二个终端中运行一个代理。 打开一个新的终端窗口,在这个新的终端中运行以下命令:

kubectl proxy

现在我们再次获取 Pod 名称并直接通过代理查询该 Pod。 要获取 Pod 命令并将其存到 POD_NAME 环境变量中, 运行以下命令:

export POD_NAME="$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')"
echo Name of the Pod: $POD_NAME

要查看应用的输出,执行一个 curl 请求:

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/

URL 是到 Pod API 的路由。

在容器上执行命令

一旦 Pod 启动并运行,我们就可以直接在容器上执行命令。 为此,我们使用 exec 子命令,并将 Pod 的名称作为参数。 让我们列出环境变量:

kubectl exec "$POD_NAME" -- env

另外值得一提的是,由于 Pod 中只有一个容器,所以容器本身的名称可以被省略。

接下来,让我们在 Pod 的容器中启动一个 bash 会话:

kubectl exec -ti $POD_NAME -- bash

现在我们有了一个在运行 Node.js 应用的容器上打开的控制台。 该应用的源代码位于 server.js 文件中:

cat server.js

你可以通过运行 curl 命令查看应用是否启动:

curl http://localhost:8080

要关闭你的容器连接,键入 exit

接下来

最后修改 April 06, 2025 at 11:50 AM PST: [zh-cn]sync explore/explore-intro (3585c7adf0)