K8S互动教程3-查看 Pod 和 Nodes

本文是《浅入浅出k8s实战-k8s初体验篇的第四篇 》

此文为提取大纲,按照互动教程进行分享教学用。另补充一些知识点,和关联操作。

原文:

目标

  • 了解 Kubernetes Pods
  • 了解 Kubernetes Nodes
  • 已部署应用的故障排查

操作内容

  • 查看已部署的 Pod 和配置

  • 查看应用日志

  • 在容器中运行命令

    Kubernetes Pods

    我们在 上一节 中创建了 Deployment 的时候,Kubernetes 创建了一个 Pod 来托管我们的应用实例。Pod 是 Kubernetes 的资源抽象,代表了一个或多个应用容器(如 Docker 或 rkt )以及用于这些容器的一些共享资源集合。这些共享资源包含:

  • 共享存储,就是 Volumes

  • 网络,会被分配唯一的集群IP地址

  • 每个容器如何运行的信息,比如容器镜像版本或要被使用的特定端口

Pod 相当于是应用程序特定的“逻辑主机”的一个建模,可以包含相对紧耦合的不同的应用容器。所以可以认为Pod地位是和曾经的虚拟化世界中的虚拟主机对等,而容器和虚拟主机中的进程对等。比如,Pod 中包含两个容器,一个是 Web应用程序的容器,会接受用户请求和处理数据,并产生一些处理记录,如日志。另外一个容器就是对第一个容器产生的数据进行再次处理,但不是一个领域,如收集归档日志的 fluentd。这样两个容器就是紧密协作的,需要共享存储等上下文环境、统一调度。

Pod 是 Kubernetes 平台上的原子单元。当我们在 Kubernetes 上创建一个 Deployment 的时候,这个部署会创建包含容器的Pod(而不是由 Deployment 直接创建容器)。每一个Pod会绑定到它被调度的 Node 上,始终在那里,直到(根据重启策略)或被删除。在 Node 故障的情况下,相同的 Pod (新的)会被调度到集群中其他可用节点。

节点

Pod 总是运行在 Node 上的。Node 是 Kubernetes 集群中的工作机器,取决于集群情况,可以是虚拟机或物理机。所有的Node都是被 Master 管理。一个Node上可以运行多个Pods,Kubernetes master会自动在集群中的 Node 之间处理调度 Pod。Mater 的自动调度会考虑到每个节点的可用资源。

每个 Kubernetes Node 上至少运行一下组件:

  • Kubelet,负责 Kubernetes Master 和 Node 之间通信的进程。它管理着一个机器上运行的 Pods 和 containers。
  • 容器运行时(container runtime,如 Docker,rkt)负责从镜像仓库拉取容器镜像,解包容器并运行应用。

如果一些容器是紧耦合的并且需要共享类似磁盘这样的资源,那么这些容器应该被放到一个Pod 中一起被调度。

使用 kubectl 进行故障排查

上一节 我们使用了Kubectl 命令行接口。我们在本章节继续使用它来获取已部署的应用及其环境的信息。最常用的操作可以通过以下命令完成:

  • *kubectl get *列出资源
  • kubectl describe 展示资源的相信信息
  • kubeclt logs 打印 Pod 中 container 的日志
  • kubectl exec 在 Pod 的 container 中执行命令

我们可以用这些命令来查看我们是在啥时候部署的应用,它们当前的状态是咋样的,它们在哪里运行以及它们的配置是个啥。

现在,我们已经进一步的了解集群的组件和命令行,下面进入互动教程开始探索吧。

互动教程

查看已部署的 Pod 和配置

先按照上一节将我们的应用启动起来。

之后运行

1
kubectl get pods

如果还没启动好,等一等在运行这个命令。

我们可以通过 describe 来看 Pod 的详细信息,包括 Pod 运行的是哪些镜像:

1
kubectl describe pods

我们可以根据输出看到 Pod及其 container 的详细信息,包括 IP 地址,container 端口,Pod 生命周期的事件(events)记录。 describe 的输出包含了很多我们还没有覆盖到的内容,不过不用担心,教程结束后,你肯定会很熟悉。

注意, describe 命令可用于 Kubernetes 的绝大多数资源类型,包括 Node,Pod,Deployment 等。其输出被设计为可读的,而不是脚本化的,所以,不妨经常用用看。

查看应用日志

和 Docker 一样。应用程序任何向标准输出(STDOUT)输出的内容都会成为 Pod 中对应 container 的日志。我们可以通过 logs 命令来查看日志。

首先,上一节一样,把 Pod 名称放到变量中(你也可以手动 copy):

1
POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

然后,我们查看这个 Pod 的日志:

1
kubectl logs $POD_NAME

需要注意的是,我们此处之所以直接查看 Pod 的日志,而不是 container 是因为我们的 Pod 中只有一个 container。
其常用的格式是:

1
kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER] [options]

你也可以使用类似下面的命令查看日志:

1
kubectl logs $POD_NAME -c first-deploy-whoami

在容器中运行命令

同样,类似于 Docker,Pod 中的 container 启动后我们可以直接在容器中运行命令。使用的 kubctl 命令也是 exec

1
kubectl exec $POD_NAME env

上面这条命令可以直接将容器内的 env 信息返回。如 logs 一样,我们省略了 container 名称,你也可以用同样方式加上。

1
kubectl exec $POD_NAME env -c first-deploy-whoami

让我们直接启动一个 session 看一看:

1
kubectl exec -it $POD_NAME sh

-i-t 分别用于传递 stdin 到容器和让你的 stdin 成为容器的 TTY。

我们的容器用的基础镜像是 busybox,默认有 sh 和一些基础工具(curl 是没有的,用 wget 代替)。进入容器后你就可以“为所欲为”了:

1
pwd && ls -al

我们可以尝试通过 localhost 访问一下我们启动的 Http 服务器:

1
wget -q -O - http://localhost

应该可以返回类似如下的信息:

1
2
3
4
5
6
7
Hostname: first-deploy-whoami-68dd7db55-bpr52
IP: 127.0.0.1
IP: 172.17.0.2
GET / HTTP/1.1
Host: localhost
User-Agent: Wget
Connection: close
谢谢鼓励