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

news/2025/3/15 11:41:36/

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/news/1579301.html

相关文章

ELK(Elasticsearch、Logstash、Kbana)安装及Spring应用

Elasticsearch安装及Spring应用 一、引言二、基本概念1.索引&#xff08;Index&#xff09;2.类型&#xff08;Type&#xff09;3.文档&#xff08;Document&#xff09;4.分片&#xff08;Shard&#xff09;5.副本&#xff08;Replica&#xff09; 二、ELK搭建1.创建挂载的文件…

JVM崩溃时产生的文件 hs_err.pid.log

hs_err.pid.log hs_err.pid.log&#xff1a;当jvm崩溃时&#xff0c;会生成一个hs_err_pid.log文件&#xff0c;并且把它存放到程序目录下&#xff0c;可以通过该文件来定位导致jvm崩溃的原因。 jvm崩溃&#xff0c;是由jvm自身的bug或者本地方法执行错误引起的&#xff0c;本…

clickhouse清除system 表数据释放磁盘空间

注&#xff1a;clickhouse 默认系统有以下几个 log 表,如下 system.asynchronous_metric_log system.metric_log system.part_log system.query_log system.query_thread_log system.session_log system.trace_log 如果不想看原文直接执行以下语句即可。 ALTER table syst…

Centos7阿里云yum源

#Step1:下载repository 没有wget命令 就用curl wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #Step2:安装epel基础组件源 没有wget命…

微店商品详情页的常见结构及爬虫解析方法

微店作为知名的电商平台&#xff0c;其商品详情页的结构设计通常会围绕用户体验和商品展示效果展开。以下是一些常见的微店商品详情页结构特点及其对应的爬虫解析方法&#xff1a; 一、常见结构 &#xff08;一&#xff09;页面头部 LOGO和店招&#xff1a;通常位于页面顶部&…

面向对象Demo02

方法的调用的回顾 package oop; ​ public class Demo02 {//静态public static void main(String[] args) {//student student new student();student.speak();//非静态 //student student new student();} } package oop; ​ public class student {public static void sp…

双向广搜

从两侧同时展开,那测数据少就从哪侧展,两者展开结果出现一样的,返回答案 127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {unordered_set<stri…

Compose 实践与探索八 —— LayoutModifier 解析

前面几节讲的 Modifier 都是起辅助作用的&#xff0c;比如 Modifier 的伴生对象、CombinedModifier、 ComposedModifier 以及几乎所有 Modifier 的父接口 Modifier.Element。本篇我们开始讲具有直接功效的 Modifier&#xff0c;分为几个大类&#xff1a;LayoutModifier、DrawMo…