K8S学习之基础二十八:k8s中的configMap

ops/2025/3/15 5:26:33/

k8s中的configMap

​ configMap是k8s的资源对象,简称cm,用于保存非机密性的配置,数据可以用key/value键值对形式保存,也可以通过文件形式保存

​ 在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。

​ 在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。

1、Configmap是k8s中的资源, 相当于配置文件,可以有一个或者多个Configmap;
2、Configmap可以做成Volume,k8s pod启动之后,通过 volume 形式映射到容器内部指定目录上;
3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。
4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

局限性:ConfigMap不能保存大量数据,超过1M,就需要考虑挂载存储卷或其他方式了

configmap创建方法:

1、命令行创建:

kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
[root@mast01 cm]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      21d
tomcat-config      2      4s
[root@mast01 cm]# kubectl describe cm tomcat-config
Name:         tomcat-config
Namespace:    default
Labels:       <none>
Annotations:  <none>Data
====
server_name:
----
myapp.tomcat.comtomcat_port:
----
8080BinaryData
====Events:  <none>

2、通过文件创建:

vim nginx.conf
server {server_name www.nginx.com;listen 80;root /home/nginx/www/
}
kubectl create configmap www-nginx --from-file=www=./nginx.conf
[root@mast01 cm]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      21d
tomcat-config      2      3m19s
www-nginx          1      20s
[root@mast01 cm]# kubectl describe cm 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/
}BinaryData
====Events:  <none>

3、指定目录创建

[root@mast01 cm]# mkdir -p mysql-cnf
[root@mast01 cm]# echo 'server-id=1' mysql-cnf/master.cnf
server-id=1 mysql-cnf/master.cnf
[root@mast01 cm]# echo 'server-id=2' mysql-cnf/slave.cnf
server-id=2 mysql-cnf/slave.cnf
[root@mast01 cm]# kubectl create cm mysql-cnf --from-file=./mysql-cnf/
configmap/mysql-cnf created
[root@mast01 cm]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      21d
mysql-cnf          2      8s
tomcat-config      2      13m
www-nginx          1      7m37s
[root@mast01 cm]# kubectl describe cm mysql-cnf
Name:         mysql-cnf
Namespace:    default
Labels:       <none>
Annotations:  <none>Data
====
server.conf:
----
server-id=1slave.conf:
----
server-id=2BinaryData
====Events:  <none>

4、通过yaml文件创建

vi config.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: app-confignamespace: default  # 可选,默认为default
data:    # 多行内容用|保留换行符,或使用>折叠换行(根据需求选择)# 简单键值对log-level: INFO# 多行配置文件内容config.properties: |server.port=8080environment=productiondebug.enabled=false# JSON配置文件示例app-settings.json: |{"featureFlag": true,"maxConnections": 100}
[root@mast01 cm]# kubectl get cm
NAME               DATA   AGE
app-config         3      4s
kube-root-ca.crt   1      21d
[root@mast01 cm]# kubectl describe cm app-config
Name:         app-config
Namespace:    default
Labels:       <none>
Annotations:  <none>Data
====
app-settings.json:
----
{"featureFlag": true,"maxConnections": 100
}config.properties:
----
server.port=8080
environment=production
debug.enabled=falselog-level:
----
INFOBinaryData
====Events:  <none>

ConfigMap使用

1、使用configMapKeyRef通过环境变量注入

vi pod-cm.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-cm
spec:containers:- name: busyboximage: 172.16.80.140/busybox/busybox:latestcommand: [ "/bin/sh", "-c", "sleep 3600" ]env:- name: server.port        #定义环境变量server.portvalueFrom: configMapKeyRef:name: app-config     #指定configmap的名字key: server.port     #指定configmap中的key- name: lower              #定义环境变量lowervalueFrom:configMapKeyRef:name: app-configkey: log-levelrestartPolicy: Never[root@mast01 cm]# kubectl get pods -owide
NAME                               READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
nfs-provisioner-7559c6b4fc-nbmb6   1/1     Running   0          5m33s   10.244.140.65   node02   <none>           <none>
pod-cm                             1/1     Running   0          6s      10.244.140.66   node02   <none>           <none>
[root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
/ # env
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=pod-cm
SHLVL=1
HOME=/root
TERM=xterm
lower=INFO          # 来源 cm app-config 的 log-level
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
server.port=server.port=8080    # 来源 cm app-config 的 config.properties
environment=production
debug.enabled=false

2、使用envfrom通过环境变量注入

vi pod-cm-envfrom.yaml
kind: Pod
metadata:name: pod-cm
spec:containers:- name: busyboximage: 172.16.80.140/busybox/busybox:latestcommand: [ "/bin/sh", "-c", "sleep 3600" ]envFrom:- configMapRef:name: app-config     #指定configmap的名字restartPolicy: Neverkubectl get pods -owide
NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nfs-provisioner-7559c6b4fc-nbmb6   1/1     Running   0          20m   10.244.140.65   node02   <none>           <none>
pod-cm                             1/1     Running   0          69s   10.244.140.67   node02   <none>           <none>
[root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
/ # env
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod-cm
SHLVL=1
HOME=/root
config.properties=server.port=8080
environment=production
debug.enabled=falseapp-settings.json={"featureFlag": true,"maxConnections": 100
}log-level=INFO
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/

3、把configMap做成volume,挂载到pod里

vi pod-cm-volume.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-cm
spec:containers:- name: busyboximage: 172.16.80.140/busybox/busybox:latestcommand: [ "/bin/sh", "-c", "sleep 3600" ]volumeMounts:- name: app-configmountPath: /tmp/configvolumes:- name: app-configconfigMap:name: app-configrestartPolicy: Never[root@mast01 cm]# kubectl get pods -owide
NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nfs-provisioner-7559c6b4fc-nbmb6   1/1     Running   0          31m   10.244.140.65   node02   <none>           <none>
pod-cm                             1/1     Running   0          4s    10.244.140.69   node02   <none>           <none>
[root@mast01 cm]# kubectl get pods -owide
NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nfs-provisioner-7559c6b4fc-nbmb6   1/1     Running   0          31m   10.244.140.65   node02   <none>           <none>
pod-cm                             1/1     Running   0          8s    10.244.140.69   node02   <none>           <none>
[root@mast01 cm]# kubectl exec -it pod-cm -- /bin/sh
/ # cd /tmp/config
/tmp/config # ls
app-settings.json  config.properties  log-level
/tmp/config # cat app-settings.json
{"featureFlag": true,"maxConnections": 100
}
/tmp/config # cat config.properties
server.port=8080
environment=production
debug.enabled=false
/tmp/config # cat log-level

4、configMap热更新

​ 通过kubectl edit cm cm 可以直接更新cm,保存后cm立即生效
​ env方式的不会更新
​ volume方式的大约10s后会更新


http://www.ppmy.cn/ops/165863.html

相关文章

python多线程和多进程——使用 concurrent.futures.ProcessPoolExecutor 和 ThreadPoolExecutor

在使用 concurrent.futures.ProcessPoolExecutor 和 ThreadPoolExecutor 时&#xff0c;如果你不指定 max_workers 参数&#xff0c;Python 会根据系统资源和任务类型自动选择一个合理的默认值。以下是关于这两个执行器的默认行为的详细说明&#xff1a; ProcessPoolExecutor …

深度学习篇---Opencv中的Haar级联分类器

文章目录 1.Haar 级联分类器配置文件的结构2.OpenCV 自带的 Haar 级联分类器配置文件2.1人脸检测2.1.1haarcascade_frontalface_default.xml2.1.2haarcascade_frontalface_alt.xml2.1.3haarcascade_frontalface_alt2.xml2.1.4haarcascade_frontalface_alt_tree.xml 2.2眼睛检测…

【Deepseek基础篇】--v3基本架构

目录 MOE参数 1.基本架构 1.1. Multi-Head Latent Attention多头潜在注意力 1.2.无辅助损失负载均衡的 DeepSeekMoE 2.多标记预测 2.1. MTP 模块 论文地址&#xff1a;https://arxiv.org/pdf/2412.19437 DeepSeek-V3 是一款采用 Mixture-of-Experts&#xff08;MoE&…

【数据结构】-哈夫曼树以及其应用

哈夫曼树&#xff08;Huffman Tree&#xff09; 1. 哈夫曼树的定义 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种 带权路径长度最短的二叉树&#xff0c;常用于数据压缩和最优前缀编码。其目标是使得 带权路径长度&#xff08;WPL&#xff09;最小。 在信息论和计算…

Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装

Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装 目录 Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装 一、简单介绍 1. shared_preferences 2. sqflite 3. file 二、shared_preferences 开发注…

matlab慕课学习3.2+3.3

于20250310 3.2用if语句实现选择结构 3.2.1什么是选择结构 用if 语句和switch语句可实现选择结构 3.2.2单分支if语句 if 条件语句组 %可以是一条也可是多条end 当条件为标量&#xff0c;非0表成立&#xff0c;0表示不成立。 当条件为矩阵时&#xff0c;矩阵非空&#xff…

从Spring容器中获取bean

从Spring容器中获取bean Spring自带了多种类型的应用上下文。下面罗列的几个最常用的&#xff1a; AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。AnnotationConfigWebApplicationContext&#xff1a;从一个或多个基于Java的配置类…

驾培市场与低空经济无人机融合技术详解

随着科技的飞速发展和社会的不断进步&#xff0c;驾培市场正面临着前所未有的变革。传统汽车驾驶培训已不再是唯一的选择&#xff0c;无人机驾驶等新兴领域正逐渐成为驾培市场的重要组成部分。本报告旨在探讨驾培市场与低空经济的融合发展&#xff0c;特别是应用型人才培养与驾…