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直播的混合切换。多现场仅…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
