K8S之Configmap的介绍和使用

Configmap

Configmap概述

Configmap的简介

configmap是K8S中的资源对象,用于保存非机密性的配置信息,可以使用 "键-值对" (Key-Value Pair)的形式保存,也可通过文件的形式保存。

Configmap能解决的问题

在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务,那么这些配置都存在这个节点上,假如需要对服务器扩容,扩容之后还是需要部署多个服务并且还是要管理这些服务的配置;或者有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改。

这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。

使用Configmap:

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

Configmap应用场景

  • K8S中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理;
  • 存在多个服务共用配置的情况,使用configmap可以友好的进行配置共享
  • 使配置信息和Docker镜像解耦,实现镜像的可移植性和可复用性;

局限性

ConfigMap在设计上不适用于保存大量数据的。在ConfigMap中保存的数据不可超过1 MiB。如果需要保存超出此限制的数据,可以考虑挂载其他的存储卷或者使用独立的数据库、文件服务。

Configmap创建方法

通过命令行直接创建

直接在命令行中指定configmap参数创建,通过 --from-literal 指定参数

例如:创建一个configmap,名叫:tomcat-config。

包含2个配置信息:tomcat_port=8080,server_name=myapp.tomcat.com

命令如下:

bash 复制代码
kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com

查看已创建的configmap(ps. configmap 可简写为 cm)

bash 复制代码
kubectl describe cm tomcat-config
bash 复制代码
kubectl get cm

2:表示里面有2个配置

通过文件创建

通过指定文件创建一个configmap,通过 --from-file=<文件> 指定文件

例如:创建一个 nginx.conf 文件,与名叫 "www-nginx" 的configmap绑定。

bash 复制代码
vim nginx.conf
lua 复制代码
server {
  server_name www.nginx.com;
  listen 80;
  root /home/nginx/www/
}

www-nginx中,定义一个key是www,值是nginx.conf中的配置内容

bash 复制代码
kubectl create configmap www-nginx1 --from-file=www=./nginx.conf

查看configmap

bash 复制代码
kubectl describe configmap www-nginx1

或者,直接已文件名" nginx.conf " 作为key,值是nginx.conf中的内容

bash 复制代码
kubectl create configmap www-nginx2 --from-file=./nginx.conf

查看configmap

bash 复制代码
kubectl describe configmap www-nginx2

指定目录创建

将目录下的文件分别作为配置信息

例如:

1、创建配置目录

bash 复制代码
mkdir test-mysql-config
bash 复制代码
cd test-mysql-config/

2、模拟写入第一个配置文件

bash 复制代码
vim my-server.cnf 

写入:server-id=1

3、模拟写入第二个配置文件

bash 复制代码
vim my-slave.cnf 

写入:server-id=2

4、指定目录创建configmap

bash 复制代码
kubectl create configmap mysql-config --from-file=/root/test-mysql-config/

查看configmap详细信息

bash 复制代码
kubectl describe cm mysql-config

编写Configmap资源清单Yaml文件

bash 复制代码
vim mysql-configmap.yaml 
yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  master.cnf: | # 文件名,用| 表示下面的配置是有多行
    [mysqld]
    log-bin
    log_bin_trust_function_creators=1
    lower_case_table_names=1
  slave.cnf: |
    [mysqld]
    super-read-only
    log_bin_trust_function_creators=1
bash 复制代码
kubectl apply -f mysql-configmap.yaml
bash 复制代码
kubectl describe cm mysql

Configmap的使用案例

通过环境变量引入:使用configMapKeyRef

创建一个存储mysql配置的configmap

bash 复制代码
vim mysql-configmap.yaml
yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
    log: "1"
bash 复制代码
kubectl apply -f mysql-configmap.yaml
bash 复制代码
kubectl get cm

创建pod,引用Configmap中的配置

bash 复制代码
vim mysql-pod.yaml
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    env:
    - name: log_bin   #定义环境变量log_bin
      valueFrom: 
        configMapKeyRef:
          name: mysql     #指定configmap的名字
          key: log # 指定configmap中的key, 将它的value赋值给环境变量log_bin

更新资源清单文件

bash 复制代码
kubectl apply -f mysql-pod.yaml
bash 复制代码
kubectl exec -it mysql-pod -c mysql -- /bin/sh
bash 复制代码
printenv 

通过环境变量引入:使用envfrom

bash 复制代码
vim mysql-pod-envfrom.yaml
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-envfrom
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    envFrom: 
    - configMapRef:
       name: mysql     #指定configmap的名字

更新资源清单文件

bash 复制代码
kubectl apply -f mysql-pod-envfrom.yaml
bash 复制代码
kubectl exec -it mysql-pod-envfrom -- /bin/sh
bash 复制代码
printenv

把configmap做成volume,挂载到pod (最常用)

bash 复制代码
vim mysql-configmap.yaml 
yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
    log: "1"
    lower: "1"
    my.cnf: |
      [mysqld]
      Welcome=sissie

更新资源清单文件

bash 复制代码
kubectl apply -f mysql-configmap.yaml
bash 复制代码
kubectl get cm mysql
bash 复制代码
vim mysql-pod-volume.yaml
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-volume
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh","-c","sleep 3600" ]
    volumeMounts:
    - name: mysql-config
      mountPath: /tmp/config
  volumes:
  - name: mysql-config
    configMap:
      name: mysql

更新资源清单文件

bash 复制代码
kubectl apply -f mysql-pod-volume.yaml
bash 复制代码
kubectl exec -it mysql-pod-volume -c mysql -- /bin/sh
bash 复制代码
cd /tmp/config/
bash 复制代码
ls
bash 复制代码
printenv

看不到以上的配置

Configmap热更新------使用挂载的 Volume

bash 复制代码
kubectl edit configmap mysql

把logs: "1"变成log: "2"

保存退出

bash 复制代码
kubectl exec -it mysql-pod-volume -c mysql -- /bin/sh
bash 复制代码
cat /tmp/config/log 

发现log值变成了2,更新生效了

注意:

更新 ConfigMap 后:通过环境变量注入的,使用该 ConfigMap 挂载的 Env 不会同步更新

使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

相关推荐
阿里云云原生18 小时前
LLM 不断提升智能下限,MCP 不断提升创意上限
云原生
阿里云云原生18 小时前
GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩
云原生
云上艺旅21 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
c无序21 小时前
【Docker-7】Docker是什么+Docker版本+Docker架构+Docker生态
docker·容器·架构
FixBug_Nick21 小时前
使用Docker安装及使用最新版本的Jenkins
docker·容器·jenkins
ghostwritten1 天前
Run Milvus in Kubernetes with Milvus Operator
容器·kubernetes·milvus
Zero_to_zero12341 天前
解决docker的ubuntu系统中文乱码问题
ubuntu·docker·容器
@郭小茶1 天前
docker-compose方式部署docker项目
运维·docker·容器
duration~1 天前
K8S自定义CRD
容器·贪心算法·kubernetes
ghostwritten1 天前
Docker Registry Clean
运维·docker·容器