查看 Pod 和节点
教程目标
- 了解 Kubernetes Pod。
- 了解 Kubernetes 节点。
- 对已部署的应用进行故障排查。
Kubernetes Pod
Pod 是一个或多个应用容器(例如 Docker)的组合,并且包含共享的存储(卷)、IP 地址和有关如何运行它们的信息。
在模块 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 中。
节点
一个 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
子命令的输出宽泛,涵盖了一些我们还未讲到的概念,但不用担心,
这节课结束时你就会熟悉这些概念了。
说明:
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 http://localhost: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 http://localhost:8080
说明:
在这里我们使用了 localhost
,因为我们在 NodeJS Pod 内执行了此命令。
如果你无法连接到 localhost:8080
,请确保你已经运行了 kubectl exec
命令,并且是从 Pod 内启动的该命令。
要关闭你的容器连接,键入 exit
。
接下来
- 使用 Service 来公开你的应用教程。
- 进一步了解 Pod。
- 进一步了解节点的。