目錄
(1).問題現象
(2).問題查證過程
(3).原因總結
(4).解決方式
正文
大前提:單節點2核16G搭建微服務完整的容器化環境,需要容器化很多微服務組件。
(1).問題現象
describe不能啟動的pod,發現兩條關鍵日志:
A.0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.
說明當前所在work-node資源不容許此pod部署,發生了pod驅逐。
B.The node was low on resource: ephemeral-storage.
說明了發生pod驅逐的原因。
詳細日志如下:

(2).問題查證過程
1.ephemeral-storage(短暫存儲)的概念和作用
ephemeral-storage是為了管理和調度Kubernetes中運行的應用的短暫存儲。
在每個Kubernetes的節點上,kubelet的根目錄(默認是/var/lib/kubelet)和日志目錄(/var/log)保存在節點的主分區上,這個分區同時也會被Pod的EmptyDir類型的volume、容器日志、鏡像的層、容器的可寫層所占用。ephemeral-storage便是對這塊主分區進行管理,通過應用定義的需求(requests)和約束(limits)來調度和管理節點上的應用對主分區的消耗。
我們使用df -h可以看到/var/lib下有很多容器相關的目錄,這些都是ephemeral-storage:

2.image鏡像重新下載
查證時無意中發現pod在啟動時要重新下載相關鏡像,說明由於磁盤容量不夠時,kubernetes會清理鏡像文件去騰空磁盤,省出資源去優先啟動pod。
符合上述1中所述的“鏡像層占用ephemeral-storage”。
因為筆者機器打算做一個單節點的kubernetes集群,去部署微服務的allinone環境,image會很多,占用空間會很大。原有的20G根本不夠用。
3.本地pv存儲占用磁盤
如2所述,kubernetes中的allinone的各個組件的持久化存儲都是用的本地盤(系統盤),都開的是1G,那么原有的20G更不夠了。
4.有些容器化組件沒有使用持久存儲
造成應用的日志全部打印到了容器里,也就是/var/log目錄下,耗用了ephemeral-storage。
(3).原因總結
根本原因:Kubernetes使用的系統盤容量不足;觸發項如下:
1.image鏡像太多,耗用太多ephemeral-storage;
2.本地pv存儲全部掛載了系統盤目錄下;
3.有些容器沒有使用持久化存儲,日志等全部打印到了ephemeral-storage。
(4).解決方式
原則:讓ephemeral-storage只存儲kubernetes體系下的日志,系統盤容量要充足。
1.image鏡像層的存儲指定非系統盤;
2.本地pv存儲掛載非系統盤;(生產環境禁止使用本地磁盤,必須使用雲存儲)
3.容器必須都使用持久化存儲,禁止把日志都打到容器里。