為 Kubernetes 上運行的應用程式開發人員提供的工具

為 Kubernetes 上運行的應用程式開發人員提供的工具

現代營運方法解決了許多緊迫的業務問題。容器和編排器可以輕鬆擴展任何複雜性的項目,簡化新版本的發布,使它們更加可靠,但同時它們也為開發人員帶來了額外的問題。程式設計師首先關心的是他的程式碼:架構、品質、效能、優雅——而不是它在 Kubernetes 中如何運作,以及如何在進行最小的更改後測試和調試它。因此,積極開發 Kubernetes 工具也是很自然的事情,幫助解決即使是最「古老」的開發人員的問題,讓他們能夠專注於主要事情。

這篇評論提供了一些工具的簡要信息,這些工具可以讓程式碼在 Kubernetes 叢集的 pod'ax 中運行的程式設計師的生活變得更輕鬆。

簡單的助手

Kubectl-調試

  • 本質: 將容器添加到 Pod 並查看其中發生了什麼.
  • GitHub上.
  • GH 簡要統計數據:715 顆星、54 次提交、9 名貢獻者。
  • 語言:去。
  • 許可證:Apache 許可證 2.0。

kubectl 的這個外掛程式可讓您在感興趣的 pod 內建立一個額外的容器,它將與其他容器共用進程命名空間。您可以在其中調試 pod 的操作:檢查網路、監聽網路流量、追蹤感興趣的進程等。

您也可以透過運行切換到進程容器 chroot /proc/PID/root - 當您需要在清單中設定的容器中取得根 shell 時,這會非常方便 securityContext.runAs.

該工具簡單有效,因此對每個開發人員都有用。我們在中寫了更多相關內容 單獨的文章.

網真

  • 本質: 將應用程式傳輸到您的電腦。本地開發和除錯.
  • Сайт; GitHub上.
  • GH 簡要統計數據:2131 顆星、2712 次提交、33 位貢獻者。
  • 語言:Python。
  • 許可證:Apache 許可證 2.0。

此管理單元的想法是在本機使用者電腦上啟動一個包含應用程式的容器,並代理從叢集到它並返回的所有流量。這種方法允許您透過簡單地在您喜歡的 IDE 中編輯檔案來進行本機開發:結果將立即可用。

本地運行的優點是編輯方便、即時結果、能夠以通常的方式調試應用程式。缺點是它對連接速度要求很高,當您必須使用具有相當高 RPS 和流量的應用程式時,這一點尤其明顯。此外,Telepresence 在 Windows 上存在卷安裝問題,這對於習慣該作業系統的開發人員來說可能是一個決定性的限制。

我們已經分享了使用網真的經驗 這裡.

同步

  • 本質: 程式碼與叢集中的容器幾乎瞬時同步.
  • GitHub上.
  • GH 簡要統計數據:555 顆星、362 次提交、11 名貢獻者。
  • 語言:去。
  • 許可證:Apache 許可證 2.0。

此實用程式可讓您將本機目錄的內容與叢集中執行的容器的目錄同步。這樣的工具非常適合腳本程式語言的開發人員,他們的主要問題是將程式碼交付到正在運行的容器。 Ksync 就是為了緩解這個頭痛問題而設計的。

當透過命令初始化一次時 ksync init 在叢集中建立一個DaemonSet,用於監控所選容器的檔案系統的狀態。開發人員在他的本機電腦上運行命令 ksync watch,它監視配置和運行 syncthing,直接與叢集同步檔案。

剩下的就是指示 ksync 要同步什麼內容。例如,這個指令:

ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/

……將會創建一個名為的觀察者 myproject它將搜尋帶有標籤的 Pod app=backend 並嘗試同步本地目錄 /home/user/myproject/ 帶目錄 /var/www/myproject/ 在名為的容器中 php.

根據我們的經驗,關於ksync的問題和注意事項:

  • 必須在 Kubernetes 叢集節點上使用 overlay2 作為 Docker 的儲存驅動程式。該實用程式不能與任何其他實用程式一起使用。
  • 使用 Windows 作為客戶端作業系統時,檔案系統觀察程式可能無法正常運作。在處理大型目錄(具有大量巢狀檔案和目錄)時會注意到此錯誤。我們創造了 相關問題 在syncthing計畫中,但目前還沒有任何進展(自7月初以來)。
  • 使用文件 .stignore 指定不需要同步的路徑或檔案模式(例如,目錄 app/cache и .git).
  • 預設情況下,只要檔案發生更改,ksync 就會重新啟動容器。對於 Node.js 來說這很方便,但對 PHP 來說這是完全不必要的。最好關閉 opcache 並使用該標誌 --reload=false.
  • 配置始終可以在 $HOME/.ksync/ksync.yaml.

壁球

  • 本質: 直接在集群中調試進程.
  • GitHub上.
  • GH 簡要統計數據:1154 顆星、279 次提交、23 位貢獻者。
  • 語言:去。
  • 許可證:Apache 許可證 2.0。

該工具設計用於直接在 Pod 中調試進程。該實用程式簡單且互動式,可讓您選擇所需的調試器 (見下文) 還有namespace+pod,這個過程要你介入。目前支援:

  • delve - 用於 Go 應用程式;
  • GDB - 透過目標遠端+連接埠轉送;
  • 用於調試 Java 應用程式的 JDWP 連接埠轉送。

在 IDE 方面,僅在 VScode 中提供支援(使用 放大),但是,目前(2019)年的計劃包括 Eclipse 和 Intellij。

為了調試進程,Squash 在叢集節點上運行一個特權容器,因此您必須先熟悉其功能 安全模式 以避免安全問題。

完整的解決方案

讓我們繼續討論重砲——更「大規模」的項目,旨在立即滿足開發人員的許多需求。

NB:在這個清單中,當然,我們的開源實用程式有一席之地 韋爾夫 (以前稱為 dapp)。然而,我們已經不止一次地寫過並討論過它,因此決定不將其包含在評論中。對於那些希望更熟悉其功能的人,我們建議閱讀/收聽該報告“werf 是我們在 Kubernetes 中用於 CI/CD 的工具“。

開發空間

  • 本質: 適合想要開始在 Kubernetes 中工作,但又不想深入研究叢林的人.
  • GitHub上.
  • GH 簡要統計數據:630 顆星,1912 次提交,13 位貢獻者。
  • 語言:去。
  • 許可證:Apache 許可證 2.0。

同名公司的解決方案,為團隊開發提供帶有 Kubernetes 的託管叢集。該實用程式是為商業叢集創建的,但與任何其他實用程式都可以很好地配合。

運行命令時 devspace init 在專案目錄中,您將獲得(互動式):

  • 選擇一個工作的 Kubernetes 集群,
  • 利用現有的 Dockerfile (或產生一個新的)以基於它創建一個容器,
  • 選擇用於儲存容器鏡像等的儲存庫。

完成所有這些準備步驟後,您可以透過執行命令開始開發 devspace dev。它將建立容器,將其上傳到儲存庫,將部署推出到集群,並啟動連接埠轉發以及容器與本地目錄的同步。

(可選)系統會提示您將終端移至容器中。您不應該拒絕,因為實際上容器是透過 sleep 命令啟動的,並且為了進行真正的測試,需要手動啟動應用程式。

最後,團隊 devspace deploy 將應用程式和相關基礎設施部署到集群,之後一切都開始在戰鬥模式下運行。

所有項目配置都儲存在一個檔案中 devspace.yaml。除了開發環境設定之外,您還可以在其中找到基礎架構的描述,類似於標準 Kubernetes 清單,只是大大簡化了。

為 Kubernetes 上運行的應用程式開發人員提供的工具
使用 DevSpace 的架構和主要階段

此外,可以輕鬆地將預定義元件(例如 MySQL DBMS)或 Helm 圖表新增至專案中。閱讀更多內容 文件 - 這並不復雜。

斯卡福德

  • Сайт; GitHub上.
  • GH 簡要統計數據:7423 顆星、4173 次提交、136 位貢獻者。
  • 語言:去。
  • 許可證:Apache 許可證 2.0。

Google 的這個實用程式聲稱可以滿足開發人員的所有需求,他們的程式碼將以某種方式在 Kubernetes 叢集上運行。開始使用它並不像 devspace 那麼容易:沒有互動性、語言偵測和自動創建 Dockerfile 他們不會在這裡向您提供。

但是,如果這沒有嚇到您,那麼 Skaffold 允許您執行以下操作:

  • 追蹤原始碼更改。
  • 如果不需要組裝,請將其與 pod 容器同步。
  • 如果語言是解釋型的,則收集帶有程式碼的容器,或編譯工件並將其打包到容器中。
  • 使用以下命令自動檢查生成的圖像 容器結構測試.
  • 標記映像並將其上傳到 Docker 註冊表。
  • 使用 kubectl、Helm 或 kustomize 在叢集中部署應用程式。
  • 執行連接埠轉送。
  • 調試用 Java、Node.js、Python 編寫的應用程式。

文件中聲明性地描述了各種變體的工作流程 skaffold.yaml。對於項目,您還可以定義多個配置文件,在其中可以部分或完全更改組裝和部署階段。例如,對於開發,指定一個方便開發人員的基本映像,對於登台和生產 - 一個最小的映像(+使用 securityContext 容器或重新定義將部署應用程式的叢集)。

Docker 容器可以在本機或遠端建置: 谷歌雲端構建 或在叢集中使用 蟹子。也支援 Bazel 和 Jib Maven/Gradle。對於標記,Skaffold 支援多種策略:透過 git commit hash、日期/時間、來源的 sha256-sum 等。

另外,值得注意的是測試容器的可能性。已經提到的容器結構測試框架提供了以下驗證方法:

  • 在容器上下文中執行命令,追蹤退出狀態並檢查命令的文字輸出。
  • 檢查容器中是否存在檔案並符合指定的屬性。
  • 使用正規表示式控製文件內容。
  • 影像元資料驗證(ENV, ENTRYPOINT, VOLUMES 等等)。
  • 檢查許可證相容性。

與容器同步檔案並不是以最優化的方式進行:Skaffold 只是使用來源建立一個存檔,將其複製並在容器中解壓縮(必須安裝 tar)。因此,如果您的主要任務是程式碼同步,那麼最好尋求專門的解決方案(ksync)。

為 Kubernetes 上運行的應用程式開發人員提供的工具
Skaffold 營運的主要階段

一般來說,該工具不允許您從 Kubernetes 清單中進行抽象,並且沒有任何互動性,因此它可能看起來很難掌握。但這也是它的優勢——更大的行動自由。

花園

  • Сайт; GitHub上.
  • GH 簡要統計數據:1063 個 star,1927 個提交,17 個貢獻者。
  • 語言:打字稿 (計劃將專案拆分為多個元件,其中一些元件將使用 Go 語言,並製作一個 SDK,用於在 TypeScript/JavaScript 和 Go 中建立附加元件).
  • 許可證:Apache 許可證 2.0。

與 Skaffold 一樣,Garden 的目標是自動化將應用程式程式碼交付到 K8s 叢集的過程。為此,您首先需要在 YAML 檔案中描述專案結構,然後執行命令 garden dev。她將施展所有魔法:

  • 收集包含項目各部分的容器。
  • 進行整合和單元測試(如果有描述)。
  • 將所有專案組件推出到集群。
  • 如果原始程式碼發生變化,它將重新啟動整個管道。

使用此工具的主要目的是與開發團隊共用遠端叢集。在這種情況下,如果一些建置和測試步驟已經完成,這將顯著加快整個過程,因為 Garden 將能夠使用快取的結果。

專案模組可以是一個容器、一個 Maven 容器、一個 Helm 圖表、一個清單 kubectl apply 甚至是 OpenFaaS 函數。此外,任何模組都可以從遠端 Git 儲存庫中提取。模組可以定義也可以不定義服務、任務和測試。服務和任務可以具有依賴關係,因此您可以確定特定服務的部署順序並組織任務和測試的啟動。

Garden為用戶提供了一個漂亮的儀表板(目前在 實驗狀態),它顯示項目圖:組件、組裝順序、任務和測試的執行、它們的連接和依賴關係。在瀏覽器中,您可以查看所有專案元件的日誌,並檢查特定元件透過 HTTP 輸出的內容(當然,如果為其聲明了入口資源)。

為 Kubernetes 上運行的應用程式開發人員提供的工具
花園面板

該工具還具有熱重載模式,只需將腳本更改與叢集中的容器同步,大大加快應用程式偵錯過程。花園裡有一個不錯的 文件 還不錯 一組例子,讓您快速習慣並開始使用。順便說一下,最近我們發布了 文章翻譯 來自其作者。

結論

當然,用於在 Kubernetes 中開發和調試應用程式的工具清單並不限於此。還有許多非常有用和實用的實用程式值得一提,即使不是單獨的文章,至少也值得一提。告訴我們您使用了什麼,您遇到了什麼問題以及您是如何解決的!

聚苯乙烯

另請閱讀我們的博客:

來源: www.habr.com

添加評論