Helm的小小黑科技,讓你簡單快速地更新那些使用ConfigMap的應用程序。隨時隨心更改配置文件內容,而應用程序將實時根據變化而更新~nginx
文內有逐步的步驟詳解,還有打包好的helm chart供你使用喲!git
Helm讓Kubernetes應用程序的管理工做變得絕不費力。Helm Charts使Kubernetes應用程序的安裝和升級更加容易。本文將討論Helm的一個極妙的技巧:如何使用Helm,簡單快速地更新那些使用ConfigMap的應用程序。github
更新部署函數
上圖的示例就是一個部署的配置文件。咱們假設它是用於運行應用程序的。您能夠在spec.template部分下指定pod模板。如今,若是您想更新應用程序,則必須今後spec.template部分更改內容。這意味着,容器鏡像更改以後,部署將更新,但spec.replicas不會發生任何改變。blog
更新使用ConfigMap的部署ip
某些應用須要某些特定的配置文件和值,咱們不建議將這些配置文件或配置值打包進容器鏡像中,由於若是這麼作的話,那每次配置文件發生更改時,都必須從新建立容器鏡像。而Kubernetes提供了一種管理配置文件/值的好方法——使用ConfigMap資源。資源
有兩種方法能夠將ConfigMap數據暴露給一個pod:部署
Env varsget
Volume mountskubernetes
下面咱們將重點關注暴露ConfigMap的卷掛載方式。
我建立了一個很是簡單的chart做爲例子來討論這個問題。在這個chart中,我有一個以下的ConfigMap的配置文件:
如您所見,ConfigMap的名稱是nginx-cm,一個名爲default.conf的文件正在讀取其數據。這個default.conf是一個nginx配置文件。
如今我想爲個人應用程序使用這個ConfigMap nginx-cm。因此我將經過個人應用程序的部署的配置文件中的Volume Mounts來暴露它。
如上面的示例,咱們須要在【volumes】部分下添加ConfigMap,併爲其指定一個惟一的名稱(config-volume,如示例中所示)。而後,咱們須要將這個卷添加到【containers】部分下的卷掛載中。volumeMounts.mountPath字段是容器中可供容器使用的配置文件的確切位置。
所以,使用這些配置文件,咱們就能夠運行使用ConfigMap提供的nginx配置文件內容的應用程序了。
下面咱們須要更改nginx配置文件。更改此配置文件後,不要忘了還須要相應地更新ConfigMap,否則的話,那些使用此ConfigMap的應用程序將不會使用更新後的內容。
咱們固然也可使用kubectl update命令來更新ConfigMap。按理說,一樣的,接下來咱們應該更新部署。那麼,kubectl update命令能夠用來更新部署嗎?
在我嘗試這麼作的時候,我收到了下面這條消息:
這是由於即便在更新ConfigMap資源以後,部署的spec.template部分也沒有更改。即便ConfigMap的數據部分發生了變化,但這並無引發部署spec.template的任何變化。對此的一種解決方法,是刪除這一部署所管理的全部pod,以後部署就會建立新的pod,這些新pod使用的就是更新後的configMap了。
但我不太喜歡這種方法,由於你必須手動刪除全部的pod,正由於如此我纔開始尋找更好的解決方案,也就是本文所說的Helm的這個小技巧。
正如你在註釋中看到的那樣, 你能夠提供configmap文件的路徑,並將其傳遞給sha256 sum函數。這樣一來,每次configmap文件發生更改時,註釋部分也會獲得相應的更新,進而更新部署的spec.template部分。我發現這一招很是妙,由於如此一來,你就能夠常常更改您的配置文件內容了。由於這個訣竅,Helm可以確保你的應用程序將一直及時地反映這些變化。
我已經作好了一個Helm chart放在GitHub上,你能夠自行下載使用,體驗一下我在本文中分享的這個竅門~ 相信你必定也會發現它對你的應用程序很是有用: