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