Viewing Pods and Nodes
目标(Objectives)
- Learn about Kubernetes Pods.
- Learn about Kubernetes Nodes.
- Troubleshoot deployed applications.
Kubernetes Pods
当您在上一章节中创建部署时,Kubernetes 会创建了一个 Pod 来托管您的应用程序实例。Pod 是 Kubernetes 的一个抽象概念,代表一组一个或多个应用程序容器(如 Docker)以及这些容器的一些共享资源。这些资源包括:
- 作为卷的共享存储
- 作为唯一集群 IP 地址的网络
- 关于如何运行每个容器的信息,例如容器镜像版本或要使用的特定端口
Pod 为特定应用程序建模了一个“逻辑主机”,并且可以包含相对紧密耦合的不同应用程序容器。例如,一个 Pod 可能既包含您的 Node.js 应用程序的容器,也包含一个不同的容器,该容器为 Node.js 网络服务器提供要发布的数据。Pod 中的容器共享一个 IP 地址和端口空间,始终位于同一位置并共同调度,并在同一节点上的共享上下文中运行。
Pod 是 Kubernetes 平台上的原子单位。当我们在 Kubernetes 上创建部署时,该部署会创建内部带有容器的 Pod(而不是直接创建容器)。每个 Pod 都与它被调度到的节点相关联,并一直保留在那里,直到根据重启策略终止或被删除。在节点出现故障的情况下,相同的 Pod 会被调度到集群中的其他可用节点上。
Node overview
Troubleshooting with kubectl
在模块 2 中,您使用了 kubectl 命令行界面。在模块 3 中,您将继续使用它来获取有关已部署应用程序及其环境的信息。最常见的操作可以使用以下 kubectl 子命令来完成:
- kubectl get - 列出资源
- kubectl describe - 显示有关资源的详细信息
- kubectl logs - 打印 Pod 中容器的日志
- kubectl exec - 在 Pod 中的容器上执行命令
您可以使用这些命令来查看应用程序何时部署、它们的当前状态是什么、它们在哪里运行以及它们的配置是什么。
既然我们对集群组件和命令行有了更多的了解,那么让我们来探索我们的应用程序吧。
Check application configuration
让我们验证一下在上一个场景中部署的应用程序是否正在运行。我们将使用 kubectl get 命令并查找现有的 Pod:
kubectl get pods如果没有 Pod 正在运行,请等待几秒钟后再次列出 Pod。当您看到一个 Pod 正在运行时,就可以继续下一步。
接下来,要查看该 Pod 内部有哪些容器以及用于构建这些容器的镜像,我们运行 kubectl describe pods 命令:
kubectl describe pods在这里,我们可以看到有关 Pod 的容器的详细信息:IP 地址、使用的端口以及与 Pod 生命周期相关的事件列表。
describe 子命令的输出内容很广泛,涵盖了一些我们尚未解释的概念,但不用担心,在本训练营结束时,您会对它们熟悉起来。
注意:describe 子命令可用于获取大多数 Kubernetes 原语的详细信息,包括节点(Nodes)、Pod 和部署(Deployments)。describe 命令的输出旨在供人阅读,而不是用于编写脚本。
Show the app in the terminal
请记住,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 的路径。
View the container logs
应用程序通常发送到标准输出的任何内容都会成为 Pod 内容器的日志。我们可以使用 kubectl logs 命令来检索这些日志:
kubectl logs "$POD_NAME"注意:我们不需要指定容器名称,因为 Pod 内只有一个容器。
Executing command on the container
一旦 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。
Summary
- Pods
- Nodes
- Kubectl主要命令
一个 Pod 是由一个或多个应用容器(比如 Docker 容器)组成的集合,它包含共享存储(存储卷)、IP 地址,以及有关如何运行这些容器的信息。
只有当容器之间耦合紧密并且需要共享像磁盘这样的资源时,才应该将它们一同调度到单个 Pod 中。
在 Kubernetes 里,节点是一台工作机器,根据集群的情况,它可能是一台虚拟机(VM)或者一台物理机。多个 Pod 可以在一个节点上运行。
一旦你准备好,就继续进行 “使用Service来暴露你的应用程序” 这一环节。