Kubernetes基础
Explore Your App

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来暴露你的应用程序” 这一环节。