簡體   English   中英

如何使用Kubernetes處理周期性的短期任務

[英]How to handle recurring short-lived tasks with Kubernetes

我有一個帶有Web服務器(NGINX)和基於React的前端的安裝程序,該前端使用Webpack構建最終的靜態源。

Web服務器具有自己的kubernetes deployment + service

在Web服務器可以提供靜態html / js / css文件之前,需要先構建前端-但是在那之后, pod / container可以停止。

我的想法是在Web服務器和前端pod之間共享一個volume 前端會將生成的文件寫入volume ,然后網絡服務器可以從那里為它們提供服務。 只要前端源代碼有更新,就需要重新生成文件。

使用kubernetes工具實現此目標的最佳方法是什么? 現在,我正在使用init-container來構建-但這也導致了webserver pod的重新啟動,這不是必需的。

這是解決此問題的最佳/唯一解決方案,還是我應該將kubernetes的jobs用於此類任務?

有多種方法可以做到這一點。 我是這樣想的:

選項1:靜態文件代表構建的源代碼

在這種情況下,您實際上要打包的靜態文件應該打包並內置到您的nginx Web服務器的docker映像中(在html目錄中)。 當您想更新前端時,可以更新所用映像的版本並更新容器。

選項2:靜態文件代表狀態

在這種情況下,您的方法是正確的。 您的“狀態”(如數據庫)存儲在文件夾中。 然后,您運行一個初始化容器/作業以初始化“狀態”,然后您的Web服務器容器正常工作。

我相信選項1會更好的原因有兩個:

  1. 您可以通過增加Pod副本數來水平擴展Web服務器。 在選項2中,您實際上是在處理狀態,所以當您想向基礎k8s群集中添加更多節點時,這是一個問題(您必須將文件/文件夾從一個卷/文件夾復制到另一個)。
  2. 靜態文件實際上是應用程序的源代碼。 這些不是上載的媒體文件或類似文件。 在這種情況下,使它們成為docker映像的一部分絕對是有意義的。 否則,它會破壞容器化和部署的優勢。

可以使用JobsInit容器或gitRepo類型的Volume

http://kubernetes.io/docs/user-guide/volumes/#gitrepo

在您的問題中尚不清楚,您為什么要更新靜態內容而不必簡單地重新部署/更新Pod

由於必須以某種方式在某個地方構建Web服務器Docker映像,因此似乎最好將靜態內容構建到該映像中:部署后就沒有活動部件,不需要卷或存儲。 總體而言,它更簡單。

如果您對Docker構建使用任何類型的自動化工具,都非常容易。 我個人使用Jenkins基於git repo的鈎子構建Docker映像,並且只要代碼更改,就可以簡單地重建和部署該映像。

運行JobInit容器不會給您帶來什么好處:確保Web服務器保持運行狀態,但是通過滾動更新進行部署很容易,這種部署可以在舊的Pod拆除之前部署新的Pod ,並且您的服務器將始終處於運行狀態也起來

把事情簡單化...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM