《 Kubernetes进阶实战》一2.4.2探查Pod及应用详情

举报
华章计算机 发表于 2019/05/29 09:10:59 2019/05/29
【摘要】 本书摘自《 Kubernetes进阶实战》一第二章,第2.4.2节,作者是马永亮

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

image.png

       若要进入容器的交互式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
              / #


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。