譯者 | 張鋒
審校| 孫淑娟 梁策
KoolKits(Kubernetes工具包)是針對Kubernetes的高度匹配、基于特定語言、一組有調(diào)試容器功能的鏡像。在實(shí)踐中,如果你在不熟悉的shell中進(jìn)行艱難的調(diào)試時(shí)卡住了,那么在生產(chǎn)的Pod上,你就會很希望用到這個(gè)工具。

在這里簡單介紹下背景,請注意這些容器鏡像旨在與新kubectl debug功能一起使用,該功能用來啟動(dòng)臨時(shí)容器以進(jìn)行交互式排障。KoolKit將作為容器被kubectl debug拉起,在你的Pod中運(yùn)行,并且能夠訪問與原始容器相同的進(jìn)程命名空間。
由于生產(chǎn)容器內(nèi)置調(diào)試工具通常是相對簡單的,使用KoolKit可以提供強(qiáng)大的工具進(jìn)行排障,而不是依賴由最初構(gòu)建生產(chǎn)鏡像的人有意(或無心)留下的簡陋工具。
每個(gè)KoolKit中的工具都是經(jīng)過精心挑選的,你可以在下面閱讀更多關(guān)于整個(gè)項(xiàng)目背后的用意。
如果您迫不及待只是想看看有用的內(nèi)容,請隨時(shí)查看??GitHub??上的完整項(xiàng)目。
調(diào)試Kubernetes很難
了解Kubernetes中pod內(nèi)部發(fā)生的事情并非易事。
首先,你的應(yīng)用不再是單一的實(shí)體。它由多個(gè)pod組成,為水平擴(kuò)展進(jìn)行復(fù)制,有時(shí)甚至分散在多個(gè)集群中。
其次,要使用本地工具(如調(diào)試器)訪問你的應(yīng)用,你需要處理令人討厭的網(wǎng)絡(luò)問題,如自動(dòng)發(fā)現(xiàn)和端口轉(zhuǎn)發(fā),這會減緩此類工具的使用速度。
此外,分布式系統(tǒng)改變或完全停止正在運(yùn)行的pod的狀態(tài)(例如,當(dāng)放置斷點(diǎn)時(shí))可能會導(dǎo)致系統(tǒng)其他部分的連鎖性故障,這將加劇現(xiàn)有問題。
KoolKits背后的用意(起因)
Lightrun[1]是在考慮Kubernetes情況下構(gòu)建的。我們工作時(shí)會跨多pod、多集群甚至多云。我們很早就明白,通過使用正確的工具能為做故障診斷的開發(fā)人員提供強(qiáng)大動(dòng)力。我想我們應(yīng)該以某種方式回饋社區(qū),這也就是我們提出KoolKits想法的原因。
讓我們花點(diǎn)時(shí)間來解釋一下為什么KoolKits非常有用:
有一個(gè)著名的Kubernetes最佳實(shí)踐指出應(yīng)該構(gòu)建小型容器鏡像。出于幾個(gè)不同的原因,這是有道理的:
- 構(gòu)建鏡像將消耗更少的資源(即CI小時(shí)數(shù))。
- 拉取鏡像將花費(fèi)更少的時(shí)間(誰愿意為這么多的Ingress付費(fèi)?)。
- 在一個(gè)連無操作日志都不再安全的世界里,更少的東西意味著暴露在安全漏洞下的區(qū)域越小。
這里還有很多工具可以幫助你在不用做太多繁重工作的情況下實(shí)現(xiàn)目標(biāo):
- Alpine Linux基礎(chǔ)鏡像非常小。
- DistroLess Docker 鏡像更進(jìn)一步,刪除了除運(yùn)行時(shí)之外的所有內(nèi)容。
- Docker多級構(gòu)建有助于創(chuàng)建精簡的最終生產(chǎn)鏡像。
當(dāng)你嘗試去調(diào)試這些容器內(nèi)發(fā)生的事情時(shí),問題很容易出現(xiàn)。通過使用小型生產(chǎn)鏡像,你放棄了大量工具,而這些工具在解決應(yīng)用程序中的問題時(shí)非常寶貴。
通過使用KoolKit,你可以在不影響質(zhì)量工具的情況下讓自己享受小型生產(chǎn)鏡像的好處。每個(gè)KoolKit都包含為它所代表的特定運(yùn)行時(shí)精心挑選的工具,此外還有一套基于Linux系統(tǒng)更通用的工具。
注:KoolKits的靈感來自kubespy和netshoot。
注意事項(xiàng)
在構(gòu)建這些鏡像的過程中,我們做出了很多決策。下面列出了我們考慮的一些事項(xiàng)。
鏡像大小
KoolKits Docker 鏡像傾向于運(yùn)行。KoolKit旨在下載一次,保存在集群的Docker倉庫中,然后根據(jù)需要以容器的方式立即啟動(dòng)。因?yàn)樗鼈儾皇菫榱顺掷m(xù)拉動(dòng)而設(shè)計(jì)的,而是為了裝有用的工具,這個(gè)副作用也是我們能忍受的。
使用Ubuntu基礎(chǔ)鏡像
很難創(chuàng)建一個(gè)精簡鏡像的部分原因是,我們決定使用完整的Ubuntu 20.04系統(tǒng)作為每個(gè)KoolKit的基礎(chǔ)。這主要是因?yàn)槲覀兿M麖?fù)制你將在集群內(nèi)做本地調(diào)試的相同環(huán)境。
比如,這意味著不要亂用Alpine替代你習(xí)慣使用的普通Ubuntu軟件包。實(shí)際上,這意味著我們可以在每個(gè)KoolKit中包含沒有Alpine版本的工具。
使用語言版本管理器
每個(gè)KoolKit都盡可能使用語言版本管理器,而不是依賴于特定語言的發(fā)行版。這樣做是為了讓你可以輕松安裝較舊的運(yùn)行時(shí)版本,如果需要的話允許你在運(yùn)行時(shí)版本之間隨意切換(例如,為了獲取僅存在于特定運(yùn)行時(shí)版本的特定工具版本)。
可用的KoolKits
存儲庫中的每個(gè)文件夾都包含KoolKit后面的Dockerfile和調(diào)試鏡像的簡短說明。所有KoolKit都基于ubuntu:20.04基礎(chǔ)鏡像,讓每個(gè)人都使用自己熟悉的shell。
可用的 KoolKit 列表:
1. ??koolkit-jvm??–采用OpenJDK 17.0.2 和相關(guān)工具(包括jabba以便于版本管理和Maven 3.8.4)
2. ??koolkit-node??–Node 16.13.1和相關(guān)工具(包括nvm以便于版本管理)
3. ??koolkit-python??–Python 3.10.2 和相關(guān)工具(包括pyenv以便于版本管理)
請注意,你實(shí)際上不必自己構(gòu)建它們:所有KoolKit都在Docker Hub上公開托管并且免費(fèi)提供。
KoolKits 即將推出
- 一個(gè)全新的 Go 1.17.7 KoolKit
- JVM KoolKit: jvm-profiler,jHiccup支持
- Node.js KoolKit: llnode,thetool 支持
- Python KoolKit: vardbg, memprof 支持
貢獻(xiàn)
如果還有遺漏的工具,請?zhí)峤粏栴}告知你的建議即可,我們非常樂意將它們添加到任何鏡像中。
附注1:Lightrun公司提供了一個(gè)可觀察性平臺,允許開發(fā)人員在運(yùn)行時(shí)插入日志、指標(biāo)和跟蹤等,并簡化事件解決的各個(gè)方面,從而讓開發(fā)人員深入了解正在運(yùn)行的應(yīng)用程序。
譯者介紹
張鋒,51 CTO社區(qū)編輯,長期從事技術(shù)顧問工作,專注于運(yùn)維/云原生領(lǐng)域,精通網(wǎng)絡(luò)疑難故障分析,有很豐富的大型銀行運(yùn)維工具建設(shè)實(shí)踐經(jīng)驗(yàn)。
原文標(biāo)題:??Introducing KoolKits: OSS Debugging Toolkits for Kubernetes??,作者:Tom Granot





























