582
技術社區[雲棲]
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