玩转 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…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
