查看 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 中的 Worker 机器,可能是虚拟机,也可能是物理机,具体取决于集群。每个节点都由控制平面管理。一个节点可以有多个 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 中的 Worker 机器,可能是虚拟机,也可能是物理机,具体取决于集群。在一个节点上可以运行多个 Pod。

检查应用程序配置

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

kubectl get pods

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

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

kubectl describe pods

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

describe 子命令的输出非常广泛,涵盖了一些我们尚未解释的概念,但不用担心,在完成本强化培训后您会对此熟悉。

注意:describedescribe

子命令可用于获取有关大多数 Kubernetes 原语(包括节点、Pod 和部署)的详细信息。describe 输出旨在以人类可读的方式呈现,而不是用于脚本编写。

在终端中显示应用程序

kubectl proxy

请记住,Pod 在隔离的私有网络中运行,因此我们需要代理访问它们,以便我们可以调试并与它们交互。为此,我们将使用 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 中容器的日志。我们可以使用 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 应用程序的容器中拥有一个打开的控制台。应用程序的源代码位于