閱讀582 返回首頁    go 技術社區[雲棲]


Kubernetes環境下的各種調試方法




啟動單個容器
不使用Pod或Replication Controller,啟動單個容器:

$ kubectl run webserver --image=nginx
想更改鏡像,又不想升級版本?
每次修改之後,需要更新鏡像的版本也好煩人啊。每次構建出新的鏡像,Push到Docker Registry時,可以使用一個固定的版本,然後讓Kubernetes在啟動某個鏡像時,無論本地是否有鏡像,都去Docker Registry拉取鏡像就好了。
ImagePullPolicy從默認的 IfNotPresent,改為 Always。

想直接修改容器裏的程序,又不想更新鏡像?
什麼,還能這樣做?在容器內部修改,比如修改了腳本,或者直接替換二進製程序,然後使用docker restart container-id。我嚐試過此時使用docker commit提交修改,但是下次啟動時,Kubernets就會報錯。應該是有完整性校驗的原因。

Pod重啟了,如何看重啟之前的日誌?
下麵的命令隻能看到當前Pod的日誌:

$ kubectl logs zookeeper-1
通過 --previous參數可以看之前Pod的日誌

$ kubectl logs zookeeper-1 --previous
查看Pod生命周期的事件
通過如下命令,看命令末尾 events 一節,查看kubelet給APIServer發送的Pod生命周期裏發生的事件

$ kubectl describe pod podname
沒有看到任何事件,但是Pod重啟了?
依然通過describe命令,Containers.[*].Last State一節:

$ kubectl describe pod podname
Name:       kafka-1 
...

Containers:
  kafka:
    ...
    State:      Running
       Started:     Sat, 08 Apr 2017 02:29:04 +0000
    Last State:     Terminated
       Reason:      OOMKilled
      Exit Code:    0
       Started:     Fri, 07 Apr 2017 11:06:56 +0000
      Finished:     Sat, 08 Apr 2017 02:29:04 +0000
    Ready:      True
   Restart Count:   1
...
可以看到 Kafka-1 這個Container因為內存消耗太多,達到內存的上限(Memory Resource Limit)而被幹掉了。如果看到 Reason: Completed,說明是容器內部pid為1的程序主動退出的。

查看資源(CPU/Memory)使用情況
資源使用最多的節點

$ kubectl top nodes
資源使用最多的Pod

$ kubectl top pods
查看節點的資源使用情況

$ kubectl describe nodes | grep -A 2 -e "^\\s*CPU Requests"
如何摘下某個Pod進行Debug
使用label機製,對Pod進行標記。在Service定義中,我們添加 status: serving字段。當需要摘下某個Pod做Debug,而又不影響整個服務,可以:

$ kubectl get pods --selector="status=serving"
$ kubectl label pods webserver-rc-lxag2 --overwrite status=debuging
此時kubelet就會把這個Pod從Service的後端列表中刪掉。等到Debug完,想恢複?再改回去就好了:

$ kubectl label pods webserver-rc-lxag2 --overwrite status=serving
References:

10 most common reasons kuberntes deployments fail

Kubernetes Community Resources

最後更新:2017-04-17 13:30:44

  上一篇:go Docker在千尋位置的實踐
  下一篇:go Devops的三種方式