天天看點

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一節:

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

繼續閱讀