《 Kubernetes进阶实战》一2.4.2探查Pod及应用详情
2.4.2 探查Pod及应用详情
资源创建或运行过程中偶尔会因故出现异常,此时用户需要充分获取相关的状态及配置信息以便确定问题的所在。另外,在对资源对象进行创建或修改完成之后,也需要通过其详细的状态来了解操作成功与否。kubectl有多个子命令可用于从不同的角度显示对象的状态信息,这些信息有助于用户了解对象的运行状态、属性详情等信息。
1)kubectl describe:显示资源的详情,包括运行状态、事件等信息,但不同的资源类型其输出内容不尽相同。
2)kubectl logs:查看Pod对象中容器输出在控制台的日志信息。在Pod中运行有多个容器时,需要使用选项“-c”指定容器名称。
3)kubectl exec:在Pod对象某容器内运行指定的程序,其功能类似于“docker exec”命令,可用于了解容器各方面的相关信息或执行必需的设定操作等,其具体功能取决于容器内可用的程序。
1.查看Pod对象的详细描述
下面给出的命令打印了此前由myapp创建的Pod对象的详细状态信息,为了便于后续的多次引用,这里先将其名称保存于变量POD_NAME中。命令的执行结果中省略了部分输出:
~]$ POD_NAME=myapp-6865459dff-5nsjc
~]$ kubectl describe pods $POD_NAME
Name: myapp-6865459dff-5nsjc
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: node03.ilinux.io/172.16.0.68
……
Status: Running
IP: 10.244.3.2
Controlled By: ReplicaSet/myapp-6865459dff
Containers:
myapp:
……
……
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 55m default-scheduler Successfully assigned
default/myapp-6865459dff-5nsjc to node03.ilinux.io
Normal Pulling 55m kubelet, node03.ilinux.io pulling image "ikubernetes/
myapp:v1"
Normal Pulled 54m kubelet, node03.ilinux.io Successfully pulled image
"ikubernetes/myapp:v1"
Normal Created 54m kubelet, node03.ilinux.io Created container
Normal Started 54m kubelet, node03.ilinux.io Started container
不同的需求场景中,用户需要关注不同纬度的输出,但一般来说,Events和Status字段会是重点关注的对象,它们分别代表了Pod对象运行过程中的重要信息及当前状态。上面命令执行结果中的不少字段都可以见名而知义,而且部分字段在前面介绍其他命令输出时已经给出,还有一部分会在本书后面的篇幅中给予介绍。
2.查看容器日志
Docker容器一般仅运行单个应用程序,其日志信息将通过标准错误输出等方式直接打印至控制台,“kubectl logs”命令即用于查看这些日志。例如,查看由Deployment控制器myapp创建的Pod对象的控制台日志,命令如下:
~]$ kubectl logs $POD_NAME
10.244.3.1 - - [……] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"
……
如果Pod中运行有多个容器,则需要在查看日志时为其使用“-c”选项指定容器名称。例如,当读者所部署的是KubeDNS附件而非CoreDNS时,kube-system名称空间内的kube-dns相关的Pod中同时运行着kubedns、dnsmasq和sidecar三个容器,如果要查看kubedns容器的日志,需要使用类似如下的命令:
~]$ DNS_POD=$(kubectl get pods -o name -n kube-system | grep kube-dns)
~]$ kubectl logs $DNS_POD -c kubedns -n kube-system
需要注意的是,日志查看命令仅能用于打印存在于Kubernetes系统上的Pod中容器的日志,对于已经删除的Pod对象,其容器日志信息将无从获取。日志信息是用于辅助用户获取容器中应用程序运行状态的最有效的途径之一,也是非常重要的排错手段,因此通常需要使用集中式的日志服务器统一收集存储于各Pod对象中容器的日志信息。
3.在容器中运行额外的程序
运行着非交互式进程的容器中,默认运行的唯一进程及其子进程启动后,容器即进入独立、隔离的运行状态。对容器内各种详情的了解需要穿透容器边界进入其中运行其他的应用程序来进行,“kubectl exec”可以让用户在Pod的某容器中运行用户所需要的任何存在于容器中的程序。在“kubectl logs”获取的信息不够全面时,此命令可以通过在Pod中运行其他指定的命令(前提是容器中存在此程序)来辅助用户获取更多的信息。一个更便捷的使用接口的方式是直接交互式运行容器中的某个Shell程序。例如,直接查看Pod中的容器运行的进程:
~]$ kubectl exec $POD_NAME ps aux
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
8 nginx 0:00 nginx: worker process
9 root 0:00 ps aux
若要进入容器的交互式Shell接口,可使用类似如下的命令,斜体部分表示在容器的交互式接口中执行的命令:
~]$ kubectl -it exec $POD_NAME /bin/sh
/ # hostname
myapp-6865459dff-5nsjc
/ # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
/ #
- 点赞
- 收藏
- 关注作者
评论(0)