到2021年,幾乎所有接觸過云基礎(chǔ)設(shè)施的人都熟悉Kubernetes項目。簡單地說,Kubernetes是一個非常強大的容器編排平臺,并且Kubernetes社區(qū)一直在共享工具,這有助于改善Kubernetes開發(fā)人員的體驗。本文列出作者自己最常用的11款Kubernetes工具,并對它們進行了分類介紹。
Kubernetes是一個非常強大的容器編排平臺。但在我看來,Kubernetes最重要的是將最佳實踐整合到了一個系統(tǒng)中,這個系統(tǒng)可以從樹莓派(Raspberry Pi)擴展到財富500強中最大的基礎(chǔ)設(shè)施。它使得開發(fā)和運維人員能夠通過標準化的API和有意義的抽象(如Pod或ConfigMap)進行協(xié)作。
通過提供一個開源標準,Kubernetes可以將一個組織從數(shù)十年自己摸索的“容器策略”中拯救出來,幸運的是,這個標準也是每個主要云供應商的標準。也就是說,像Kubernetes這樣龐大的野獸是很難馴服的,但為了充分發(fā)揮它的潛力,我們需要一套額外的工具。
Kubernetes社區(qū)一直在共享工具,這有助于改善Kubernetes開發(fā)人員的體驗。以下是我自己最常用的11款Kubernetes工具,我將它們進行了分類:哪些是可以幫助我運行Kubernetes的工具,哪些是測試Kubernetes的工具,以及哪些是可以讓我在IDE中能夠獲得樂趣的(最后但并非不重要)。
類別1:運行Kubernetes環(huán)境
Minikube仍然是最佳的
幾乎每個Kubernetes教程都是從“下載Minikube”開始的,這在今天仍然行得通。如果你想在一個真正低風險的環(huán)境中編排容器,那么打包及維護良好的Minikube項目可以讓你在大約23秒內(nèi)即可運行一個集群。
Helm仍然是可重復部署的標準
雖然我們都編寫過一兩個一次性腳本來將一些配置部署到Kubernetes中,但實際上管理可重復部署的方法是使用Helm。就像Ubuntu上的apt或RHEL上的rpm一樣,Helm是一個包管理器,它為Kubernetes開發(fā)人員做了很多事情。作為一名開發(fā)人員,想在投入不多的情況下用其他項目來測試我的應用程序。我可以簡單地運行helm install jenkins/jenkins,而不是編寫自己的Jenkins設(shè)置。想要獲取Helm或其他Kubernetes軟件包,請查看Artifact Hub。
Rancher K3s可隨時隨地運行
向Kubernetes服務(wù)中推送容器是一回事,但是如果你想在Raspberry Pi農(nóng)場之外也弄一個呢?來自Rancher的K3s項目可以做到這一點。正如維護人員在README中所說的那樣,它對于Kubernetes“集群學”(clusterology)的任何邊界或物聯(lián)網(wǎng)嘗試都是理想選擇。
K3s作為本地和輕量級集群選擇的一個突出特點是它支持的設(shè)備非常廣泛。使用K3s,你可以在任何地方運行Kubernetes。事實上,它是以單個二進制文件下載的,這意味著它包含了所有生產(chǎn)Kubernetes配置的功能(sqlite3是默認的,但是你可以通過它的可插拔存儲后端將其擴展到Etcd3),并且Rancher團隊及其1749名(到目前為止)貢獻者仍在非常積極地維護它。
Loft可擴大團隊規(guī)模
任何人都可以通過調(diào)用curl來啟動上面提到的Minikube集群。但是,如果你想要和別人合作呢?在云原生開發(fā)工具和本地開發(fā)集群的交接處有很多選擇。
傳統(tǒng)的選擇是在公有云上運行一些可公開訪問的資源:AKS、EKS、DigitalOcean Managed Kubernetes或其他可用資源。但是任何一個在云服務(wù)上運行過hello world教程但忘刪除它的人都知道,這會讓你很快就損失很多。
Loft提供了一組包含UI和CLI在內(nèi)的服務(wù),可以進一步抽象Kubernetes環(huán)境,這些環(huán)境最終將在生產(chǎn)環(huán)境中運行。這樣做之后,你可以建立一個自助服務(wù)體驗,而無需考慮隔離和預算問題。
Loft對隔離的關(guān)注,特別是對vClusters及其相應Spaces的關(guān)注,為每個開發(fā)人員提供了一個真實的環(huán)境,而不會影響預算。這對開發(fā)人員和部門領(lǐng)導來說都是非常有價值的。
Loft的價值在于啟動和關(guān)閉安全Kubernetes環(huán)境的速度。它在一個用例中提到只需單擊一次UI,即可創(chuàng)建本地環(huán)境的現(xiàn)場演示。更自私地考慮一下,在不破壞開發(fā)集群命名空間的情況下,可以在自己的獨立測試用例中演示最新的生產(chǎn)功能,這說聽起來確實不錯。
此外,Loft實驗室最近聘請了了不起的Rich Burroughs,這對于他們正在建立的這類社區(qū)來說是個非常好兆頭。
當與團隊合作時,使用Loft是非常有意義的。
類別2:簡化反饋回路
Skaffold可提供自動反饋回路
假設(shè)你是一名開發(fā)人員,你想寫一個可以在Kubernetes上運行的應用程序。從運行Node.js或Python應用程序到在Kubernetes上運行容器,你需要了解大量的Kubernetes概念,數(shù)量大到像一堵YAML墻。幸運的是,谷歌的好朋友們編寫了Skaffold,為我們提供了一些急需的腳手架。
不要誤會我的意思:你仍然需要編寫自己的代碼、Dockerfile、清單文件以及與管道相關(guān)的所有服務(wù)。Skaffold提供的是一種干凈的方法,可以在每次變更代碼后重新運行部署管道。它的主頁上引用了來自世界各地開發(fā)人員的語錄,深受用戶喜愛。
你可能會有這種感覺:運行Skaffold感覺就像第一次運行Vagrant,而不是手動管理虛擬機。曾經(jīng)需要很多步驟才能完成且不可靠的任務(wù),在某種程度上變得簡單且可重復了,從而簡化了我們的工作。Skaffold將在Kubernetes的測試和部署反饋回路中這樣做。
Podman可停止管理Docker守護進程
雖然Dockerfiles可能永遠是我們表示容器的方式,但Docker本身是完全可選的。甚至Kubernetes本身也在將其運行時從Dockershim中移出來。我非常推薦Podman作為本地運行Docker的替代品,唯一的原因是你不需要再維護守護進程服務(wù)了。不干擾守護進程意味著更少的無效時間浪費和更多的編碼時間。
這種區(qū)別對你來說可能很陌生,所以解釋一下:Docker既是一個與本地容器交互的客戶端,也是一個管理容器運行的用戶態(tài)守護進程(aka server)。Nick Janetakis在這里完美地解釋了這一點。
像我一樣,當一切都能正常工作時,你可能會忘記Docker客戶端和服務(wù)端之間的區(qū)別。也就是說,我經(jīng)常會看到這樣的信息:
$docker ps$Cannot connect to the Docker daemon at unix:///var/run/docker.sock.Is the docker daemon running?
現(xiàn)在我只能選擇了。我可以對Docker守護進程和工具鏈中的服務(wù)進行故障排除,或者我可以使用一些不會遇到相同問題的服務(wù)。我更喜歡后者。
Podman提供了將容器作為子進程運行的選項,從而無需單獨的守護進程。這意味著我永遠不會再收到那條錯誤消息了,我的容器會一直在做它該做的事情。
你可能會因為自己的肌肉記憶太根深蒂固而不愿改變。在這種情況下,我強烈建議你刪除dockerCLI并將alias docker=podman添加到你的shell配置文件中。
Tilt真正了解你的應用程序
雖然我介紹了幾種不同的管理管道的方法,但我仍然認為Tilt是觀察基于Kubernetes應用程序的持續(xù)反饋回路最徹底、最直觀的方法。Tilt UI具有非常簡潔的錯誤捕捉功能,可以在YAML小錯誤變成重大部署錯誤之前就能指認出它們來。它還具有可定制的按鈕,以提供特定于應用程序的獨特功能,如在不同迭代之間刷新架構(gòu)中的消息隊列。
如果你想觀察細節(jié)但又不想被它們淹沒,那就試試Tilt吧。
DevSpace可使開發(fā)流程更高效
你是否有過想讓kubectl做某件事情,但卻忘記了做這件事情所需要的大量命令呢?很幸運的是,DevSpace是一個開源的命令行實用程序,它可以將Kubernetes開發(fā)人員體驗包在一個溫暖的擁抱中。它能管理大量繁瑣的任務(wù),所以你可以像對待運行在本地系統(tǒng)上的Pod一樣對待它。
此外,如果你有非常特殊的設(shè)置項,可以簡單地將它們添加到devspace.yaml聲明配置文件中即可。
雖然它不會一對一地取代kubectl提供的“手術(shù)刀”,但運行DevSpace會為你提供大量正常的默認行為,使與真正的Kubernetes環(huán)境交互更像是$HOME。
Lens IDE可使調(diào)試更快速
像Minikube這樣的Kubernetes項目開箱即用,帶有一個稱為Dashboard的絲滑而直接的GUI。這是一個非常出色的以閱讀為中心的環(huán)境視圖,但是如果你想通過UI執(zhí)行某些操作,該怎么辦呢?
開源社區(qū)中最強大的選項是Lens。我真的不應該稱它為GUI,因為它的特性豐富到足以被視為IDE。只需單擊按鈕,你就可以在Lens中執(zhí)行Kubernetes能夠執(zhí)行的任何操作。我最喜歡Lens的是它那不可思議的思維情境特定選項,它幫助我區(qū)分了Kubernetes領(lǐng)域許多其他資源的命名空間服務(wù)。
類別3:不可或缺的IDE開發(fā)工具
VSCode我們都需要的Kubernetes擴展
如果沒有一個能夠區(qū)分Kubernetes資源和Helm圖表的IDE,就不能說是有Kubernetes開發(fā)經(jīng)驗。這就是Visual Studio Code Kubernetes Tools的亮點所在。任何生活在Kubernetes世界的人都必須從安裝它開始。
該VSCode插件使YAML更易于管理
Kubernetes開發(fā)人員被描述為YAML牧民,我認為這非常合適。雖然我也喜歡結(jié)構(gòu)化的特定領(lǐng)域語言,如下一代Kubernaut,但我不會放棄任何來自管理YAML本身的幫忙。幸運的是,紅帽(Red Hat)的YAML Language Support擴展可以幫到我。
它提供了大量的自動完成選項,以及許多額外的細微選項,這些選項幫助我解決了問題。話雖如此,右鍵單擊并選擇“格式化文檔”的功能本身就很有價值。
Footsteps通過代碼查找路徑
嚴格來說,它雖然不是Kubernetes擴展,但是我發(fā)現(xiàn)在YAML的農(nóng)場中導航可能會讓我忘記出發(fā)的地方。它在我2000行的配置文件的什么地方呢?那時Footsteps聲照亮了我短期失憶的立足點。這個出色的擴展程序,也適用于VSCode或其他IDE,它通過高亮來突出顯示最近編輯的文檔。隨著你的繼續(xù)編碼,F(xiàn)ootsteps會逐漸淡化這些顏色,讓你了解你的編碼模式。安裝它,可以節(jié)省你迷失方向的時間。
總結(jié)
有很多不可思議的工具可以幫助Kubernetes開發(fā)和運維人員來駕馭這種新的容器編排范式。我喜歡從三個方面來考慮它們:它們是能幫助我運行Kubernetes,是能測試Kubernetes,還是能以可感知的方式編寫Kubernetes代碼呢?所有這三個類別都可以引導你在開源生態(tài)系統(tǒng)中獲取維護良好的軟件,這可以幫助你像我們及其他人一樣成為更好的YAML牧民。