k8s
官方教程
Kubernetes Basics
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

![](public/kubernetes/offical-tutorial/module_03_nodes.svg)

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 main commands

A Pod is a group of one or more application containers (such as Docker) and includes shared storage (volumes), IP address and information about how to run them.

Containers should only be scheduled together in a single Pod if they are tightly coupled and need to share resources such as disk.

A node is a worker machine in Kubernetes and may be a VM or physical machine, depending on the cluster. Multiple Pods can run on one Node.

Once you're ready, move on to Using A Service To Expose Your App.