屬性組態檔在任何應用程式中都非常重要,它們不僅可以讓應用程式具備靈活性,還能夠根據檔案中配置的值產生不同的功能,實際上,在staging、開發、測驗、UAT或生產環境中,我們都使用屬性組態檔來驅動不同的行為,

通常情況下,屬性組態檔會與代碼一起打包,并且整個程式包都部署在執行環境中,這一方法中,如果你想更改任何配置(即便組態檔中也發生了更改),你需要重新發布代碼,盡管這種方法行之有效,但是對于現在而言,效率還是太低了,因此我們需要一種外部化的配置,
在本文中,我將闡述Kubernetes如何為容器提供外部化、靈活的配置以及可移植性,ConfigMap主要是為了讓應用程式的配置和部署解耦,這一功能可以讓容器化應用程式具備可移植性,
如果你對Spring Cloud的生態很熟悉,那么接下來你會發現ConfigMap與Spring Cloud server十分類似,這里有兩種使用ConfigMap的方法:
-
將ConfigMap作為一種環境變數
-
將ConfigMap掛載為檔案
讓我們開始進行實踐!我們將使用一個簡單的應用程式,基于Spring Boot、Docker和Kubernetes進行演示,
將ConfigMap作為一種環境變數
在本例中,我們將在Kubernetes中創建一個新的環境變數,并將其用于代碼中,在Java中,可以通過System.getenv(String) API在代碼中使用環境變數,在常規Java應用程式中,可以在J2EE應用程式容器(如Oracle WLS或IBM WAS)中設定環境變數,也可以在OS中設定環境變數,然而,在Kubernetes中情況并不相同,要使用環境變數,我們必須根據literal創建配置映射,

通過kubectl create configmap 命令,我們創建了兩個環境變數:app.name 和 app.desc,
我們來了解一下這背后發生了什么,

現在注意資料部分,在資料部分下,你會找到鍵值對,從技術上來說,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://<minikube_ip>:<service_node_port>/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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/47653.html
標籤:其他
