学习笔记二十九:K8S配置管理中心Configmap实现微服务配置管理
Configmap概述
- Configmap概述
- Configmap能解决哪些问题?
- Configmap应用场景
- 局限性
- Configmap创建方法
- 命令行直接创建
- 通过文件创建
- 指定目录创建configmap
- 编写configmap资源清单YAML文件
- 使用Configmap
- 通过环境变量引入:使用configMapKeyRef
- 通过环境变量引入:使用envfrom
- 把configmap做成volume,挂载到pod
- Configmap热更新
Configmap概述
Configmap是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存。
Configmap能解决哪些问题?
我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。

- Configmap是k8s中的资源, 相当于配置文件,可以有一个或者多个Configmap;
- Configmap可以做成Volume,k8s pod启动之后,通过 volume 形式映射到容器内部指定目录上;
- 容器中应用程序按照原有方式读取容器特定目录上的配置文件。
- 在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。
Configmap应用场景
- 使用k8s部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,configmap可以将配置信息和docker镜像解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,可直接注入到Pod中给容器使用。configmap注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中。
- 使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用configmap可以友好的进行配置共享。
局限性
- ConfigMap在设计上不是用来保存大量数据的。在ConfigMap中保存的数据不可超过1 MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数据库或者文件服务。
Configmap创建方法
命令行直接创建
直接在命令行中指定configmap参数创建,通过–from-literal指定参数
kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
kubectl describe configmap tomcat-config
Name: tomcat-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
server_name:
----
myapp.tomcat.com
tomcat_port:
----
8080
Events: <none>
通过文件创建
通过指定文件创建一个configmap,–from-file=<文件>
vim nginx.conf
server {server_name www.nginx.com;listen 80;root /home/nginx/www/
}
#定义一个key是www,值是nginx.conf中的内容
kubectl create configmap www-nginx --from-file=www=./nginx.conf
kubectl describe configmap www-nginx
Name: www-nginx
Namespace: default
Labels: <none>
Annotations: <none>Data
====
www:
----
server {server_name www.nginx.com;listen 80;root /home/nginx/www/
}
指定目录创建configmap
mkdir test-a
cd test-a/
cat my-server.cnf
server-id=1
cat my-slave.cnf
server-id=2
指定目录创建configmap
kubectl create configmap mysql-config --from-file=/root/test-a/
查看configmap详细信息
kubectl describe configmap mysql-config
Name: mysql-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
my-server.cnf:
----
server-id=1
my-slave.cnf:
----
server-id=2
Events: <none>
编写configmap资源清单YAML文件
cat mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: mysqllabels:app: mysql
data:master.cnf: |[mysqld]log-binlog_bin_trust_function_creators=1lower_case_table_names=1slave.cnf: |[mysqld]super-read-onlylog_bin_trust_function_creators=1
使用Configmap
通过环境变量引入:使用configMapKeyRef
创建一个存储mysql配置的configmap
cat mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: mysqllabels:app: mysql
data:log: "1"lower: "1"
kubectl apply -f mysql-configmap.yaml
创建pod,引用Configmap中的内容
cat mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: mysql-pod
spec:containers:- name: mysqlimage: busyboxcommand: [ "/bin/sh", "-c", "sleep 3600" ]env:- name: log_bin #定义环境变量log_binvalueFrom: configMapKeyRef:name: mysql #指定configmap的名字key: log #指定configmap中的key- name: lower #定义环境变量lowervalueFrom:configMapKeyRef:name: mysqlkey: lowerrestartPolicy: Never
kubectl apply -f mysql-pod.yaml
kubectl exec -it mysql-pod -- /bin/sh
/ # printenv
log_bin=1
lower=1
通过环境变量引入:使用envfrom
cat mysql-pod-envfrom.yaml
apiVersion: v1
kind: Pod
metadata:name: mysql-pod-envfrom
spec:containers:- name: mysqlimage: busyboximagePullPolicy: IfNotPresentcommand: [ "/bin/sh", "-c", "sleep 3600" ]envFrom: - configMapRef:name: mysql #指定configmap的名字restartPolicy: Never
kubectl apply -f mysql-pod-envfrom.yaml
kubectl exec -it mysql-pod-envfrom -- /bin/sh
/ # printenv
lower=1
log=1
把configmap做成volume,挂载到pod
cat mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: mysqllabels:app: mysql
data:log: "1"lower: "1"my.cnf: |[mysqld]Welcome=haha
kubectl apply -f mysql-configmap.yaml
cat mysql-pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:name: mysql-pod-volume
spec:containers:- name: mysqlimage: busyboxcommand: [ "/bin/sh","-c","sleep 3600" ]volumeMounts:- name: mysql-configmountPath: /tmp/configvolumes:- name: mysql-configconfigMap:name: mysqlrestartPolicy: Never
kubectl apply -f mysql-pod-volume.yaml
kubectl exec -it mysql-pod-volume -- /bin/sh
/ # cd /tmp/config/
/tmp/config # ls
log lower my.cnf
Configmap热更新
kubectl edit configmap mysql
# 把logs: “1”变成log: “2”

kubectl exec -it mysql-pod-volume -- /bin/sh
/ # cat /tmp/config/log
2
发现log值变成了2,更新生效了
更新 ConfigMap 后:使用该 ConfigMap 挂载的 Env 不会同步更新
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
相关文章:
学习笔记二十九:K8S配置管理中心Configmap实现微服务配置管理
Configmap概述 Configmap概述Configmap能解决哪些问题?Configmap应用场景局限性 Configmap创建方法命令行直接创建通过文件创建指定目录创建configmap 编写configmap资源清单YAML文件使用Configmap通过环境变量引入:使用configMapKeyRef通过环境变量引入…...
AITO问界崛起的“临门一脚”,落在了赛力斯汽车的智慧工厂里
文 | 智能相对论 作者 | 沈浪 AITO问界新M7的销量爆了,口碑也紧接着“爆”了。 AITO问界新M7系列上市以来50天,累计大定突破8万辆。AITO问界M9预计今年12月上市,预订超过了1.5万辆。根据最新公布的产销数据,在过去的10月份&…...
影视企业有哪些方式将视频文件快速海外跨国传输国内?
影视行业是一个高度国际化的行业,影视企业在跨国合作、制作、发行等方面有着强烈的需求。然而,影视企业在跨国文件传输方面也面临着诸多的问题和难题。视频文件通常具有较大的文件大小、多样的文件格式、高要求的文件质量等特点,这些特点使得…...
Android原生分享与指定app分享
什么是 Android 系统的原生分享呢,如下图所示 创建一个 Intent ,指定其 Action 为 Intent.ACTION_SEND,这表示要创建一个发送指定内容的行动。 Intent sendIntent new Intent(); sendIntent.setAction(Intent.ACTION_SEND); 指定需要发送的…...
ActiveMQ是什么?-九五小庞
MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。特点:1、支持多种语言…...
<蓝桥杯软件赛>零基础备赛20周--第4周--杂题-1
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…...
Telnet/ssh/Serial远程工具WindTerm
Telnet/ssh/Serial远程工具WindTerm 一、WindTerm 概述二、WindTerm 下载 一、WindTerm 概述 在远程终端工具中,secureCrt 和 XShell 是两款比较有名的远程工具,但收费。上一篇文章就介绍了一款免费软件MobaXterm,但菜单都是英文的࿰…...
电脑技巧:台式机噪音非常大的几个原因以及解决办法
目录 一、CPU风扇灰尘太厚、风扇轴承老化 二、电源风扇有灰尘或者老化 三、显卡风扇有灰尘或者老化 四、硬盘老化导致的电脑主机声音大 五、台式机CPU风扇声音过大 今天小编给大家分享台式机噪音非常大的几个原因以及解决办法,值得收藏! 一、CPU风…...
C++名称空间
名称空间只是用来对名称进行管理的一种方式,首先要了解一下传统C名称空间。 1.声明区域:声明区域是指可以在其中声明的区域,例如可以在函数外部声明全局变量(区域为所在的文件),在函数块内声明局部变量(区域为所在的块),其声明区域…...
Centos7扩容
Centos7扩容 保证虚拟机关机且没有快照的情况下按照下图进行操作: 设置好后开机,查看分区情况: [rootlocalhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 12G 5.4G 69% / …...
react中ref的使用(useRef,forwardRef,useImperativeHandle,createRef)
文章目录 一、什么是ref二、在函数式组件中使用ref1. useRef 获取dom2. forwardRef获取子组件的dom3. useImperativeHandle将某些指定的行为暴露给父组件 三、在类组件中使用ref1. createRef2. 回调函数3. 字符串 一、什么是ref 在React中,ref是一个用于访问真实DO…...
正点原子嵌入式linux驱动开发——Linux USB驱动
USB是很常用的接口,目前大多数的设备都是USB接口的,比如鼠标、键盘、USB摄像 头等,在实际开发中也常常遇到USB接口的设备,本章就来学习一下如何使能Linux内核自带的USB驱动。这里不会具体学习USB的驱动开发。 USB接口简介 什么是…...
(四)docker:为mysql和java jar运行环境创建同一网络,容器互联
看了很多资料,说做互联的一个原因是容器内ip不固定,关掉重启后如果有别的容器启动,之前的ip会被占用,所以做互联创建一个网络,让几个容器处于同一个网络,就可以互联还不受关闭再启动ip会改变的影响…...
【kafka】记一次kafka基于linux的原生命令的使用
环境是linux,4台机器,版本3.6,kafka安装在node 1 2 3 上,zookeeper安装在node2 3 4上。 安装好kafka,进入bin目录,可以看到有很多sh文件,是我们执行命令的基础。 启动kafka,下面的…...
C语言或C++结构体及其变量的创建方式汇总
第一种: struct 结构体类型名{ 任意类型 变量; }; 结构体类型名 *结构体变量new 结构体类型名; #include<bits/stdc.h> using namespace std; struct LNode {int data;struct LNode *next; }; /*void PutElem(LNode *t){while(t->next!NULL){…...
mysql之基础语句
数据库的列类型 int:整型 用于定义整数类型的数据 float:单精度浮点4字节32位 准确表示到小数点后六位 double:双精度浮点8字节64位 char:固定长度的字符类 用于定义字符类型数据&…...
Sentinel 哨兵数据 更新下载地址 2023年11月
1. 欧空局官方下载 2023年11月开始,原来欧空局的下载地址和应用有了变化,现在迁移到以下新地址下载: https://dataspace.copernicus.eu/ 我这边测试需要重新注册用户才能进行登录和使用,界面使用和之前差不多,具体操作…...
动态路由协议OSPF项目部署(二)
1. 静态和动态路由的区别; 2. OSPF协议通信过程与部署; 3. OSPF协议在项目上的应用场景 - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由器转发数据 - 路由器需要一张地图 - 路由表 - 路由表如何构建的? - 依靠手动 或…...
winscp文件增量同步到linux服务器
一,点击同步 场景:在做服务器迁移的时候,文件好几十个G一天也迁移不完,每天还有增量的文件,先全量同步一次,然后再用增量同步,然后你用winscp的同步工具,进增量同步。 将本地文件同…...
足足68个!Python函数合集请收好!
内置函数就是python给你提供的, 拿来直接用的函数,比如print.,input等。 #68个内置函数 # abs() dict() help() min() setattr() # all() dir() hex() next() sli…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 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…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
