查看 Pod 和节点

目标

  • 了解 Kubernetes Pod。
  • 了解 Kubernetes Node。
  • 排查已部署应用程序的问题。

Kubernetes Pod

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

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

Pod 建模了一个特定于应用程序的“逻辑主机”,可以包含相对紧密耦合的不同应用程序容器。例如,一个 Pod 可能包含你的 Node.js 应用程序容器以及一个不同的容器,该容器提供要由 Node.js Web 服务器发布的数据。Pod 中的容器共享一个 IP 地址和端口空间,总是共同位于同一节点上并共同调度,并在同一节点上的共享上下文中运行。

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

Pod 概览

节点

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

每个 Kubernetes Node 至少运行

  • Kubelet,一个负责 Kubernetes 控制平面与 Node 之间通信的进程;它管理机器上运行的 Pod 和容器。

  • 一个容器运行时(如 Docker),负责从注册表拉取容器镜像、解压容器并运行应用程序。

Node 概览

使用 kubectl 进行故障排除

模块 2 中,你使用了 kubectl 命令行界面。你将在模块 3 中继续使用它来获取有关已部署应用程序及其环境的信息。最常见的操作可以通过以下 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 https://: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 https://:8080

要关闭容器连接,请键入 exit

下一步

上次修改时间为太平洋标准时间 2024 年 11 月 18 日晚上 8:50:添加图片 CSS 和警报框 (b9ee7dbcba)