本文分享自華為雲社群《從K8s的“臨時容器”看K8s設計的厲害之處》,作者: tsjsdbd。
從一個容器的不足說起
容器概念出現時,有個非常重要的理念:容器中極簡。
即容器裡面只保留需要執行的程序就可以,其他一律不要安裝。這也是為什麼Docker出現的那時,有一篇文章《為什麼不需要在Docker容器中執行sshd》經常被提及的原因。
但有時候Docker容器中缺少需要的軟體。比如 curl,wget,ifconfig,ip,tcpdump 等基礎軟體包,遇到問題時,什麼命令都敲不了,很是讓人抓狂。平時定位問題的技術(各種Linux命令列工具),一點都用不上了。自己打的映象倒還好,大不了重新打映象把需要的工具也安裝後,重新打映象。但是如果是開源映象就比較棘手。
如何在沒有安裝軟體包的容器裡面,執行需要的命令列(二進位制工具)進行除錯,一直是K8s平臺的一個小遺憾。
我以前想K8s可以補充的功能
之前唐老師寫過《跟唐老師學習雲網路 - nsenter魔法棒》,我還想著:可以利用Host上面的命令列呀,透過nsenter跳到容器裡面,不就可以執行了麼。
當年還幻想可以給K8s提點proposal:讓exec命令增加 --from-host 引數,當帶上這個引數的時候,讓kubelet直接從Host執行nsenter執行主機上面的二進位制,這樣就繞過了容器裡面沒有命令列的約束。方便管理員除錯容器中相關問題。
想法似乎挺好,後面轉戰上層AI平臺,並沒有繼續關注這麼底層的了。直到最近看到K8s的新功能:“臨時容器” (ephemeral containers)。發現K8s對某個特性的設計還是非常值得點讚的。
結果K8s實現的功能
K8s為了能在容器裡面,執行不存在的命令列,增加了一個 kubectl debug命令
大致流程如下圖:
其中紅色容器,就是一個“臨時容器”,它與目標容器共享各種namespace,所以與直接在目標容器中執行命令的效果是一樣的。透過指定映象地址,來控制這個新啟動的“臨時容器”裡面包含自己所需要的各類命令列。
這樣就可以在任意K8s的容器裡面,執行不存在的命令列工具了。比如,對某Pod裡面的名為app的容器執行除錯:
kubectl debug -it -c debugger --target=app --image=busybox {POD_NAME}
--target引數,是指定Pod中需要除錯的目標Container(有時Pod有多個Container)。
果然還是人家的更厲害
看完K8s的實現,明顯比我早期想的 “借用Host” 方法更好:其仍然保持Host節點的“極簡”,而是將需要的工具仍然保持由容器來承載。這樣可以借用任意的容器映象,而不必在Host節點上面安裝各種工具包。非常優雅。
更“過分”的是,在節點上沒有的命令列工具,也不需要給節點安裝軟體包,也可以透過臨時容器來執行。
kubectl debug node/mynode -it --image=ubuntu
擴充套件性也很贊,確實考慮的挺周全。
So,啟動“臨時容器”來在目標容器中“整活”走起~
點選關注,第一時間瞭解華為雲新鮮技術~