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 实战篇 - 镜像打包部署 - 1minikube 实战篇 - 镜像打包部署 - 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应用

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐