查看 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
子命令的输出内容丰富,涵盖了一些我们尚未解释的概念,但不用担心,在本教程结束时,它们将变得熟悉。
注意
describe
子命令可用于获取大多数 Kubernetes 原语的详细信息,包括 Node、Pod 和 Deployment。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 中只有一个容器。在容器上执行命令
一旦 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
注意
这里我们使用了localhost
,因为我们是在 Node.js Pod 内部执行的命令。如果无法连接到 localhost:8080
,请检查确保您已运行 kubectl exec
命令并且正在从 Pod 内部启动该命令。要关闭容器连接,请键入 exit
。
下一步
- 教程使用服务暴露您的应用程序。
- 了解更多关于Pod的信息。
- 了解更多关于Node的信息。