Kubernetes系列-配置存储 ConfigMap Secret
1 ConfigMap介绍
1.1 概述
在部署应用程序时,我们都会涉及到应用的配置,在容器中,如Docker容器中,如果将配置文件打入容器镜像,这种行为等同于写死配置,每次修改完配置,镜像就得重新构建。当然,我们也可以通过挂载包含该文件的卷进行配置管理和修改。而在k8s中,我们要讲一种更好的方式,即ConfigMap,这种资源对象的出现,更是极大的方便了应用程序的配置管理。
ConfigMap是一个或多个key/value的形式保存在k8s中,内部可以管理变量也可以管理完整的配置文件内容。
1.2 用法
- 生成容器内的环境变量,在pod中可以通过spec.env或者spec.envFrom进行引用。
- 设置容器启动命令的启动参数,前提是设置为环境变量。
- 以卷volume的方式挂载到容器内部的文件或目录,通过spec.volumes引用。
注:在使用命令的时候注意单词: configmap等价于cm,cm算是简写,类似于deployment可以使用命令时写成deploy,service可以写成svc,namespace可以写成ns,pod可以写成po。
1.3 应用场景
configmap配置信息和镜像解耦,实现方式是把配置信息放到configmap对象中,然后在pod中作为volume挂载到pod中,从而实现导入配置的目的
适用场景:
- 通过configmap给pod定义全局环境变量
- 通过configmap给pod传递命令行参数,如mysql -u -p中的账户名密码都可以通过它传递
- 通过configmap给pod中的容器服务提供配置文件,配置文件以挂载到容器的形式适用
注意事项:
- configmap需要在pod使用它之前创建
- pod和configmap必须在同一个namespace中才能使用
- 主要用于非安全加密的配置场景
- configmap通常用于小于1MB的配置,常用于配置文件
1.4 创建
1.4.1 yaml文件方式创建
示例:
apiVersion: v1
kind: ConfigMap
metadata:name: cm-test01
data:appconf01: value01appconf02: value02
命令:
[root@k8s-master k8s]# kubectl create -f cm-test01.yaml
configmap/cm-test01 created
1.4.2 命令行方式创建
读取文件方式(也可以是目录)通过--from-file参数从文件中读取。可以指定key的名称,若不指定,则默认使用文件名为key。
案例:如当前目录有一个配置文件为test.properties
[root@k8s-master k8s]# cat test.properties
key01:value01
key02:value02
conf01: value03
命令:
[root@k8s-master k8s]# kubectl create cm cm-test-file --from-file=test.properties
configmap/cm-test-file created
//指定参数方式,通过--from-literal指定keyxx=valuexx创建confimap中的data内配置属性。
[root@k8s-master k8s]# kubectl create configmap cm-test-literal --from-literal=key01=value01 --from-literal=key02=value02
configmap/cm-test-literal created
1.5 查询
1.5.1 查询configmap列表
[root@k8s-master k8s]# kubectl get cm
NAME DATA AGE
cm-test-file 1 3m51s
cm-test-literal 2 3m30s
cm-test01 2 9m2s
kube-root-ca.crt 1 4d16h
1.5.2 查看configmap详细信息
[root@k8s-master k8s]# kubectl describe cm cm-test01
Name: cm-test01
Namespace: default
Labels: <none>
Annotations: <none>Data
====
appconf01:
----
value01
appconf02:
----
value02
Events: <none>
[root@k8s-master k8s]# kubectl describe cm cm-test-file
Name: cm-test-file
Namespace: default
Labels: <none>
Annotations: <none>Data
====
test.properties:
----
key01:value01
key02:value02
conf01: value03Events: <none>
[root@k8s-master k8s]# kubectl describe cm cm-test-literal
Name: cm-test-literal
Namespace: default
Labels: <none>
Annotations: <none>Data
====
key01:
----
value01
key02:
----
value02
Events: <none>
1.5.3 查看yaml输出
[root@k8s-master k8s]# kubectl get cm cm-test01 -o yaml
apiVersion: v1
data:appconf01: value01appconf02: value02
kind: ConfigMap
metadata:creationTimestamp: "2022-08-07T00:18:47Z"name: cm-test01namespace: defaultresourceVersion: "44876"uid: 7492a928-b163-4b86-a3dd-54a7fbe59a10
[root@k8s-master k8s]# kubectl get configmap cm-test-file -o yaml
apiVersion: v1
data:test.properties: |+key01:value01key02:value02conf01: value03kind: ConfigMap
metadata:creationTimestamp: "2022-08-07T00:23:58Z"name: cm-test-filenamespace: defaultresourceVersion: "45341"uid: 818a39b4-cbaf-4643-9541-1119b4d61982
[root@k8s-master k8s]# kubectl get cm cm-test-literal -o yaml
apiVersion: v1
data:key01: value01key02: value02
kind: ConfigMap
metadata:creationTimestamp: "2022-08-07T00:24:19Z"name: cm-test-literalnamespace: defaultresourceVersion: "45372"uid: 051849e0-bf0a-4926-a549-2405dc4963cc
1.6 更新
1.6.1 edit
[root@k8s-master k8s]# kubectl edit cm cm-test01
configmap/cm-test01 edited
通过kubectl describe cm cm-test01
查看更新是否生效。
[root@k8s-master k8s]# kubectl describe cm cm-test01
Name: cm-test01
Namespace: default
Labels: <none>
Annotations: <none>Data
====
appconf02:
----
value02
appconf01:
----
value001
Events: <none>
1.6.2 apply
直接更新yaml文件里的值,通过 kubectl apply -f configmap-test01.yaml重新发布一遍进行更新。
1.7 删除
1.7.1 通过yaml文件方式删除
$ kubectl delete -f configmap-test01.yaml
1.7.2 直接删除资源
kubectl delet cm cm-test01
2 ConfigMap和Pod的使用
容器应用对ConfigMap的使用主要是两种:
1)通过环境变量获取ConfigMap的内容:spec.env
和spec.envFrom
2)通过卷volume挂载的方式将ConfigMap的内容挂载到容器内部的文件或目录:spec.volumes。
2.1 环境变量方式
2.1.1 sepc.env方式
2.1.1.1 创建pod
[root@k8s-master k8s]# vim pod-test01.yamlapiVersion: v1
kind: Pod
metadata:name: cm-pod-test001
spec:containers:- name: cm-testimage: tomcat:8command: [ "/bin/sh", "-c", "env | grep APP"]env:- name: APPCONF01 # 定义环境变量的名称valueFrom: # key “appconf01”的值获取configMapKeyRef:name: cm-test01 # 环境变量的值来自于configmap cm-test01key: appconf01 # configmap中的配置key为appconf01- name: APPCONF02 # 定义环境变量的名称valueFrom: # key “appconf02”的值获取configMapKeyRef:name: cm-test01 # 环境变量的值来自于configmap cm-test01key: appconf02 # configmap中的配置key为appconf02restartPolicy: Never # 重启策略:从不。
执行创建pod:
[root@k8s-master k8s]# kubectl create -f pod-test01.yaml
pod/cm-test001 created
2.1.1.2 查看pod
[root@k8s-master k8s]# kubectl get pods
[root@k8s /cm/test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
cm-pod-test001 0/1 Completed 0 1h
2.1.1.3 查看pod日志
[root@k8s-master k8s]# kubectl logs cm-pod-test001
APPCONF01=value01
APPCONF02=value02
说明容器内部的环境变量使用ConfigMap中进行读取的
2.1.2 spec.envFrom方式
2.1.2.1 创建pod
[root@k8s-master k8s]# vim pod-test02.yamlpiVersion: v1
kind: Pod
metadata:name: cm-pod-test002
spec:containers:- name: cm-test2image: tomcat:8command: [ "/bin/sh", "-c", "env"]envFrom:- configMapRef:name: cm-test01 # 根据ConfigMap cm-test01资源自动生成环境变量restartPolicy: Never
执行创建pod:
[root@k8s-master k8s]# kubectl create -f pod-test02.yaml
2.1.2.2 查看pod
[root@k8s-master k8s]# kubectl get po
NAME READY STATUS RESTARTS AGE
cm-pod-test001 0/1 Completed 0 2h
cm-pod-test002 0/1 Completed 0 1h
注意:
环境变量的名称受限制:[a-zA-Z][a-zA-Z0-9_]*,不能以数字或非法字符开头。
2.2 卷挂载方式
2.2.1 指定items
[root@k8s-master k8s]# vim pod-test03.yaml
apiVersion: v1
kind: Pod
metadata:name: cm-pod-test003
spec:containers:- name: cm-test3image: tomcat:8volumeMounts:- name: vm-01-1mountPath: /confvolumes:- name: vm-01-1configMap:name: cm-test-fileitems:- key: key-testpropertiespath: test.propertiesrestartPolicy: Never
2.2.2 不指定items
[root@k8s-master k8s]# vim pod-test04.yaml
apiVersion: v1
kind: Pod
metadata:name: cm-pod-test004
spec:containers:- name: cm-test4image: tomcat:8volumeMounts:- name: vm-02-2mountPath: /confvolumes:- name: vm-02-2configMap:name: cm-test-filerestartPolicy: Never
进入容器中查看
[root@k8s-master k8s]# kubectl exec -it cm-pod-test004 -c cm-test4 -- bash
进入容器后,ls /conf查看是否有test.properties文件。
[root@k8s-master k8s]# kubectl exec -it cm-pod-test004 -c cm-test4 -- bash
root@cm-pod-test004:/usr/local/tomcat# ls /conf
test.properties
2.3 补充
关于--from-file的方式的创建指定key和不指定key的区别
1)不指定key名
创建:
[root@k8s-master k8s]# kubectl create cm cm-test-file --from-file=test.properties
输出:
[root@k8s-master k8s]# kubectl get cm cm-test-file -o yaml
2)指定key
创建:
[root@k8s-master k8s]# kubectl create cm cm-test-file02 --from-file=tp=test.properties
输出:
[root@k8s-master k8s]# kubectl get cm cm-test-file -o yaml
若指定key的名称,configmap中将会使用指定名称;若不指定,则默认使用文件名为key。
相关文章:

Kubernetes系列-配置存储 ConfigMap Secret
1 ConfigMap介绍 1.1 概述 在部署应用程序时,我们都会涉及到应用的配置,在容器中,如Docker容器中,如果将配置文件打入容器镜像,这种行为等同于写死配置,每次修改完配置,镜像就得重新构建。当然…...

bacnet ddc控制器如何通过485口转发Modbus协议控制modbus执行设备
要将BACnet DDC控制器通过485口转发Modbus协议控制Modbus执行设备,可以按照以下步骤进行: 确定Modbus执行设备的通信参数:包括串口波特率、数据位、停止位和校验位等参数。确保BACnet DDC控制器的485口通信设置与Modbus执行设备一致。 在BAC…...

构建易于运维的 AI 训练平台:存储选型与最佳实践
伴随着公司业务的发展,数据量持续增长,存储平台面临新的挑战:大图片的高吞吐、超分辨率场景下数千万小文件的 IOPS 问题、运维复杂等问题。除了这些技术难题,我们基础团队的人员也比较紧张,负责存储层运维的仅有 1 名同…...

前期自学Java的基础部分总结(二)
一. 抽象类 1.1 抽象类的概述 在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须被定义为抽象类 1.2 抽象类的特点 抽象类和抽象方法必须使用abstract关键字修饰 publice abstract class 类名{};public…...

Altova MissionKit 2023Crack
Altova MissionKit 2023Crack MissionKit是一套面向信息架构师和应用程序开发人员的企业级XML、JSON、SQL和UML工具的软件开发套件。MissionKit包括Altova XMLSpy、MapForce、StyleVision和其他市场领先的产品,用于构建当今的真实世界软件解决方案。 使用MissionKit…...

Linux CentOS上快速安装Docker并运行服务
在 CentOS 上快速安装 Docker,可以按照以下步骤进行: 1. 更新系统: sudo yum update 2. 安装 Docker: sudo yum install docker 3. 启动 Docker 服务: sudo systemctl start docker 4. 设置 Docker 开机自启动&…...

TCP三次握手与四次断开
TCP三次握手机制 三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。 1、客户端发送建立TCP连接的请求报文,其…...

关于前端与APP录音相关的笔记
文章目录 一、前言二、内容组成1、权限获取2、针对设备兼容3、内容类型转换4、传输存储 三、拓展内容自动播放部分 一、前言 主要针对前端适配录音能力的简要记录,针对默认的wav及其可能需要转换到特定的mp3之类格式以适配需求的问题。(这类通常是兼容tt…...

【Java】SpringBoot项目整合FreeMarker加快页面访问速度
文章目录 什么是FreeMarker?它的优点有那些?使用方式 什么是FreeMarker? Freemarker是一个模板引擎技术,它可以将数据和模板结合起来生成最终的输出。它是一种用于生成文本输出(如HTML、XML、JSON等)的通用…...

conda环境下安装opencv-python包
conda环境下安装opencv-python包 一、#查看环境 conda info --env# conda environments: # base D:\ProgramData\Anaconda3二、激活base环境 进入conda环境 conda init cmd.exe conda activate base三、根据版本号,下载对应的 python-opencv…...

JVM面试题--类加载器
什么是类加载器,类加载器有哪些 类加载子系统,当java源代码编译为class文件之后,由他将字节码装载到运行时数据区 BootStrap ClassLoader 启动类加载器或者叫做引导类加载器,是用c实现的,嵌套在jvm内部,…...

js怎么计算当前一周的日期
你可以使用 JavaScript 的 Date 对象来计算当前一周的日期。首先,你需要获取当前日期,然后使用 Date 对象的 getDay 方法获取当前是星期几(星期日是 0,星期一是 1,以此类推)。然后,你可以根据当前是星期几来计算出本周…...

【图论】差分约束
一.情景导入 x1-x0<9 ; x2-x0<14 ; x3-x0<15 ; x2-x1<10 ; x3-x2<9; 求x3-x0的最大值; 二.数学解法 联立式子2和5,可得x3-x0<23;但式子3可得x3-x0<15。所以最大值为15; 三.图论 但式子多了我们就不好解了࿰…...

13 springboot项目——准备数据和dao类
13.1 静态资源下载 https://download.csdn.net/download/no996yes885/88151513 13.2 静态资源位置 css样式文件放在static的css目录下;static的img下放图片;template目录下放其余的html文件。 13.3 创建两个实体类 导入依赖:lombok <!…...

Java 基础进阶总结(一)反射机制学习总结
文章目录 一、初识反射机制1.1 反射机制概述1.2 反射机制概念1.3 Java反射机制提供的功能1.4 反射机制的优点和缺点 二、反射机制相关的 API 一、初识反射机制 1.1 反射机制概述 JAVA 语言是一门静态语言,对象的各种信息在程序运行时便已经确认下来了,内…...

ERROR: transport error 202: gethostbyname: unknown host报错解决方案
Java 9 syntax for remote debugger: -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005Java 8 不适用 *:port,应该使用: -agentlib:jdwptransportdt_socket,servery,suspendn,address5005参考 https://stackoverflow.com/questions/50344957/ja…...

PyTorch高级教程:自定义模型、数据加载及设备间数据移动
在深入理解了PyTorch的核心组件之后,我们将进一步学习一些高级主题,包括如何自定义模型、加载自定义数据集,以及如何在设备(例如CPU和GPU)之间移动数据。 一、自定义模型 虽然PyTorch提供了许多预构建的模型层&#…...

JavaEE——SpringMVC中的常用注解
目录 1、RestController (1)、Controller (2)、ResponseBody 2、RequestMappping (1)、定义 (2)、使用 【1】、修饰方法 【2】、修饰类 【3】、指定方法类型 【4】、简化版…...

【严重】Metabase 基于H2引擎的远程代码执行漏洞
漏洞描述 Metabase 是一个开源的数据分析和可视化工具。 由于 CVE-2023-38646 的补丁(从H2 JDBC连接字符串中删除INIT脚本以防止命令注入)修复不完全,Metabase 仍受到命令注入的影响。攻击者可使用 H2 作为数据库引擎,通过 /api/setup/validate 端点发…...

0基础学习VR全景平台篇 第75篇:多现场
多现场是指将多台设备的直播画面整合到一个直播活动链接里面,让用户自行选择切换要看哪个直播画面的功能。既可以是同一个活动的不同角度直播,也可以是异地的直播。多现场不需要导播台,并且可以同时支持平面直播和VR直播的混合切换。多现场仅…...

html:去除input/textarea标签的拼写检查
默认情况下,textarea 会启动拼写和语法检查,表现效果就是单词拼写错误会出现红色下划线提示 <textarea></textarea>效果 有时,我们并不需要拼写检查,可以通过配置属性spellcheck"false" 去除拼写和语法检…...

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:创建自定义提示模板和含有Few-Shot示例的提示模板]
分类目录:《自然语言处理从入门到应用》总目录 创建自定义提示模板 假设我们希望LLM根据函数名称生成该函数的英文语言解释。为了实现这个任务,我们将创建一个自定义的提示模板,以函数名称作为输入,并格式化提示模板以提供函数的…...

d3dx9_30.dll如何修复,分享几种一键修复方法
d3dx9_30.dll是DirectX 的一个动态链接库文件,它包含了一些用于图形和游戏的函数和资源。在了解d3dx9_30.dll的解决方法和丢失原因之前,我们先来了解一下DirectX。DirectX是一套由微软开发的多媒体和游戏编程接口(API)集合。它提供…...

6.8 稀疏数组
6.8 稀疏数组 稀疏数组是一种数据结构,在程序中数据结构的思想,是非常重要的。例如 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义…...

ROS版本的ORB-SLAM3用RealSense D455相机实时运行测试
配置环境 1. C11 检查G版本,查看是否支持C11 一般g版本大于4.7即可 g -v 2. Pangolon 地址:https://github.com/stevenlovegrove/Pangolin 先安装OpenGL,Glew ### 编译orb-slam3发现pangolin编译错误排查的环境问题 sudo apt install p…...

Vue中对对象内容调用的Demo
目录 1.对象作为数据: 2.对象数组 在Vue中,你可以通过对象的键来调用对象中的各个部分的内容。下面是一些使用Vue调用对象各部分内容的示例: 1.对象作为数据: 如果你在Vue实例的数据中有一个对象,你可以使用点语法来…...

语音识别 — 特征提取 MFCC 和 PLP
一、说明 语音识别是一种技术,通过计算机和软件系统,将人们的口头语言转换为计算机可读的文本或命令。它使用语音信号处理算法来识别和理解人类语言,并将其转换为计算机可处理的格式。语音识别技术被广泛应用于许多领域,如语音助手…...

BES 平台 SDK之按键的配置
本文章是基于BES2700 芯片,其他BESxxx 芯片可做参考,如有不当之处,欢迎评论区留言指出。仅供参考学习用! BES 平台 SDK之LED的配置_谢文浩的博客-CSDN博客 关于系统LED简介可参考上一篇文章。链接如上所示! 一&…...

【Golang系统开发】搜索引擎(1) 如何快速判断网页是否已经被爬取
文章目录 1. 写在前面2. 数组存储3. 位图存储3.1 位图简介3.2 链表法3.3 开放寻址法 1. 写在前面 在实际工作中,我们经常需要判断一个对象是否存在,比如判断用户注册登陆时候,需要判断用户是否存在,再比如搜索引擎中的爬虫&#x…...

记录--一个好用的轮子 turn.js 实现仿真翻书的效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 国际惯例,官网链接 官网传送门 Github地址 github上有几个demos例子,介绍了基础用法。 我参考官网的例子,写了一个demo示例 安装 turn.js 依赖 jquery 库࿰…...