本文是《浅入浅出k8s实战-k8s初体验篇的第四篇 》
此文为提取大纲,按照互动教程进行分享教学用。另补充一些知识点,和关联操作。
原文:
- 中:https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/explore-intro/
- 英:https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/
- 互动:https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-interactive/
课程说明
目标
- 了解 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 | Hostname: first-deploy-whoami-68dd7db55-bpr52 |