查看 Pod 和节点

了解如何使用 kubectl get、kubectl describe、kubectl logs 和 kubectl exec 对 Kubernetes 应用程序进行故障排除。

目标

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

Kubernetes Pod

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

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

Pod 模拟应用程序特定的“逻辑主机”,可以包含不同的应用程序容器,这些容器相对紧密耦合。例如,Pod 可能同时包含包含 Node.js 应用程序的容器以及为 Node.js Web 服务器提供数据的另一个容器。Pod 中的容器共享一个 IP 地址和端口空间,始终位于同一位置并共同调度,并在同一节点上的共享上下文中运行。

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

总结

  • Pod
  • 节点
  • Kubectl 主要命令

Pod 是一个或多个应用程序容器(例如 Docker)的集合,包括共享存储(卷)、IP 地址和有关如何运行它们的信息。


Pod 概述


节点

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

每个 Kubernetes 节点至少运行

  • Kubelet,一个负责 Kubernetes 控制平面和节点之间通信的进程;它管理 Pod 和在机器上运行的容器。
  • 一个容器运行时(如 Docker),负责从注册表中拉取容器镜像,解压缩容器并运行应用程序。

容器应仅在它们紧密耦合且需要共享资源(如磁盘)的情况下,才应在单个 Pod 中一起调度。


节点概述


使用 kubectl 进行故障排除

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

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

您可以使用这些命令查看应用程序何时部署、它们当前的状态、它们运行的位置以及它们的配置。

现在我们对集群组件和命令行有了更多了解,让我们来探索我们的应用程序。

节点是 Kubernetes 中的工作机器,可以是 VM 或物理机,具体取决于集群。多个 Pod 可以运行在一个节点上。

检查应用程序配置

让我们验证我们在上一个场景中部署的应用程序是否正在运行。我们将使用 kubectl get 命令并查找现有的 Pod

kubectl get pods

如果没有任何 Pod 正在运行,请等待几秒钟,然后再次列出 Pod。看到一个 Pod 正在运行后,您可以继续。

接下来,要查看该 Pod 中包含哪些容器以及用于构建这些容器的镜像,我们运行 kubectl describe pods 命令

kubectl describe pods

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

的输出describe子命令很广泛,涵盖了一些我们尚未解释的概念,但不用担心,在完成本训练营后,您会熟悉它们。

注意:describe子命令可用于获取有关大多数 Kubernetes 原语的详细信息,包括节点、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 Pod 的名称:$POD_NAME

要查看应用程序的输出,请运行 curl 请求

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

该 URL 是 Pod API 的路由。

查看容器日志

应用程序通常发送到标准输出的任何内容都将成为 Pod 中容器的日志。我们可以使用 kubectl logs 命令检索这些日志

kubectl logs "$POD_NAME"

注意:我们不需要指定容器名称,因为 Pod 中只有一个容器。

在容器上执行命令

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

kubectl exec "$POD_NAME" -- env

同样,值得一提的是,由于 Pod 中只有一个容器,因此可以省略容器本身的名称。

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

kubectl exec -ti $POD_NAME -- bash

我们现在在运行 NodeJS 应用程序的容器上有一个开放的控制台。应用程序的源代码位于server.js文件中

cat server.js

您可以通过运行curl命令来检查应用程序是否已启动

curl http://localhost:8080

注意:这里我们使用了localhost,因为我们在 NodeJS Pod 内部执行了命令。如果您无法连接到 localhost:8080,请检查您是否已运行 kubectl exec 命令,并且是从 Pod 内部启动命令的。

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

准备就绪后,请继续 使用服务公开您的应用程序

上次修改时间:2023 年 11 月 30 日下午 12:00 PST:从 deploy-intro.html 更新 kubernetes 教程到 update-intro.html (6ad170bf17)