K8S 实战篇 - SpringBoot&ConfigMap - 4
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。ConfigMap在设计上不是用来保存大量数据的。在ConfigMap 中保存的数据不可超过1MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。
K8S 实战篇 - SpringBoot&ConfigMap
这一篇主要介绍SpringBoot项目如何使用K8S中的ConfigMap读取配置。在SpringBoot项目中,启动Springboot项目会加载配置文件application.yaml,之前我一直使用nacos或者git config配置,这次尝试使用configMap配置。
1、configMap是什么
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。ConfigMap在设计上不是用来保存大量数据的。在ConfigMap 中保存的数据不可超过1MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。
从configmap的描述中,说明configmap是通过key-value进行存储的。完全可以存储spring-boot项目的配置。
1.1、单pod使用configmap示例图
pod服务在部署的时候,通常会产生配置文件,配置文件可以存储在configmap中,K8S通过加载configmap的配置,提供给Pod服务使用。
1.2、多pod使用configmap示例图
在微服务的架构中,会存在多于一个项目的部署情况,多项目部署会产生通用的配置,例如:数据库配置、缓存配置、mq配置、日志配置等。k8s允许多个pod引用同一份configmap配置。同时在configmap修改的时候,pod享有配置同步更新的权利。
2、创建configMap
现在需要创建configmap配置,在k8s 实战篇 - 镜像打包部署 - springboot&mysql - 3
中有介绍Spring如何关联mysql查询,其中提到了关于spring 的配置:
# application.yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql.default.svc.cluster.local:3306/docker-demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
username: root
password: 123456
现在需要把application.yaml配置到configmap中去,可以执行命令,kubectl create configmap docker-demo-config --from-file=application.yaml
PS D:\docker-demo\docker-demo-1\src\main\resources> kubectl create configmap docker-demo-config --from-file=application.yaml
configmap/docker-demo-config created
PS D:\docker-demo\docker-demo-1\src\main\resources> kubectl describe configmap docker-demo-config
Name: docker-demo-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
application.yaml:
----
# DataSource Config
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql.default.svc.cluster.local:3306/docker-demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
username: root
password: 123456
BinaryData
====
Events: <none>
现在已经创建好configmap,spring项目需要引入相关配置才行。
3、Springboot项目引入configmap配置
在springboot项目中如何引入configmap的配置呢?一般springboot项目默认支持properties和yaml格式的配置文件,并且有bootstrap和application两种配置,bootstrap配置会优先于application配置文件加载。
相对于默认加载文件的方式,springboot还提供了其他加载文件的方式,如下:
1、配置文件可以存在在4个地方,优先级从高到底依次是
- 项目根目录的config文件夹下
- 项目根目录
- classpath下的config文件夹
- classpath
2、可以在java命令指定加载方式
java -jar docker-demo-1.0.0-SNAPSHOT.jar --spring.config.location=~/application.yml
通过以上方式可以正常加载配置文件。相应的需要configmap或者是k8s提供具体配置文件实体才行。通过相关资料了解,可以把configmap中的配置挂载到卷上面,pod通过挂载卷把配置文件指定到项目根目录的config文件夹下。在docker-demo项目启动的时候就可以正常加载配置,同时要把docker-demo项目中的配置删除掉才行。
3.1 打包到镜像仓库
根据以上描述,首先需要删除docker-demo项目下的application.yaml配置文件,然后在重新进行打包,之后在上传镜像仓库,可以参考minikube 实战篇 - 镜像打包部署 - 1
和minikube 实战篇 - 镜像打包部署 - 2
。
PS D:\minikube\source_data\docker-demo\docker-demo-1> docker push halo26812/docker-demo:0.0.3
The push refers to repository [docker.io/halo26812/docker-demo]eb0645ab0b6a: Pushed
ceaf9e1ebef5: Layer already exists
9b9b7f3d56a0: Layer already exists
f1b5933fe4b5: Layer already exists
3.2 项目挂载卷
推送到镜像仓库之后需要对docker-demo部署到k8s环境,同时要挂载卷到根目录下:
apiVersion: apps/v1
kind: Deployment # 副本控制器RC
metadata:
name: docker-demo-k8s #RC 的名称,全局唯一
namespace: default # 默认空间
spec:
replicas: 1 #Pod 副本的期待数量
selector:
matchLabels:
app: docker-demo-k8s # 符合目标的Pod拥有此标签
template: # 根据此模版创建Pod的副本
metadata:
labels:
app: docker-demo-k8s # Pod副本拥有的标签,对应RC的Selector
spec:
containers: # Pod的内容的定义部分
- name: docker-demo # 容器的名称
image: halo26812/docker-demo:0.0.3 # 容器对应的Docker Image
ports:
- containerPort: 8080 # 容器应用监听的端口号
# 指定配置文件挂载到 /config 目录下,构建镜像时的jar包也在 / 目录下
volumeMounts:
- mountPath: /config
name: config
volumes:
- configMap:
name: docker-demo-config # 指定我们创建的configMap的名字
# 自定义的名字,需要跟 volumeMounts.name 匹配
name: config
---
apiVersion: v1
kind: Service # 表明是Kubernetes Service
metadata:
name: docker-demo-k8s # Service 的全局唯一名称
spec:
type: NodePort
selector:
app: docker-demo-k8s
ports: # Service 提供服务的端口
- port: 8080 # Service 对应的Pod拥有这里定义的标签
3.3 部署docker-demo项目&查看配置是否挂载
执行部署文件,然后查看部署文件是否已经正常加载
PS D:\minikube\source_data> kubectl apply -f .\docker-demo-k8s.yaml
deployment.apps/docker-demo-k8s created
service/docker-demo-k8s created
PS D:\minikube\source_data> kubectl get pods
NAME READY STATUS RESTARTS AGE
docker-demo-k8s-698ff7d985-d2dkq 1/1 Running 0 7s
mysql-647d7dc46f-2dnkz 1/1 Running 0 23d
PS D:\minikube\source_data> kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
docker-demo-k8s NodePort 10.106.237.174 <none> 8080:31823/TCP 67s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 38d
mysql NodePort 10.104.191.103 <none> 3306:31767/TCP 23d
PS D:\minikube\source_data> kubectl exec -it docker-demo-k8s-698ff7d985-d2dkq sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ls
app.jar config etc lib mnt proc run srv tmp var
bin dev home media opt root sbin sys usr
/ # cd config/
/config # ls
application.yaml
/config # cat application.yaml
# DataSource Config
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql.default.svc.cluster.local:3306/docker-demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
username: root
password: 123456
/config #
4、访问请求
请求地址:http://{ip}:{port}/queryUser
正常请求返回数据成功。configmap应用
更多推荐
所有评论(0)