啟動單個容器
不使用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