一、☀️概述
spring boot
利用以容器的形式运行在 k8s
集群下面是十分不便的,然而不同的环境须要不同的配置文件,咱们能够应用内部的配置核心,比方 nacos
、apollo
。k8s
也提供了 configMap
用来将环境配置信息和容器镜像解耦,便于利用配置的批改。本文次要从以下几个方面介绍 spring boot
应用 k8s
的 configMap
作为内部配置的应用办法:
spring boot
加载配置文件介绍k8s
的configMap
介绍- 应用
k8s
的configMap
作为内部配置文件
二、☀️spring boot 加载配置文件介绍
当应用程序启动时,Spring Boot 会主动从以下地位查找并加载 application.properties
和 application.yaml
文件。
配置文件优先级从高到底的程序如下:
file:./config/
– 优先级最高(我的项目根门路下的/config
子目录)file:./
– 优先级第二(我的项目根门路下)classpath:/config/
– 优先级第三(我的项目resources/config
下)classpath:/
– 优先级第四(我的项目resources
根目录)
高优先级配置会笼罩低优先级配置
在同级目录下同时存在
application.properties
和application.yaml
文件,那么application.properties
会笼罩application.yaml
文件
如果咱们运行时想指定运行哪个环境的配置文件,能够有三种形式:
- 在我的项目 resources 文件夹下的
application.properties
文件中配置spring.profiles.active=dev
指定加载的环境 - 启动 jar 时,指定
--spring.profiles.active=prod
加载的环境 - 启动 jar 时,指定
--spring.config.location=target/application.properties
加载配置文件地位
三、☀️k8s 的 configMap
介绍
ConfigMap
是一种 API
对象,用来将非机密性的数据保留到键值对中。应用时 pod
能够将其用作环境变量、命令行参数或者存储卷中的配置文件。
留神:
ConfigMap
并不提供窃密或者加密性能。如果你想存储的数据是秘密的,请应用secret
或者应用其余第三方工具来保障你的数据的私密性,而不是用ConfigMap
。
ConfigMap
在设计上不是用来保留大量数据的,在ConfigMap
中保留的数据不可超过1 MiB
,如果须要保留超出此限度的数据,你能够思考挂载存储卷或者应用独立的数据库或者文件服务。
创立 configMap
的几种形式:
-
应用目录创立 (
--from-file
指定在目录下的所有文件都会被用在ConfigMap
外面创立一个键值对,有多少个文件就有多少个键值对,键的名字就是文件名,值就是文件的内容)kubectl create cm [configmap 名称] --from-file=[目录]
-
应用文件创建(
--from-file
这个参数能够应用屡次,成果就跟指定整个目录是一样的)kubectl create cm [configmap 名称] --from-file=[文件] --from-file=[文件]
-
从字面值创立(
--from-literal
这个参数能够应用屡次)kubectl create cm [configmap 名称] --from-literal=[键 = 值] --from-literal=[键 = 值]
示例:应用字面值创立一个 configMap
kubectl create cm myconfigMap --from-literal=env=dev --from-literal=name=test
[root@node01 test]# kubectl describe cm my`configMap`
Name: myconfigmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
env:
----
dev
name:
----
test
Events: <none>
-
应用
yaml
清单文件创建创立一个
game-demo.yaml
文件,内容如下:apiVersion: v1 kind: ConfigMap metadata: name: game-demo data: # 类属性键;每一个键都映射到一个简略的值 player_initial_lives: "3" ui_properties_file_name: "user-interface.properties" # 类文件键,键的名字就是文件名,值就是文件的内容 game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 user-interface.properties: | color.good=purple color.bad=yellow allow.textmode=true
应用上面的命令创立 configMap
:
kubectl apply -f game-demo.yaml
四、☀️应用 k8s 的 configMap
作为内部配置文件
从后面的介绍咱们能够晓得,spring boot 加载配置文件的最高优先级是 我的项目根门路下的 /config
子目录 ,所以能够将 configMap
中的配置文件挂载到容器中的我的项目根门路下的config
子目录中。
- 能够应用上面的命令从文件中创立一个
configMap
:
kubectl create cm spring-boot-demo --from-file=application.yaml
- 创立一个
spring-boot-demo.yaml
文件内容如下:
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 目录下,构建镜像时的 jar 包也在 /app 目录下
volumeMounts:
- mountPath: /app/config
name: config
imagePullSecrets:
- name: docker-password
volumes:
- configMap:
# 指定咱们创立的 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
- 应用上面的命令创立挂载了配置的 deployment:
kubectl apply -f spring-boot-demo.yaml
- 应用上面的命令进入到容器中查看验证是否挂载到配置的目录:
# 查看 pod
kubectl get pod -n default
# 进入容器
kubectl exec -it spring-boot-demo-76bd6c8857-kwss6 bash
五、☀️被挂载的 configMap
内容会被自动更新
当卷中应用的 configMap
被更新时,所投射的键最终也会被更新。kubelet
组件会在每次周期性同步时查看所挂载的 configMap
是否为最新。不过,kubelet
应用的是其本地的高速缓存来取得 configMap
的以后值。高速缓存的类型能够通过 KubeletConfiguration 构造 的 ConfigMapAndSecretChangeDetectionStrategy
字段来配置。
configMap
既能够通过 watch 操作实现内容流传(默认模式),也可实现基于 TTL 的缓存,还能够间接通过所有申请重定向到 API
服务器。因而,从 configMap
被更新的那一刻算起,到新的主键被投射到 Pod 中去,这一 时间跨度可能与 kubelet
的同步周期加上高速缓存的流传提早相等。这里的流传提早取决于所选的高速缓存类型(别离对应 watch 操作的流传提早、高速缓存的 TTL 时长或者 0)。
以环境变量形式应用的 configMap
数据不会被自动更新,更新这些数据须要重新启动 Pod。
参考文档:
k8s 官网
spring boot 官网