乐趣区

关于springboot:spring-boot-使用-k8s-的-configMap-作为外部配置

一、☀️概述

spring boot 利用以容器的形式运行在 k8s 集群下面是十分不便的,然而不同的环境须要不同的配置文件,咱们能够应用内部的配置核心,比方 nacosapollok8s 也提供了 configMap 用来将环境配置信息和容器镜像解耦,便于利用配置的批改。本文次要从以下几个方面介绍 spring boot 应用 k8sconfigMap 作为内部配置的应用办法:

  • spring boot 加载配置文件介绍
  • k8sconfigMap 介绍
  • 应用 k8sconfigMap 作为内部配置文件

二、☀️spring boot 加载配置文件介绍

当应用程序启动时,Spring Boot 会主动从以下地位查找并加载 application.propertiesapplication.yaml 文件。

配置文件优先级从高到底的程序如下:

  1. file:./config/ – 优先级最高(我的项目根门路下的 /config 子目录)
  2. file:./ – 优先级第二(我的项目根门路下)
  3. classpath:/config/ – 优先级第三(我的项目 resources/config 下)
  4. classpath:/ – 优先级第四(我的项目 resources 根目录)

高优先级配置会笼罩低优先级配置

在同级目录下同时存在 application.propertiesapplication.yaml 文件,那么application.properties 会笼罩 application.yaml 文件

如果咱们运行时想指定运行哪个环境的配置文件,能够有三种形式:

  1. 在我的项目 resources 文件夹下的 application.properties 文件中配置 spring.profiles.active=dev 指定加载的环境
  2. 启动 jar 时,指定 --spring.profiles.active=prod 加载的环境
  3. 启动 jar 时,指定 --spring.config.location=target/application.properties加载配置文件地位

三、☀️k8s 的 configMap介绍

ConfigMap 是一种 API 对象,用来将非机密性的数据保留到键值对中。应用时 pod 能够将其用作环境变量、命令行参数或者存储卷中的配置文件。

留神

ConfigMap 并不提供窃密或者加密性能。如果你想存储的数据是秘密的,请应用 secret或者应用其余第三方工具来保障你的数据的私密性,而不是用 ConfigMap

ConfigMap 在设计上不是用来保留大量数据的,在 ConfigMap 中保留的数据不可超过 1 MiB,如果须要保留超出此限度的数据,你能够思考挂载存储卷或者应用独立的数据库或者文件服务。

创立 configMap 的几种形式:

  1. 应用目录创立 (--from-file 指定在目录下的所有文件都会被用在ConfigMap 外面创立一个键值对,有多少个文件就有多少个键值对,键的名字就是文件名,值就是文件的内容)

    kubectl create cm [configmap 名称] --from-file=[目录]
  2. 应用文件创建(--from-file 这个参数能够应用屡次,成果就跟指定整个目录是一样的)

    kubectl create cm [configmap 名称] --from-file=[文件] --from-file=[文件]
  3. 从字面值创立(--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>
  1. 应用 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 子目录中。

  1. 能够应用上面的命令从文件中创立一个 configMap
kubectl create cm  spring-boot-demo  --from-file=application.yaml
  1. 创立一个 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
  1. 应用上面的命令创立挂载了配置的 deployment:
kubectl apply -f spring-boot-demo.yaml
  1. 应用上面的命令进入到容器中查看验证是否挂载到配置的目录:
# 查看 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 官网

退出移动版