K8S ConfigMap 快速开始

一、什么是 ConfigMap?

ConfigMap 是 Kubernetes 中用于存储非敏感配置数据的 API 对象,支持以键值对(Key-Value)或文件的形式存储配置,允许将配置与镜像解耦,实现配置的集中管理和动态更新。

二、主要用途

  • 存储配置数据
  • 应用的配置文件(如 config.propertiesapp.yaml)。
  • 环境变量(如数据库连接字符串、API 地址)。
  • 命令行参数或启动脚本。
  • 解耦配置与镜像
  • 同一镜像可通过不同 ConfigMap 适配不同环境(如开发环境使用本地数据库,生产环境使用远程数据库)。
  • 使用 ConfigMap 可以统一管理不同环境(开发、测试、生产)的配置差异。
  • 解耦应用配置与镜像,避免硬编码配置到镜像中。
  • 动态更新配置
  • 修改 ConfigMap 后,可通过重启 Pod 或热加载(依赖应用支持)使新配置生效。

三、局限性

  • ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret。
  • 在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。
  • ConfigMap 的热加载依赖应用自己实现。

四、创建 ConfigMap 的方式

ConfigMap 可通过 kubectl 命令或 YAML 文件创建,支持三种数据源:文件目录字面量

4.1、通过 kubectl 命令创建

4.1.1、使用字面量创建

kubectl create configmap my-config --from-literal=username=admin --from-literal=password=123456
  •  --from-literal=key1=config1 --from-literal=key2=config2
  • literal 字面量的意思
  • configmap 可以简写为 cm
kubectl describe cm my-config

 

4.1.2、使用文件创建

# 单个文件
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt# 文件名 file1.txt 作为 key
kubectl create configmap my-config --from-file=/path/to/bar/file1.txt# 多个文件
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
  •  单个文件
vim config.properties### 文件内容如下
server.port=8080
application.name=myapp
kubectl create configmap my-config --from-file=config=./config.properties

# 文件名作为 key
kubectl create cm my-config --from-file=config.properties

  •  多个文件
vim db.properties### 文件内容如下
datasource.username=root
datasource.password=123456
datasource.url=jdbc:mysql://localhost:3306/order
kubectl create configmap my-config --from-file=config.properties --from-file=db.properties

 

4.1.3、使用目录创建

kubectl create configmap my-config --from-file=path/to/bar
mkdir conf
cd conf
vim application.yaml
### 文件内容如下
server:port: 8080spring:cloud:nacos:discovery:username: nacospassword: nacosgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848application:name: order-service
###
vim db.properties
### 文件内容如下
datasource.username=root
datasource.password=123456
datasource.url=jdbc:mysql://localhost:3306/order
###
cd ..

 

kubectl create cm my-config --from-file=conf

 

4.2、通过 YAML 文件创建

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: my-config
data:username: "admin"password: "123456"application.yaml: |server:port: 8080db.properties: |datasource.username=rootdatasource.password=123456

 | 表示下面的内容为多行。

kubectl apply -f configmap.yaml

 

五、在 Pod 中使用 ConfigMap

ConfigMap 可通过 环境变量 或 Volume 挂载 注入到容器中。

我们以 4.2 节创建的 my-config 为例,来讲解如何在 Pod 中使用 ConfigMap。

5.1、作为环境变量注入 env

apiVersion: v1
kind: Pod
metadata:name: envcm-pod
spec:restartPolicy: Nevercontainers:- name: envcm-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]env:- name: USERNAME # 定义容器中的环境变量valueFrom:configMapKeyRef:name: my-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: my-configkey: password 
  •  像 Alpine 镜像,或者基于 Alpine 制作的工具镜像,容器内没有运行服务,需要启动后休眠一段时间,防止容器被 K8S 杀掉。
  • restartPolicy: Never 休眠结束后容器退出就退出了,不需要 K8S 重启该容器。默认是 Always 总是重启。设为 Never 防止浪费系统资源。
  •  进入容器查看环境变量
kubectl exec -it envcm-pod -- /bin/sh
/# env
USERNAME=admin
PASSWORD=123456

 5.2、作为环境变量注入 envFrom

apiVersion: v1
kind: Pod
metadata:name: envfrom-pod
spec:restartPolicy: Nevercontainers:- name: envcm-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]envFrom:- configMapRef:name: my-config

 以整个 ConfigMap 作为环境变量数据源。

  •   进入容器查看环境变量
kubectl exec -it envfrom-pod -- /bin/sh
/ # env

5.3、环境变量方式使用的 ConfigMap 数据不会被自动更新

以环境变量方式使用的 ConfigMap 数据不会被自动更新。 更新这些数据需要重新启动 Pod。

# 编辑 ConfigMap
kubectl edit cm my-config
# 把 password 从 123456 -> 456789
# 像 vim 一样 wq 保存退出

  •  进入容器查看环境变量
kubectl exec -it envcm-pod -- /bin/sh
/# env
USERNAME=admin
# 还是 123456
PASSWORD=123456 kubectl exec -it envfrom-pod -- /bin/sh
# 还是 123456
password=123456

 5.4、通过 Volume 挂载为文件

apiVersion: v1
kind: Pod
metadata:name: volumes-pod
spec:restartPolicy: Nevervolumes:- name: volumes-name # 卷的名字configMap:name: my-config # ConfigMap 的名字containers:- name: volumes-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]volumeMounts:- name: volumes-namemountPath: /data/conf # 挂载到容器哪个目录
  •   进入容器查看文件
kubectl exec -it volumes-pod -- /bin/sh

以 Volume 形式挂载 ConfigMap,ConfigMap 每一个 key 都会生成一个文件。  

  •    进入容器查看环境变量
kubectl exec -it volumes-pod -- /bin/sh
/# env
环境变量中不会有配置信息

 5.5、热加载

# 编辑 ConfigMap
kubectl edit cm my-config
# 把 password 从 456789 -> 111111
# 像 vim 一样 wq 保存退出
  •     进入容器查看文件
kubectl exec -it volumes-pod -- /bin/sh

容器内文件的值被更新了。但是会有一定的延迟。具体延迟多少,官方介绍取决于高速缓存类型。

5.6、items 选取 key

我们知道,以 Volume 形式挂载 ConfigMap,ConfigMap 的每一个 key 都会生成一个文件。

对于 4.2 的 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:name: my-config
data:username: "admin"password: "123456"application.yaml: |server:port: 8080db.properties: |datasource.username=rootdatasource.password=123456

会生成 username、password、application.yaml、db.properties 这四个文件。

那么,如果我们希望普通的属性,像 username、password 注入到环境变量,而 application.yaml、db.properties 这种,生成文件,要怎么做呢?

apiVersion: v1
kind: Pod
metadata:name: volumes-items-pod
spec:restartPolicy: Nevervolumes:- name: volumes-name # 卷的名字configMap:name: my-config # ConfigMap 的名字items:- key: "application.yaml" # ConfigMap 的 keypath: "application.yaml" # key 映射成的文件- key: "db.properties"path: "db.properties" containers:- name: volumes-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]env:- name: USERNAME # 定义容器中的环境变量valueFrom:configMapKeyRef:name: my-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: my-configkey: password volumeMounts:- name: volumes-namemountPath: /data/conf

通过 .volumes.configMap.items 选取需要做成卷的 ConfigMap key-value。

kubectl exec -it volumes-items-pod -c volumes-pod -- /bin/sh
/ # env
USERNAME=admin
PASSWORD=111111

5.7、名称空间限定

ConfigMap 是一种名称空间限定的资源。某一名称空间下的 Pod,只能引用同一名称空间下的 ConfigMap。

对于 4.2 的 ConfigMap,我们没有写,就是默认 default 名称空间下。现在我们 dev 名称空间下的一个 Pod:

apiVersion: v1
kind: Pod
metadata:name: cmns-podnamespace: dev
spec:restartPolicy: Nevercontainers:- name: cmns-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]env:- name: USERNAME # 定义容器中的环境变量valueFrom:configMapKeyRef:name: my-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: my-configkey: password

容器会报 CreateContainerConfigError 起不来。

5.8、多环境配置

ConfigMap 是名称空间限定的资源,所以在多名称空间环境下(比如 dev、prod),我们可以给每个名称空间创建同名的配置,然后在不同名称空间下的 Pod 引用这些配置。

# 创建名称空间
kubectl create ns dev
kubectl create ns prod
# 创建 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:name: app-confignamespace: dev
data:username: "dev"password: "123456"
###
apiVersion: v1
kind: ConfigMap
metadata:name: app-confignamespace: prod
data:username: "prod"password: "123456"
  •  dev 下启动 Pod:
apiVersion: v1
kind: Pod
metadata:name: cmns-podnamespace: dev
spec:restartPolicy: Nevercontainers:- name: cmns-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["env"]env:- name: USERNAME # 定义容器中的环境变量valueFrom:configMapKeyRef:name: app-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: app-configkey: password 

  • prod 下启动 Pod:
apiVersion: v1
kind: Pod
metadata:name: cmns-podnamespace: prod
spec:restartPolicy: Nevercontainers:- name: cmns-podimage: alpine:latest  imagePullPolicy: IfNotPresentcommand: ["env"]env:- name: USERNAME # 定义容器中的环境变量valueFrom:configMapKeyRef:name: app-config # ConfigMap 的名字key: username # ConfigMap 中的 key - name: PASSWORDvalueFrom:configMapKeyRef:name: app-configkey: password 

六、Java 项目使用 ConfigMap 热加载配置

到此,我们知道了 ConfigMap 如果作为 Spring Boot 项目的配置的话,存在一些不足:

1、时效性不高。ConfigMap 可以作为配置文件挂载进容器文件系统,但是这中间会有一些延迟。而且,Spring Boot 项目在启动的时候加载了一次 application.yml 之类的配置文件后,就不会再加载了。这个时候 ConfigMap 再更新配置文件其实没什么意义。

2、时效性更好的环境变量的方式,ConfigMap 却无法更新。

所以,Spring Boot 项目需要自己监听 ConfigMap 变化,然后更新 Environment。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus使用Recoding Rules优化性能

通过PromQL可以实时对Prometheus中采集到的样本数据进行查询,聚合以及其它各种运算操作。而在某些PromQL较为复杂且计算量较大时,直接使用PromQL可能会导致Prometheus响应超时的情况。这时需要一种能够类似于后台批处理的机制能够在后台完成这些复杂运算…

C++ RAII 编程范式详解

C RAII 编程范式详解 一、RAII 核心概念 RAII(Resource Acquisition Is Initialization,资源获取即初始化) 是 C 的核心编程范式,通过将资源生命周期与对象生命周期绑定实现安全、自动化的资源管理。 核心原则: 资源…

Rust 学习笔记:枚举与模式匹配

Rust 学习笔记&#xff1a;枚举与模式匹配 Rust 学习笔记&#xff1a;枚举与模式匹配定义枚举&#xff08;Enum&#xff09;枚举变量Option 枚举及其相对于 NULL 的优势match 和枚举与 Option\<T\> 匹配match 应该是详尽的Catch-all 模式和 _ 占位符使用 if let 和 let e…

《WebGIS之Vue进阶教程》(13)ref的实现

1 为什么需要ref 由于proxy只能代理引用类型数据(如: 对象, 数组, Set, Map...), 需要一种方式代理普通类型数据(String, Number, Boolean...) 设计ref主要是为了处理普通类型数据, 使普通类型数据也具有响应式 除此之外, 通过reactive代理的对象可能会出现响应丢失的情况. 使…

Redis 缓存并发问题深度解析:击穿、雪崩与穿透防治指南

Redis-缓存并发 引言&#xff1a;缓存&#xff0c;高性能架构的基石与并发挑战一、 缓存击穿&#xff1a;热点 Key 失效引发的“单点风暴”1.1 什么是缓存击穿&#xff1f;1.2 缓存击穿的风险1.3 缓存击穿的解决方案1.3.1 互斥锁&#xff08;Mutex Lock&#xff09;/ 分布式锁 …

Python 数据智能实战 (4):智能用户分群 - 融合行为

写在前面 —— 超越 RFM 标签,结合用户行为与 LLM 文本洞察,实现更精准、更立体的客户细分 欢迎回来!在前面的学习中,我们已经为 Python 数据智能工具箱添置了与大语言模型 (LLM) 交互的能力,特别是掌握了如何利用 LLM 将非结构化的文本信息转化为包含深层语义的数值向量…

FreeMarker语法深度解析与Node.js集成实践指南

一、FreeMarker核心语法体系 1.1 基础模板结构 <#-- 注释语法 --> ${expression} <#-- 输出表达式 --> <#directive paramvalue> <#-- 指令语法 -->1.2 数据类型处理 标量类型深度处理&#xff1a; <#assign num 123.45?floor> <#--…

【计算机视觉】目标检测:深度解析YOLOv5:下一代实时目标检测框架实战指南

深度解析YOLOv5&#xff1a;下一代实时目标检测框架实战指南 技术演进与架构设计YOLO系列发展脉络YOLOv5核心架构1. 骨干网络&#xff08;Backbone&#xff09;2. 特征融合&#xff08;Neck&#xff09;3. 检测头&#xff08;Head&#xff09; 环境配置与快速开始硬件要求建议详…

STM32 定时器TIM

定时器基础知识 定时器就是用来定时的机器&#xff0c;是存在于STM32单片机中的一个外设。STM32总共有8个定时器&#xff0c;分别是2个高级定时器(TIM1、TIM8)&#xff0c;4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM6、TIM7)&#xff0c;如下图所示: STM32F1…

OpenObserve API Usage Guide for Log Management

OpenObserve API Usage Guide for Audit Log Management 1. 概述 1.1 目标 本文档旨在详细介绍 OpenObserve 的 API 使用方法&#xff0c;帮助用户通过 API 实现日志管理功能&#xff0c;包括日志摄入、查询、模糊匹配&#xff08;类似 SQL 的 LIKE&#xff09;、stream 管理…

消防岗位技能竞赛流程方案策划

一、比赛目的&#xff1a; 为大力倡导“11.9”全国消防安全活动月&#xff0c;紧紧围绕“人人参与消防&#xff0c;共创平安和谐”的活动主题&#xff0c;结合公司实际情况&#xff0c;特开展一次消防技能竞赛活动。开展一场比思想、比工作作风、比消防业务技能、比业余文化生…

DAY9-USF4.0技术文档笔记

目录 1.概述 2.参考协议标准 3.术语与定义 4.引言 5.UFS架构 6.UFS电气特性&#xff1a;时钟、复位、信号与电源 7.复位、加电升压和断电降压 8. M-PHY 9.UniPro 10.UTP 11.SCSI 12.UFS安全 13.UFS功能描述 14.描述符、标志与属性 15.UFS机械标准 SCSI 查询命令 1.重要产品…

安装kubernetes 1.33版本

一、环境准备 1、内核升级 #升级内核&#xff1a; yum -y install kernel-ml-5.10.3-1.el7.elrepo.x86_64.rpm kernel-ml-devel-5.10.3-1.el7.elrepo.x86_64.rpm# 查询可用内核版本 # awk -F\ $1"menuentry " {print i " : " $2} /etc/grub2.cfg# 调整默…

【IPMV】图像处理与机器视觉:Lec8 Image Pyramid 图像金字塔

【IPMV】图像处理与机器视觉 本系列为2025年同济大学自动化专业**图像处理与机器视觉**课程笔记 Lecturer: Rui Fan、Yanchao Dong Lec0 Course Description Lec3 Perspective Transformation Lec7 Image Filtering Lec8 Image Pyramid 持续更新中 文章目录 【IPMV】图像处…

产品经理.产品设计.产品设计工具

一、 产品经理常用工具 1. 业务流程图---系统流程图 业务流程图&#xff0c;面向用户调研&#xff0c;描述业务的流转和数据的处理要求&#xff0c;跟用户和业务方确认&#xff1b;---业务角色的泳道流程图。 系统流程图&#xff0c;面向产品需求设计&#xff0c; prd系描述各…

6轴、智能、低功耗惯性测量单元BMI270及其OIS接口

BOSCH惯性传感器IMUs 芯片代码 通过00寄存器读回的芯片编码可以判断芯片型号,BMI270为(0x24) &#xff0c;如不是该值&#xff0c;则说明不是BMI270。 型号芯片代码BMI085CHIP_ID ( 0x1F)BMI088CHIP_ID ( 0x1E)BMI160CHIP_ID (0xD1)BMI270CHIP_ID (0x24)BMI323CHIP_ID (0x004…

【文献速递】邻位连接技术(PLA)在细胞器相互作用中的应用

在神经科学研究领域&#xff0c;细胞死亡机制一直是关注的重点&#xff0c;尤其是与神经退行性疾病相关的细胞死亡形式。荷兰格罗宁根大学的研究人员在2025年发表了“Regulation of calcium signaling prevents neuronal death mediated by NIST DEP in xenoferroptotic cell d…

六.割草机技术总结--6.RTK定位精度分析

六.割草机技术总结–6.RTK定位精度分析 6.1 1cm+1ppm 中的ppm是什么意思? 精度 RTK 位置精度(在 RTK 时)1 cm + 1 ppm ( 水 平 ) 1 . 5 cm + 1 ppm ( 垂 直 ),其中的ppm是什么意思? 在RTK(实时动态定位)技术中,ppm表示 Parts Per Million(百万分之一),是一种与距离…

MCP的基础知识

一、了解MCP的基础知识 1.函数调用Function Calling Function Calling是openai在2023年推出的一个非常重要的概念&#xff1a;Function Calling&#xff08;函数调用&#xff09;本质上就是提供了大模型与外部系统的交互能力&#xff0c;类似于给大模型安装了一个“外挂工具箱…

量化交易之数学与统计学基础2.4——线性代数与矩阵运算 | 矩阵分解

量化交易之数学与统计学基础2.4——线性代数与矩阵运算 | 矩阵分解 第二部分&#xff1a;线性代数与矩阵运算 第4节&#xff1a;矩阵分解&#xff1a;奇异值分解&#xff08;SVD&#xff09;在数据压缩和风险分解的应用 一、奇异值分解&#xff08;SVD&#xff09;基础&#xf…