当前位置: 首页 > article >正文

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

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.com

tomcat_port:
----
8080


BinaryData
====

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=1


slave.conf:
----
server-id=2



BinaryData
====

Events:  <none>

4、通过yaml文件创建

vi config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: default  # 可选,默认为default
data:    # 多行内容用|保留换行符,或使用>折叠换行(根据需求选择)
  # 简单键值对
  log-level: INFO

  # 多行配置文件内容
  config.properties: |
    server.port=8080
    environment=production
    debug.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=false


log-level:
----
INFO


BinaryData
====

Events:  <none>

ConfigMap使用

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

vi pod-cm.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm
spec:
  containers:
  - name: busybox
    image: 172.16.80.140/busybox/busybox:latest
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    env:
    - name: server.port        #定义环境变量server.port
      valueFrom: 
        configMapKeyRef:
          name: app-config     #指定configmap的名字
          key: server.port     #指定configmap中的key
    - name: lower              #定义环境变量lower
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: log-level
  restartPolicy: 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: busybox
    image: 172.16.80.140/busybox/busybox:latest
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    envFrom:
    - configMapRef:
        name: app-config     #指定configmap的名字
  restartPolicy: Never

kubectl 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=false

app-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: busybox
    image: 172.16.80.140/busybox/busybox:latest
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    volumeMounts:
    - name: app-config
      mountPath: /tmp/config
  volumes:
  - name: app-config
    configMap:
      name: app-config
  restartPolicy: 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.kler.cn/a/584246.html

相关文章:

  • Java 大视界 -- Java 大数据在智慧文旅虚拟导游与个性化推荐中的应用(130)
  • 软考数据结构四重奏:软件工程师的线性、树、图、矩阵算法精要
  • 本地部署DeepSeek-R1模型详细流程
  • 【数据结构】2算法及分析
  • Oracle 查询数据库对象的DDL语句
  • HarmonyOS Next 全栈开发深度解析:从架构设计到分布式应用实战
  • 面试之《什么是流式渲染》
  • 微店平台商品关键字搜索接口调用指南:Python代码实现与实战解析
  • Qemu 详解与 ARM 虚拟机搭建指南
  • Vue3计算属性深度解析:经典场景与Vue2对比
  • Python 进程与线程-分布式进程
  • 工作记录 2017-01-09
  • React Next项目中导入Echart世界航线图 并配置中文
  • Flink 中RocksDB 为什么将每个键和值的限制为 2^31 字节
  • SpringCloud带你走进微服务的世界
  • 零信任架构实战手册-企业安全升级
  • 使用 Excel 实现绩效看板的自动化
  • 2024 年第四届高校大数据挑战赛-赛题 A:岩石的自动鉴定
  • css基本功
  • 手写svm primal form形式