玩转 Kubernetes 配置管理:ConfigMap 和 Secret 实战演示
目录
- 一、简介
- 二、ConfigMap
- 2.1 基于目录创建 ConfigMap
- 2.2 基于文件创建 ConfigMap
- 2.3 从环境文件创建 ConfigMap
- 2.4 定义从文件创建 ConfigMap 时要使用的键
- 2.5 根据字符串创建 ConfigMap
- 三、Secret
- 3.1 基于文件创建Secret
- 3.2 基于字符串创建Secret
- 3.3 yaml文件方式创建secret
- 四、在Pod中使用ConfigMap和Secret
- 4.1 使用ConfigMap 的数据定义容器环境变量
- 4.2 将 ConfigMap 中的所有键值对配置为容器环境变量
- 4.3 将 ConfigMap 数据挂载到一个卷中
- 4.4 在Pod中使用Secret
- 附录
- game.properties
- ui.properties
- game-env-file.properties
- ui-env-file.properties
一、简介
Kubernetes 是一个广泛使用的容器编排平台,它提供了一系列的组件和核心概念来帮助用户管理容器化的应用程序。在 Kubernetes 中,ConfigMap 和 Secret 是两个重要的概念,它们用于管理应用程序的配置信息和敏感信息。在本文中,我们将深入介绍 Kubernetes 中的 ConfigMap 和 Secret,并演示如何使用命令行和 YAML 文件创建它们。我们还将通过一个实际的应用程序场景来演示如何使用 ConfigMap 和 Secret 来管理应用程序的配置和敏感信息。本文适合 Kubernetes 初学者和使用者,希望能够帮助读者更好地理解和使用 ConfigMap 和 Secret。
二、ConfigMap
ConfigMap:用于存储应用程序的配置信息,例如环境变量、配置文件等。 可以通过挂载到 Pod 中的卷或环境变量的方式使用。
使用 kubectl create configmap 命令基于目录、 文件或者字符串来创建 ConfigMap
2.1 基于目录创建 ConfigMap
可以使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap。 当你基于目录来创建 ConfigMap 时,kubectl 识别目录下基本名可以作为合法键名的文件, 并将这些文件打包到新的 ConfigMap 中。普通文件之外的所有目录项都会被忽略 (例如:子目录、符号链接、设备、管道等等)。
#1. 基于目录创建 ConfigMap
mkdir -p configure-pod-container/configmap/# 准备game.properties 和 ui.properties 文件
# 将示例文件下载到 configure-pod-container/configmap/ 目录
wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.propertieskubectl create configmap game-config --from-file=configure-pod-container/configmap/ -n testkubectl get cm -n testkubectl describe cm game-config -n testkubectl get configmaps game-config -o yaml -n test


2.2 基于文件创建 ConfigMap
可以使用 kubectl create configmap 基于单个文件或多个文件创建 ConfigMap。
# 基于文件创建 ConfigMap
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.propertieskubectl describe configmaps game-config-2#可以多次使用 --from-file 参数,从多个数据源创建 ConfigMap。
kubectl create configmap game-config-3 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.propertieskubectl describe configmaps game-config-3
2.3 从环境文件创建 ConfigMap
使用 --from-env-file 选项从环境文件创建 ConfigMap
Env 文件包含环境变量列表。其中适用以下语法规则:
- Env 文件中的每一行必须为
VAR=VAL格式。 - 以
#开头的行(即注释)将被忽略。 - 空行将被忽略。
- 引号不会被特殊处理(即它们将成为 ConfigMap 值的一部分)。
# 将示例文件下载到 configure-pod-container/configmap/ 目录:
wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties
wget https://kubernetes.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties#
kubectl create configmap game-config-env-file \--from-env-file=configure-pod-container/configmap/game-env-file.properties -n testkubectl get configmap game-config-env-file -n test -o yaml

从 Kubernetes 1.23 版本开始,kubectl 支持多次指定 --from-env-file 参数来从多个数据源创建 ConfigMap。
kubectl create configmap config-multi-env-files \--from-env-file=configure-pod-container/configmap/game-env-file.properties \--from-env-file=configure-pod-container/configmap/ui-env-file.properties
2.4 定义从文件创建 ConfigMap 时要使用的键
在使用 --from-file 参数时,你可以定义在 ConfigMap 的 data 部分出现键名, 而不是按默认行为使用文件名:kubectl create configmap game-config-3 --from-file=<我的键名>=<文件路径>,<我的键名> 是你要在 ConfigMap 中使用的键名,<文件路径> 是你想要键所表示的数据源文件的位置。
kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties -n testkubectl get configmaps game-config-3 -n test -o yaml

2.5 根据字符串创建 ConfigMap
可以将 kubectl create configmap 与 --from-literal 参数一起使用, 通过命令行定义文字值。
可以传入多个键值对。命令行中提供的每对键值在 ConfigMap 的 data 部分中均表示为单独的条目。
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm -n testkubectl get configmaps special-config -n test -o yaml

三、Secret
Secret:用于存储敏感信息,例如密码、证书等。Secret 提供了一种安全地存储和传输敏感信息的方式,可以通过挂载到 Pod 中的卷或环境变量的方式使用。
Secret有三种类型:
- Service Account : 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中。
- Opaque:base64 编码格式的Secret,用来存储密码、密钥等
- kubernetes.io/dockerconfigjson: 用来存储私有 docker registry 的认证信息
3.1 基于文件创建Secret
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt
# 从文件创建
kubectl create secret generic user-pass-secret --from-file=./username.txt --from-file=./password.txt -n testkubectl get secret -n testkubectl describe secrets/user-pass-secret -n test
# 通过yaml文件方式查看
kubectl get secrets/user-pass-secret -n test -o yaml# 删除secret
kubectl delete secrets/user-pass-secret -n test


可以看到secrets中的数据是经过base64编码的。
echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
echo 'YWRtaW4=' | base64 --decode

3.2 基于字符串创建Secret
kubectl create secret generic db-user-pass \--from-literal=username=admin \--from-literal=password='123456' \-n test
kubectl get secret -n test
kubectl get secrets/db-user-pass -n test -o yaml

如果密码中包含特殊字符需要转码(例如 $、*、\、!),请使用 \ 进行转码
3.3 yaml文件方式创建secret
需要先将字符串进行base64编码
echo -n 'admin' | base64
echo -n '123456' | base64

编写yaml文件:
apiVersion: v1
kind: Secret
metadata:name: mysecretnamespace: test
type: Opaque
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm
执行kubectl apply -f secret.yaml 命令创建。
如果并不想先将用户名和密码转换为 base64 编码之后再创建 Secret,则,可以通过定义 stringData 实现:
data 字段用来存储 base64 编码的任意数据。 提供 stringData 字段是为了方便,它允许 Secret 使用未编码的字符串。 data 和 stringData 的键必须由字母、数字、-、_ 或 . 组成。
apiVersion: v1
kind: Secret
metadata:name: mysecretnamespace: test
type: Opaque
stringData:username: adminpassword: '123456'
执行命令 kubectl apply -f secret.yaml 创建。
但是此时在元数据信息 annotation 中可以看到 password 的明文:
kubectl get secret mysecret -o yaml -n test

四、在Pod中使用ConfigMap和Secret
4.1 使用ConfigMap 的数据定义容器环境变量
创建ConfigMap
# 创建一个ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: test
data:special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:name: env-confignamespace: test
data:log_level: INFO
创建Pod yaml文件,在spec.containers层级下添加env属性,
apiVersion: v1
kind: Pod
metadata:name: dapi-test-podnamespace: test
spec:containers:- name: test-containerimage: registry.k8s.io/busybox#可以使用 $(VAR_NAME) Kubernetes 替换语法在容器的 command 和 args 属性中使用 ConfigMap 定义的环境变量command: [ "/bin/echo", "$(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]env:# 定义环境变量- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:# ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值name: special-config# 指定与取值相关的键名key: special.how- name: LOG_LEVELvalueFrom:configMapKeyRef:name: env-configkey: log_levelrestartPolicy: Never
进入容器内部执行echo $SPECIAL_LEVEL_KEY命令

4.2 将 ConfigMap 中的所有键值对配置为容器环境变量
使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称。
apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: test
data:SPECIAL_LEVEL: verySPECIAL_TYPE: charm
---
apiVersion: v1
kind: Pod
metadata:name: dapi-test-podnamespace: test
spec:containers:- name: test-containerimage: nginxenvFrom:- configMapRef:name: special-configrestartPolicy: Never
4.3 将 ConfigMap 数据挂载到一个卷中
在 Pod 规约的 volumes 部分下添加 ConfigMap 名称。 这会将 ConfigMap 数据添加到 volumeMounts.mountPath 所指定的目录 (在本例中为 /etc/config)。 command 部分列出了名称与 ConfigMap 中的键匹配的目录文件。
apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: registry.k8s.io/busyboxcommand: [ "/bin/sh", "-c", "ls /etc/config/" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:# 提供包含要添加到容器中的文件的 ConfigMap 的名称name: special-configrestartPolicy: Never
还可以使用 path 字段为特定的 ConfigMap 项目指定预期的文件路径。 在这里,ConfigMap 中键 SPECIAL_LEVEL 的内容将挂载在 config-volume 卷中 /etc/config/keys 文件中:

当某个已被挂载的 ConfigMap 被更新,所投射的内容最终也会被更新。 对于 Pod 已经启动之后所引用的、可选的 ConfigMap 才出现的情形, 这一动态更新现象也是适用的。
kubelet 在每次周期性同步时都会检查已挂载的 ConfigMap 是否是最新的。 但是,它使用其本地的基于 TTL 的缓存来获取 ConfigMap 的当前值。 因此,从更新 ConfigMap 到将新键映射到 Pod 的总延迟可能等于 kubelet 同步周期 (默认 1 分钟) + ConfigMap 在 kubelet 中缓存的 TTL(默认 1 分钟)。
注意:使用 ConfigMap 作为subPath的数据卷将不会收到 ConfigMap 更新。
4.4 在Pod中使用Secret
Secret与ConfigMap用法相同
apiVersion: v1
kind: Pod
metadata:name: pod-secret
spec:containers:- name: pod-with-secretimage: nginxvolumeMounts:- name: my-secretmountPath: "/etc/secret"readOnly: truevolumes:- name: my-secretsecret:secretName: password
附录
game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
game-env-file.properties
enemies=aliens
lives=3
allowed="true"
ui-env-file.properties
color=purple
textmode=true
how=fairlyNice
相关文章:
玩转 Kubernetes 配置管理:ConfigMap 和 Secret 实战演示
目录一、简介二、ConfigMap2.1 基于目录创建 ConfigMap2.2 基于文件创建 ConfigMap2.3 从环境文件创建 ConfigMap2.4 定义从文件创建 ConfigMap 时要使用的键2.5 根据字符串创建 ConfigMap三、Secret3.1 基于文件创建Secret3.2 基于字符串创建Secret3.3 yaml文件方式创建secret…...
Kubernetes
一、 kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定义…...
从零开始 verilog 以太网交换机(三)MAC发送控制器的设计与实现
从零开始 verilog 以太网交换机(三)MAC发送控制器的设计与实现 🔈声明: 😃博主主页:王_嘻嘻的CSDN主页 🧨 从零开始 verilog 以太网交换机系列专栏:点击这里 🔑未经作者允…...
使用vector<char>作为输入缓冲区
一、引言 当我们编写代码:实现网络接收、读取文件内容等功能时,我们往往要在内存中开辟一个输入缓冲区(又名:input buffer/读缓冲区)来存贮接收到的数据。在C里面我们可以用如下方法开辟输入缓冲区。 ①使用C语言中的数组&#x…...
自己在网站搭建用到的一些网站
背景 以后可能很少做网站类的项目了,所以做个简单总结,把自己的一些经历和一些小工具做个记录 域名和主机 https://www.godaddy.com/zh-sg, 我之前的基本都是国际会议型的网站,所以就在gadaddy上买了主机和域名。目标群体在国内可以考虑腾…...
XLSReadWriteII5 Color 颜色l的调用和使用
XLSReadWriteII5 Color 颜色l的调用和使用 一、色彩三原色 自然界,颜色是由红、绿、蓝三色组成,人眼的可见的颜色,可以通过红、绿、蓝三色按照不同的比例合成产生。 任意一种颜色由这三种原色按照一定的比例混合出来。 二、Windows系…...
RT-Thread SP使用教程
RT-Thread SPI 使用教程 实验环境使用的是正点原子的潘多拉开发板。 SPI从机设备使用的是BMP280温湿度大气压传感器。 使用RT-Thread Studio搭建基础功能。 1. 创建工程 使用RT-Thread Studio IDE创建芯片级的工程。创建完成后,可以直接编译下载进行测试。 2.…...
LeetCode 2363. 合并相似的物品
给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质: items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。 items 中每件物品的价值都是 唯一的 。 请你…...
numpy 中常用的数据保存、fmt多个参数
在经常性读取大量的数值文件时(比如深度学习训练数据),可以考虑现将数据存储为Numpy格式,然后直接使用Numpy去读取,速度相比为转化前快很多 一、保存为二进制文件(.npy/.npz) (1)numpy.save(file, arr, allow_pickleTrue, fix_importsTrue) file:文件名…...
从0到1一步一步玩转openEuler--19 openEuler 管理服务-特性说明
文章目录19 管理服务-特性说明19.1 更快的启动速度19.2 提供按需启动能力19.3 采用cgroup特性跟踪和管理进程的生命周期19.4 启动挂载点和自动挂载的管理19.5 实现事务性依赖关系管理19.6 与SysV初始化脚本兼容19.7 能够对系统进行快照和恢复19 管理服务-特性说明 19.1 更快的…...
23美赛E题:光污染(ICM)完整思路Python代码
问题E(综合评价与仿真题):光污染(ICM) 背景 光污染用于描述过度或不良使用人造光。我们称之为光污染的一些现象包括光侵入、过度照明和光杂波。在大城市,太阳落山后,这些现象最容易在天空中看到;然而,它们也可能发生在更偏远的地区。 光污染会改变我们对夜空的看法,…...
快速排序的描述以及两种实现方案
一、快速排序描述 每一轮排序选择一个基准点(pivot)进行分区 1.1. 让小于基准点的元素的进入一个分区,大于基准点的元素的进入另一个分区 1.2. 当分区完成时,基准点元素的位置就是其最终位置在子分区内重复以上过程,直…...
算力引领 数“聚”韶关——第二届中国韶关大数据创新创业大赛圆满收官
为进一步促进数字经济领域创新创业发展,推动国家数据中心集群建设,构建大数据领域资源专业平台,促进大湾区大数据科技成果和创新创业人才转化落地,为韶关大数据领域创新型产业集群的打造、大数据科技成果和创新创业人才的转化落地…...
MySQL 记录锁+间隙锁可以防止删除操作而导致的幻读吗?
文章目录什么是幻读?实验验证加锁分析总结什么是幻读? 首先来看看 MySQL 文档是怎么定义幻读(Phantom Read)的: The so-called phantom problem occurs within a transaction when the same query produces different sets of r…...
【分库分表】企业级分库分表实战方案与详解(MySQL专栏启动)
📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…...
(考研湖科大教书匠计算机网络)第五章传输层-第五节:TCP拥塞控制
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:拥塞控制概述二:拥塞控制四大算法(1)慢开始和拥塞避免A:慢启动(slow start)…...
13.使用自动创建线程池的风险,要自己创建为好
自动创建线程池就是直接调用 Executors去new默认的那几个线程池,但是会出现一定的风险,线程池里面会用到队列,也会跟线程池自身有关,所以要从队列和线程池两个方面去解析。 1.了解线程池的队列 线程池的内部结构主要由四部分组成…...
【项目设计】—— 负载均衡式在线OJ平台
目录 一、项目的相关背景 二、所用技术栈和开发环境 三、项目的宏观结构 四、compile_server模块设计 1. 编译服务(compiler模块) 2. 运行服务(runner模块) 3. 编译并运行服务(compile_run模块) 4…...
Docker学习笔记
1:docker安装步骤Linux 2:docker安装步骤Windows 3:docker官方文档 4:docker官方远程仓库 docker常用命令 1: docker images----查看docker中安装的镜像 2: docker pull nginx------在docker中安装Nginx镜…...
【爬虫理论实战】详解常见头部反爬技巧与验证方式 | 有 Python 代码实现
以下是常见头部反爬技巧与验证方式的大纲: User-Agent 字段的伪装方式,Referer 字段的伪装方式,Cookie 字段的伪装方式。 文章目录1. ⛳️ 头部反爬技巧1.1. User-Agent 字段&User-Agent 的作用1.2. 常见 User-Agent 的特征1.3. User-Age…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
