【一起来学kubernetes】17、Configmap使用详解

    • 前言
    • 概述
    • 核心特性
    • 创建 ConfigMap
    • 使用 ConfigMap
          • 1. **环境变量**
          • 2. **Volume 挂载**
          • 3. **命令行参数**
    • 更新与热重载
    • Docker容器中Java服务使用Configmap
      • **一、通过环境变量注入**
        • **步骤说明**
        • **示例配置**
      • **二、通过 Volume 挂载配置文件**
        • **步骤说明**
        • **示例配置**
      • **三、动态刷新配置(高级场景)**
        • **实现原理**
        • **Spring Boot 示例(热更新)**
      • **四、最佳实践**
      • **五、常见问题排查**
    • 典型应用场景
    • 安全与权限
    • 最佳实践
    • 常见问题
    • 总结
    • 拓展

在这里插入图片描述

前言

在上一篇文章中,我们主要介绍了k8s中针对定时任务的批处理任务的资源:CronJob 和 一次性批处理任务的资源 : Job; 在进行任务处理的过程中,不可或缺的一个东西就是配置,接下来我们就把k8s中用于配置配置信息的工具Configmap进行一个深入的介绍


概述

ConfigMap 是 Kubernetes 中用于存储和管理配置数据的资源对象,允许你在不修改容器镜像的情况下,动态注入配置信息到 Pod 中。其核心思想是将配置与应用程序代码解耦,提升灵活性和可维护性。


核心特性

键值对存储:配置数据以 key-value 形式存储,便于灵活读取。
多 Pod 共享:单个 ConfigMap 可被多个 Pod 或服务共享。
动态更新:支持配置热更新(依赖 Volume 类型及 Kubernetes 版本)。
非敏感数据:适用于存储明文配置(如日志级别、超时设置),敏感数据应使用 Secrets


创建 ConfigMap

方式 1:通过 YAML 文件定义

apiVersion: v1
kind: ConfigMap
metadata:name: app-config   # 唯一标识符namespace: default  # 可选命名空间
data:db-host: localhostdb-port: "5432"log-level: info

方式 2:通过 kubectl 命令

kubectl create configmap app-config \--from-file=db.conf \--from-literal=log-level=debug

--from-file:从文件加载键值对(文件名作为 key)。
--from-literal:直接指定键值对。

方式 3:通过 API 创建
使用 curl 或客户端库直接调用 Kubernetes API。


使用 ConfigMap

ConfigMap 可通过以下三种方式注入 Pod:

1. 环境变量

在 Pod 的 env 字段中引用 ConfigMap:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-appenv:- name: DB_HOSTvalueFrom:configMapKeyRef:name: app-config  # ConfigMap 名称key: db-host     # 对应的键
2. Volume 挂载

将 ConfigMap 挂载为目录或文件:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:volumes:- name: config-volumeconfigMap:name: app-configcontainers:- name: my-containerimage: my-appvolumeMounts:- name: config-volumemountPath: /etc/config   # 挂载到容器内的目录

• 挂载后,容器内 /etc/config 目录下会生成以 key 命名的文件(如 db-host)。

3. 命令行参数

在容器启动命令中动态替换参数:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-appargs:- "-db-host=${DB_HOST}"- "-log-level=${LOG_LEVEL}"env:- name: DB_HOSTvalueFrom:configMapKeyRef:name: app-configkey: db-host- name: LOG_LEVELvalueFrom:configMapKeyRef:name: app-configkey: log-level

更新与热重载

手动更新:修改 ConfigMap 后,新 Pod 会自动获取最新配置,旧 Pod 需等待调度器重新调度。
热更新:若使用 volumeMounts 挂载 ConfigMap,部分 Volume 类型(如 emptyDir)支持热更新,但需确保容器进程主动监听文件变化。


Docker容器中Java服务使用Configmap

在 Kubernetes Pod 中运行的 Docker 容器内的 Java 服务可以通过以下两种主要方式使用 ConfigMap 配置的变量:


一、通过环境变量注入

步骤说明
  1. 在 Kubernetes Pod 中配置环境变量
    在 Pod 的 env 字段中引用 ConfigMap 的键值对,Kubernetes 会将这些值注入为容器环境变量。

  2. 在 Java 代码中读取环境变量
    使用 System.getenv() 或框架提供的配置绑定功能(如 Spring Boot 的 @Value)获取变量值。

示例配置

Kubernetes Pod YAML

apiVersion: v1
kind: Pod
metadata:name: java-app
spec:containers:- name: java-containerimage: your-java-imageenv:- name: DB_HOSTvalueFrom:configMapKeyRef:name: app-config   # ConfigMap 名称key: db-host     # ConfigMap 中的键- name: DB_PORTvalueFrom:configMapKeyRef:name: app-configkey: db-port

Java 代码读取(原生方式)

public class ConfigExample {public static void main(String[] args) {String dbHost = System.getenv("DB_HOST"); // 从环境变量读取int dbPort = Integer.parseInt(System.getenv("DB_PORT"));System.out.println("Connecting to DB: " + dbHost + ":" + dbPort);}
}

Java 代码读取(Spring Boot 方式)

@Configuration
public class AppConfig {@Value("${DB_HOST}")private String dbHost;@Value("${DB_PORT}")private int dbPort;// Getter 和业务逻辑
}

关键点:确保 Spring Boot 的 application.propertiesapplication.yml 中未定义同名属性,否则会覆盖环境变量。


二、通过 Volume 挂载配置文件

步骤说明
  1. 将 ConfigMap 挂载为目录
    在 Pod 中定义 Volume,并将 ConfigMap 挂载到容器内的目录(如 /app/config)。

  2. Java 服务读取配置文件
    假设 ConfigMap 中的键值对对应配置文件内容(如 application.yml),Java 服务直接读取该文件。

示例配置

Kubernetes Pod YAML

apiVersion: v1
kind: Pod
metadata:name: java-app
spec:volumes:- name: config-volumeconfigMap:name: app-config   # ConfigMap 名称containers:- name: java-containerimage: your-java-imagevolumeMounts:- name: config-volumemountPath: /app/config   # 挂载到容器内的目录

ConfigMap 数据结构

# app-config ConfigMap
data:application.yml: |db:host: localhostport: 5432log:level: info

Java 代码读取配置文件

public class ConfigLoader {public static void loadConfig(String filePath) {try (InputStream inputStream = new FileInputStream(filePath)) {Yaml yaml = new Yaml(new Constructor(Config.class));Config config = yaml.load(inputStream);System.out.println("DB Host: " + config.getDb().getHost());} catch (IOException e) {e.printStackTrace();}}
}// 配置类映射 YAML 结构
class Config {private Db db;private Log log;// Getter 和 Setter
}class Db {private String host;private int port;// Getter 和 Setter
}class Log {private String level;// Getter 和 Setter
}

三、动态刷新配置(高级场景)

实现原理
  1. 基于文件监听的热更新
    • 将 ConfigMap 挂载为 Volume,并监控配置文件变化(如 Spring Boot 的 spring.cloud.config监视)。
    • 需容器内进程主动监听文件变动(如 Spring Boot 的 @RefreshScope)。

  2. 使用 Kubernetes ConfigMap 事件监听
    • 通过客户端库监听 ConfigMap 变更事件,动态更新应用配置(适用于自定义框架)。

Spring Boot 示例(热更新)
# application.yml
spring:cloud:config:monitor:enabled: truepoll-interval: 5s
@RestController
@RefreshScope
public class DynamicConfigController {@Value("${db.host}")private String dbHost;@GetMapping("/config")public String getDbHost() {return dbHost;}
}

依赖:需添加 spring-cloud-starter-configspring-boot-starter-actuator 依赖。


四、最佳实践

  1. 优先选择环境变量
    • 简单直接,适合键值对较少的配置(如数据库地址、开关标志)。
    • 与 Kubernetes 生态无缝集成,无需额外代码。

  2. 文件挂载适合复杂配置
    • 当配置结构复杂(如多层级 JSON/YAML)时,将 ConfigMap 映射为配置文件更易管理。
    • 需确保容器内有文件解析逻辑。

  3. 结合 Secrets 处理敏感数据
    • 使用 Secrets 存储密码、API 密钥等敏感信息,避免硬编码。

  4. 配置版本化管理
    • 通过 Git 或 ConfigMap 的 data 字段版本历史跟踪变更。


五、常见问题排查

Q1: ConfigMap 变量未生效?
• 检查 Pod 日志:kubectl logs <pod-name> -c java-container
• 确认 ConfigMap 名称和键名拼写一致。
• 若使用文件挂载,验证挂载路径是否正确(如 /app/config)。

Q2: 如何调试环境变量?
• 在 Pod 中运行命令查看环境变量:

kubectl exec <pod-name> -c java-container -- printenv | grep DB_

通过以上方法,Java 服务可以灵活地集成 Kubernetes ConfigMap,实现配置与代码的解耦,提升部署和维护效率。

典型应用场景

  1. 数据库配置:存储主机、端口、用户名、密码(非敏感部分)。
  2. API 密钥:管理第三方服务的访问令牌(需结合 Secrets)。
  3. 环境变量:动态调整日志级别、超时时间等运行时参数。
  4. 模板配置:注入 Nginx/Redis 配置文件内容。

安全与权限

RBAC 控制:通过 kubectl auth can-i 或 YAML 中的 roles/rolebindings 限制 ConfigMap 的访问权限。
敏感数据:避免存储密码等机密信息,改用 Secrets(加密存储)。
命名空间隔离:ConfigMap 默认作用域为当前命名空间,跨命名空间访问需显式指定。


最佳实践

  1. 命名规范:使用 configmap/<应用>-<环境>(如 configmap/web-prod)。
  2. 分层配置:将复杂配置拆分为多个 ConfigMap,按需组合。
  3. 版本控制:结合 Git 管理 ConfigMap 的变更历史。
  4. 监控日志:通过 kubectl describe configmap 查看变更记录。
  5. 文档化:记录 ConfigMap 中各键值的含义及默认值。

常见问题

Q1: ConfigMap 更新后 Pod 未生效?
A: 确保 Pod 使用了正确的 ConfigMap 名称,并检查是否通过 volumeMounts 挂载。对于热更新,需确认容器进程支持文件变更监听(如 Node.js 的 fs.watch)。

Q2: 如何加密 ConfigMap 数据?
A: Kubernetes 不原生支持加密 ConfigMap,但可通过以下方式实现:
• 使用 Secrets 存储加密数据。
• 在部署前对值进行 Base64 编码,部署后再解码(牺牲可读性)。


总结

ConfigMap 是 Kubernetes 中不可或缺的配置管理工具,通过解耦配置与代码,显著提升了部署和维护的效率。合理使用 ConfigMap 结合 Secrets、RBAC 和自动化工具(如 Helm),可以构建 robust 的云原生应用架构。

拓展

【一起来学kubernetes】15、Job使用详解

【一起来学kubernetes】14、StatefulSet使用详解

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

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

相关文章

【八股文】从浏览器输入一个url到服务器的流程

1.url解析与DNS解析 浏览器解析用户输入的URL&#xff0c;提取协议&#xff08;HTTP\HTTPS&#xff09;、域名、端口及路径等信息 浏览器首先检查本地DNS缓存和系统DNS缓存&#xff0c;若未命中&#xff0c;查询本地hosts文件 最后递归查询向本地DNS服务器发起请求&#xff…

网络空间安全(34)安全防御体系

前言 安全防御体系是一个多层次、多维度的系统&#xff0c;旨在保护组织或个人的信息资产免受各种网络攻击和威胁。 一、技术层面 网络边界防御 防火墙&#xff1a;部署在网络边界&#xff0c;通过设定规则允许或阻止特定流量的进出&#xff0c;保护内部网络不受外部攻击。入侵…

Linux 入门:权限的认识和学习

目录 一.shell命令以及运行原理 二.Linux权限的概念 1.Linux下两种用户 cannot open directory .: Permission denied 问题 2.Linux权限管理 1).是什么 2).为什么&#xff08;权限角色目标权限属性&#xff09; 3).文件访问者的分类&#xff08;角色&#xff09; 4).文…

【笔记】计算机网络——数据链路层

概述 链路是从一个结点到相邻结点的物理路线&#xff0c;数据链路则是在链路的基础上增加了一些必要的硬件和软件实现 数据链路层位于物理层和网络层之间&#xff0c;它的核心任务是在直接相连的节点&#xff08;如相邻的交换机&#xff0c;路由器&#xff09;之间提供可靠且…

ngx_url_t

定义在 src/core/ngx_inet.h typedef struct {ngx_str_t url;ngx_str_t host;ngx_str_t port_text;ngx_str_t uri;in_port_t port;in_port_t default_port;in_port_t …

搜广推校招面经五十四

美团推荐算法 一、手撕Transformer的位置编码 1.1. 位置编码的作用 Transformer 模型没有显式的序列信息&#xff08;如 RNN 的循环结构&#xff09;&#xff0c;因此需要通过位置编码&#xff08;Positional Encoding&#xff09;为输入序列中的每个位置添加位置信息。位置…

网络爬虫【爬虫库urllib】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 urllib介绍 Urllib是Python自带的标准库&#xff0c;无须安装&#xff0c;直接引用即可。 Urllib是一个收集几个模块来使用URL的软件包&#xff0c;大致具备以下功能。 ● urlli…

LabVIEW棉花穴播器排种自动监测系统

一、项目背景与行业痛点 1. 农业需求驱动 我国棉花主产区&#xff0c;种植面积常年超250万公顷&#xff0c;传统人工播种存在两大核心问题&#xff1a; 效率瓶颈&#xff1a;人均日播种面积不足0.5公顷&#xff0c;难以匹配规模化种植需求&#xff1b; 精度缺陷&#xff1a;人…

解决diffusers加载stablediffusion模型,输入prompt总是报错token数超出clip最大长度限制

1. StableDiffusion1.5 在加载huggingface中的扩散模型时&#xff0c;输入prompt总是会被报错超过clip的最大长度限制。 解决方案&#xff1a;使用compel库 from diffusers import AutoPipelineForText2Image import torch import pdb from compel import Compeldevice torc…

jmeter配件元素

jmeter配件元素 CSV Data Set Config名词解释测试场景Recycle on EOF:False配置测试结果 Recycle on EOF:True配置测试结果 Sharing mode:All Threads配置测试结果 Sharing mode:Current thread group配置测试结果 Sharing mode:Current thread配置测试结果 HTTP Header Manage…

Navicat SqlServer 设置自增主键

Navicat是一款优秀的数据库管理工具&#xff0c;可以连接很多类型的数据库。使用它可以极大的提高工作效率。 Navicat 不能设置SqlServer自增字段&#xff0c;只能通过sql语句来实现 建表时设置 create table <表名> ( <字段1-主键> int identity (1,1) primar…

Elasticsearch搜索引擎 3(DSL)

Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;语句来定义查询条件&#xff0c;其JavaAPI就是在组织DSL条件。 1.DSL查询 叶子查询&#xff08;Leaf query clauses&#xff09;&#xff1a;在特定的字段里查询特定值&#xff0c;属于简单…

final 在 java 中有什么作用?

final 在 java 中有什么作用&#xff1f; 修饰变量 修饰基本数据类型变量&#xff1a; 当用final修饰基本数据类型变量时&#xff0c;该变量就变成了常量&#xff0c;其值在初始化后不能被改变。 final int num 10; // num 20; // 这行代码会导致编译错误&#xff0c;因…

Dubbo/Hession2序列化Immutable类型的集合异常问题

问题排查 根据堆栈信息可见&#xff0c;dubbo使用默认的hession2进行序列化时出现了异常&#xff0c;异常堆栈根原因为&#xff1a;null array 位于java.util.CollSer#readResolve方法中&#xff0c;即在序列化集合时&#xff0c;集合数组为空。 向上追溯jdk.internal.ref…

目标检测任务,如何区分两个相近似的目标

首先&#xff0c;要了解清楚检测的场景下&#xff0c;肉眼能否区分出目标的差异性。 如果可以区分&#xff0c;那观察数据周围背景的差异是否较大&#xff0c;可以先通过添加样本来提升模型的检测精度。添加样本时一定要注意&#xff0c;样本标注的准确性&#xff0c;样本的丰…

Java面试黄金宝典1

1. 8 种基本数据类型 整数类型 byte&#xff1a; 它是最小的整数类型&#xff0c;占用 1 个字节&#xff08;8 位&#xff09;。在一些对内存使用要求极高的场景&#xff0c;比如嵌入式系统开发、数据传输时对数据量有严格限制的情况&#xff0c;会使用 byte 类型。例如&#x…

OSGEarth

OSGEarth 基于 OpenSceneGraph 构建的一个扩展库&#xff0c;专门用于地球科学和地理信息系统&#xff08;GIS&#xff09;数据的可视化。它允许开发者创建逼真的三维地球模型&#xff0c;并在其上展示各种地理空间数据。 高端一点的表述 基于三维引擎osg开发的三维数字地球…

Word 小黑第34套

对应大猫34 设置第二页水印&#xff0c;取消第一页的&#xff1a;取消第二页页眉链接&#xff0c;删除第一张水印图片&#xff08;delete&#xff09; 调整水印图片&#xff1a;点开页眉页脚 双击图片 可以调整 邮件合并 -创建标签 横标签数3 竖标签5 表布局 -查看网格线 插…

2.5.1 io_uring

文章目录 2.5.1 io_uring1. 对比1. select、poll、epoll 对比表格2. 关键特性说明&#xff1a;3. 应用场景 2. 异步io1. 频繁copy2. 如何做到线程安全 3. io_uring1. 实现2. 关键点&#xff1a;3. 问题1. Reactor 与 Proactor 的三点不同2. epoll 与 io_uring 的区别 2.5.1 io_…

K8S学习之基础三十六:node-exporter部署

Prometheus v2.2.1 ​ 编写yaml文件&#xff0c;包含创建ns、configmap、deployment、service # 创建monitoring空间 vi prometheus-ns.yaml apiVersion: v1 kind: Namespace metadata:name: monitoring# 创建SA并绑定权限 kubectl create serviceaccount monitor -n monito…