兩種方法,輕鬆上手ConfigMap!

屬性配置文件在任何應用程序中都很是重要。它們不只可讓應用程序具有靈活性,還可以根據文件中配置的值產生不一樣的功能。實際上,在staging、開發、測試、UAT或生產環境中,咱們都使用屬性配置文件來驅動不一樣的行爲。html

一般狀況下,屬性配置文件會與代碼一塊兒打包,而且整個程序包都部署在執行環境中。這一方法中,若是你想更改任何配置(即使配置文件中也發生了更改),你須要從新發布代碼。儘管這種方法行之有效,可是對於如今而言,效率仍是過低了。所以咱們須要一種外部化的配置。node

在本文中,我將闡述Kubernetes如何爲容器提供外部化、靈活的配置以及可移植性。ConfigMap主要是爲了讓應用程序的配置和部署解耦,這一功能可讓容器化應用程序具有可移植性。git

若是你對Spring Cloud的生態很熟悉,那麼接下來你會發現ConfigMap與Spring Cloud server十分相似。這裏有兩種使用ConfigMap的方法:github

  1. 將ConfigMap做爲一種環境變量spring

  2. 將ConfigMap掛載爲文件瀏覽器

讓咱們開始進行實踐!咱們將使用一個簡單的應用程序,基於Spring Boot、Docker和Kubernetes進行演示。springboot

將ConfigMap做爲一種環境變量

在本例中,咱們將在Kubernetes中建立一個新的環境變量,並將其用於代碼中。在Java中,能夠經過System.getenv(String) API在代碼中使用環境變量。在常規Java應用程序中,能夠在J2EE應用程序容器(如Oracle WLS或IBM WAS)中設置環境變量,也能夠在OS中設置環境變量。然而,在Kubernetes中狀況並不相同。要使用環境變量,咱們必須根據literal建立配置映射。app

經過kubectl create configmap命令,咱們建立了兩個環境變量:app.name 和 app.desc。ide

咱們來了解一下這背後發生了什麼。spring-boot

如今注意數據部分,在數據部分下,你會找到鍵值對。從技術上來講,ConfigMap僅僅是鍵值存儲。屬性的名稱是鍵,屬性的值是值。應用程序的代碼會要求你查找這些鍵值對。

爲了在Java代碼中使用此環境變量,咱們須要編寫如下代碼:

下面的代碼段定義了兩個K8s環境變量,分別爲「 SPRING_BOOT_HELLO_WORLD_APP_NAME」和「 SPRING_BOOT_HELLO_WORLD_DESC」。這些變量將從ConfigMap app-env-config獲取值。須要重點關注的是鍵。

屬性配置文件能夠在單個文件中保存不少個屬性,以在不一樣環境中運行應用程序。在Spring Boot應用程序中,屬性保存在classpath下的application.properties文件中。咱們來看一下打包在應用程序jar包中的application.properties文件。

咱們正在使用命令kubectl create configmap從單個文件或從多個文件建立ConfigMap。

如今讓咱們查看完整的代碼。

將ConfigMap掛載爲文件

在本節中,我將說明如何使用ConfigMap掛載文件之外部化配置。在此示例中,我將使用ConfigMap來外部化application.properties文件。即便默認文件打包在jar中,也位於src / main / resources下。簡單來講,咱們將經過ConfigMap所提供的文件來覆蓋默認文件。

第一步是從application.properties建立ConfigMap。讓咱們瞭解如何在K8s中存儲此ConfigMap。

經過ConfigMap,咱們將掛載application.properties文件到K8s集羣中,而且能夠在應用程序中使用它。請注意,數據部分包含了application.properties的內容,鍵是文件名。

如今,爲了覆蓋默認配置文件,咱們須要(經過ConfigMap)將application.properties掛載到應用程序的classpath中。Spring Boot經過提供不一樣的選項來提供這一功能。SpringApplication在如下位置從application.properties文件加載屬性,並將它們添加到Spring Environment:

  • 當前目錄的/config 子目錄

  • 當前目錄

  • classpath / config包

  • The classpath root

若是你想了解更多信息,能夠查閱官方文檔:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

最簡單,最好的方法是將application.properties掛載在「 / config」目錄中。

仔細檢查掛載路徑,請注意ConfigMap的名稱應與咱們在上面建立的app-file-configmap徹底相同,鍵爲文件名。另外,請確保將volume mount配置的名稱更改成volume配置的名稱。

這段代碼說明了如何在application.properties文件中定義屬性。若是使用Spring推薦的標準方法的話,這十分簡單。具體而言,就是使用@Value 註釋將屬性值注入到變量中。

如今,咱們能夠繼續進行ConfigMap示例應用程序了。咱們來看一下完整的代碼段。

讓咱們建立一個Docker鏡像並將其上傳到Dockerhub。在本例中,鏡像名稱是k8s-springboot-helloworld-configmap—app。

如下是K8S pod配置文件:

如今咱們使用NodePort服務類型建立服務,以即可以從K8S集羣外部使用Welcome服務。

如今,讓咱們把這些更改應用於K8S。

導航到瀏覽器並訪問http:// : /welcome。在本例,應該是http:// 192.168.99.100:30880/welcome。

認真觀察輸出,返回的字符串是:

同時,檢查代碼中硬編碼的環境變量的默認值,以及打包在jar中的application.properties的property默認值。你發現從ConfigMap中獲取了環境變量和application.properties的值。

這個項目能夠從個人Github中獲取:

https://github.com/nikhilbhide/MicroServicesTutorial/tree/master/k8s_spring_boot_hello_world_config_map

相關文章
相關標籤/搜索