一虱疏、?? 概述
spring boot
應(yīng)用以容器的方式運(yùn)行在 k8s
集群上面是非常方便的妆兑,但是不同的環(huán)境需要不同的配置文件魂拦,我們可以使用外部的配置中心,比如 nacos
搁嗓、apollo
芯勘。k8s
也提供了 configMap
用來(lái)將環(huán)境配置信息和容器鏡像解耦,便于應(yīng)用配置的修改腺逛。本文主要從以下幾個(gè)方面介紹 spring boot
使用 k8s
的 configMap
作為外部配置的使用方法:
spring boot
加載配置文件介紹k8s
的configMap
介紹使用
k8s
的configMap
作為外部配置文件
二荷愕、spring boot 加載配置文件介紹
當(dāng)應(yīng)用程序啟動(dòng)時(shí),Spring Boot 會(huì)自動(dòng)從以下位置查找并加載 application.properties
和 application.yaml
文件棍矛。
配置文件優(yōu)先級(jí)從高到底的順序如下:
file:./config/
- 優(yōu)先級(jí)最高(項(xiàng)目根路徑下的/config
子目錄)file:./
- 優(yōu)先級(jí)第二 (項(xiàng)目根路徑下)classpath:/config/
- 優(yōu)先級(jí)第三(項(xiàng)目resources/config
下)classpath:/
- 優(yōu)先級(jí)第四(項(xiàng)目resources
根目錄)
高優(yōu)先級(jí)配置會(huì)覆蓋低優(yōu)先級(jí)配置
在同級(jí)目錄下同時(shí)存在
application.properties
和application.yaml
文件安疗,那么application.properties
會(huì)覆蓋application.yaml
文件
如果我們運(yùn)行時(shí)想指定運(yùn)行哪個(gè)環(huán)境的配置文件,可以有三種方式:
- 在項(xiàng)目 resources 文件夾下的
application.properties
文件中配置spring.profiles.active=dev
指定加載的環(huán)境 - 啟動(dòng) jar 時(shí)够委,指定
--spring.profiles.active=prod
加載的環(huán)境 - 啟動(dòng) jar 時(shí)荐类,指定
--spring.config.location=target/application.properties
加載配置文件位置
三、k8s 的 configMap
介紹
ConfigMap
是一種 API
對(duì)象茁帽,用來(lái)將非機(jī)密性的數(shù)據(jù)保存到鍵值對(duì)中掉冶。使用時(shí) pod
可以將其用作環(huán)境變量、命令行參數(shù)或者存儲(chǔ)卷中的配置文件脐雪。
注意:
ConfigMap
并不提供保密或者加密功能厌小。 如果你想存儲(chǔ)的數(shù)據(jù)是機(jī)密的,請(qǐng)使用secret
或者使用其他第三方工具來(lái)保證你的數(shù)據(jù)的私密性战秋,而不是用ConfigMap
璧亚。
ConfigMap
在設(shè)計(jì)上不是用來(lái)保存大量數(shù)據(jù)的,在ConfigMap
中保存的數(shù)據(jù)不可超過(guò)1 MiB
,如果需要保存超出此限制的數(shù)據(jù)癣蟋,你可以考慮掛載存儲(chǔ)卷或者使用獨(dú)立的數(shù)據(jù)庫(kù)或者文件服務(wù)透硝。
創(chuàng)建 configMap
的幾種方式:
-
使用目錄創(chuàng)建(
--from-file
指定在目錄下的所有文件都會(huì)被用在ConfigMap
里面創(chuàng)建一個(gè)鍵值對(duì),有多少個(gè)文件就有多少個(gè)鍵值對(duì)疯搅,鍵的名字就是文件名濒生,值就是文件的內(nèi)容)kubectl create configmap [configmap名稱] --from-file=[目錄](méi)
-
使用文件創(chuàng)建(
--from-file
這個(gè)參數(shù)可以使用多次,效果就跟指定整個(gè)目錄是一樣的)kubectl create configmap [configmap名稱] --from-file=[文件] --from-file=[文件]
-
從字面值創(chuàng)建(
--from-literal
這個(gè)參數(shù)可以使用多次)kubectl create configmap [configmap名稱] --from-literal=[鍵=值] --from-literal=[鍵=值]
示例:使用字面值創(chuàng)建一個(gè)
configMap
kubectl create configmap myconfigMap --from-literal=env=dev --from-literal=name=test
[root@node01 test]# kubectl describe cm myconfigMap Name: myconfigmap Namespace: default Labels: <none> Annotations: <none> Data ==== env: ---- dev name: ---- test Events: <none>
-
使用
yaml
清單文件創(chuàng)建創(chuàng)建一個(gè)
game-demo.yaml
文件幔欧,內(nèi)容如下:apiVersion: v1 kind: ConfigMap metadata: name: game-demo data: # 類屬性鍵罪治;每一個(gè)鍵都映射到一個(gè)簡(jiǎn)單的值 player_initial_lives: "3" ui_properties_file_name: "user-interface.properties" # 類文件鍵,鍵的名字就是文件名礁蔗,值就是文件的內(nèi)容 game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 user-interface.properties: | color.good=purple color.bad=yellow allow.textmode=true
使用下面的命令創(chuàng)建
configMap
:kubectl apply -f game-demo.yaml
四觉义、使用 k8s 的 configMap
作為外部配置文件
從前面的介紹我們可以知道,spring boot 加載配置文件的最高優(yōu)先級(jí)是項(xiàng)目根路徑下的/config
子目錄浴井,所以可以將 configMap
中的配置文件掛載到容器中的項(xiàng)目根路徑下的config
子目錄中晒骇。
- 可以使用下面的命令從文件中創(chuàng)建一個(gè)
configMap
:
kubectl create configMap spring-boot-demo --from-file=application.yaml
- 創(chuàng)建一個(gè)
spring-boot-demo.yaml
文件內(nèi)容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-demo
namespace: default
labels:
app: spring-boot-demo
spec:
replicas: 1
selector:
matchLabels:
app: spring-boot-demo
template:
metadata:
labels:
app: spring-boot-demo
spec:
containers:
- name: spring-boot-demo
image: ${ORIGIN_REPO}/spring-boot-demo:${IMAGE_TAG}
imagePullPolicy: Always
env:
- name: TZ
value: Asia/Shanghai
ports:
- containerPort: 8080
resources:
requests:
cpu: 200m
memory: 500Mi
# 指定配置文件掛載到 /app/config 目錄下,構(gòu)建鏡像時(shí)的jar包也在 /app 目錄下
volumeMounts:
- mountPath: /app/config
name: config
imagePullSecrets:
- name: docker-password
volumes:
- configMap:
# 指定我們創(chuàng)建的configMap的名字
name: spring-boot-demo
# 自定義的名字磺浙,需要跟 volumeMounts.name 匹配
name: config
---
apiVersion: v1
kind: Service
metadata:
name: spring-boot-demo
namespace: default
labels:
app: spring-boot-demo
spec:
ports:
- name: port
port: 80
protocol: TCP
targetPort: 8080
selector:
app: spring-boot-demo
type: ClusterIP
- 使用下面的命令創(chuàng)建掛載了配置的 deployment :
kubectl apply -f spring-boot-demo.yaml
- 使用下面的命令進(jìn)入到容器中查看驗(yàn)證是否掛載到配置的目錄:
# 查看pod
kubectl get pod -n default
# 進(jìn)入容器
kubectl exec -it spring-boot-demo-76bd6c8857-kwss6 bash
五洪囤、被掛載的 configMap
內(nèi)容會(huì)被自動(dòng)更新
當(dāng)卷中使用的 configMap
被更新時(shí),所投射的鍵最終也會(huì)被更新撕氧。 kubelet 組件會(huì)在每次周期性同步時(shí)檢查所掛載的 configMap
是否為最新瘤缩。 不過(guò),kubelet 使用的是其本地的高速緩存來(lái)獲得 configMap
的當(dāng)前值呵曹。 高速緩存的類型可以通過(guò) KubeletConfiguration 結(jié)構(gòu) 的 ConfigMapAndSecretChangeDetectionStrategy
字段來(lái)配置。
configMap
既可以通過(guò) watch 操作實(shí)現(xiàn)內(nèi)容傳播(默認(rèn)形式)何暮,也可實(shí)現(xiàn)基于 TTL 的緩存奄喂,還可以直接經(jīng)過(guò)所有請(qǐng)求重定向到 API 服務(wù)器。 因此海洼,從 configMap
被更新的那一刻算起跨新,到新的主鍵被投射到 Pod 中去,這一 時(shí)間跨度可能與 kubelet 的同步周期加上高速緩存的傳播延遲相等坏逢。 這里的傳播延遲取決于所選的高速緩存類型 (分別對(duì)應(yīng) watch 操作的傳播延遲域帐、高速緩存的 TTL 時(shí)長(zhǎng)或者 0)。
以環(huán)境變量方式使用的 configMap
數(shù)據(jù)不會(huì)被自動(dòng)更新是整,更新這些數(shù)據(jù)需要重新啟動(dòng) Pod肖揣。
參考文檔: