在 Kubernetes 里,ConfigMap(配置管理中心)是用来存储和管理配置数据的一种对象,可以把应用的配置信息从代码中分离出来,方便修改和维护。
一、ConfigMap 的核心作用
解耦配置和镜像
你不需要每次改配置都重新打镜像,只改 ConfigMap 就行。
集中管理配置
在集群内所有 Pod 都能读取到同一份配置。
多种挂载方式
可以作为 环境变量、命令行参数 或 文件挂载 到容器中。
1、Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap2、Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。
二、创建 ConfigMap 的方法
1、直接用 YAML 定义
apiVersion: v1 kind: ConfigMap metadata: name: app-config namespace: default data: APP_ENV: production APP_PORT: "8080" db.conf: | host=127.0.0.1 port=3306 user=root kubectl apply -f configmap.yaml
2、命令行创建(键值对)
kubectl create configmap app-config \ --from-literal=APP_ENV=production \ --from-literal=APP_PORT=8080
3、从文件创建
kubectl create configmap app-config \ --from-file=nginx.conf \ --from-file=db.conf
4、指定目录创建 configmap
[root@k8s1 ~]# mkdir test-a [root@k8s1 ~]# cd test-a/ [root@k8s1 test-a]# cat my-server.cnf server-id=1 [root@k8s1 test-a]# cat my-slave.cnf server-id=2 #指定目录创建 configmap [root@k8s1 test-a]# kubectl create configmap mysql-config -- from-file=/root/test-a/ #查看 configmap 详细信息 [root@k8s1 test-a]# 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>
三、在 Pod 中使用 ConfigMap
1、作为环境变量
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: myapp image: nginx env: - name: APP_ENV valueFrom: configMapKeyRef: name: app-config key: APP_ENV
2、全部作为环境变量导入
envFrom: - configMapRef: name: app-config
3、挂载为文件
volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: app-config
这样 ConfigMap 中的每个 key 都会变成
/etc/config/
下的一个文件。
更新 ConfigMap
kubectl edit configmap app-config kubectl apply -f configmap.yaml
更新 ConfigMap 不会自动更新已运行的 Pod,通常需要
kubectl rollout restart deployment
重新加载。
4、使用 configMapKeyRef
###创建一个存储 MySQL 配置的 ConfigMap vim mysql-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql labels: app: mysql data: log: "1" lower: "1" kubectl apply -f mysql-configmap.yaml
##创建一个 Pod,引用 ConfigMap 中的内容 vim mysql-pod.yaml apiVersion: v1 kind: Pod metadata: name: mysql-pod spec: containers: - name: mysql image: busybox command: ["/bin/sh", "-c", "sleep 3600"] env: - name: log_bin # 定义环境变量 log_bin valueFrom: configMapKeyRef: name: mysql # 指定 ConfigMap 的名字 key: log # 指定 ConfigMap 中的 key - name: lower # 定义环境变量 lower valueFrom: configMapKeyRef: name: mysql key: lower restartPolicy: Never kubectl apply -f mysql-pod.yaml
###验证环境变量 kubectl exec -it mysql-pod -- /bin/sh / # printenv log_bin=1 lower=1
5、环境变量引入:使用 envfrom
vim mysql-pod-envfrom.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 的名字 restartPolicy: Never kubectl apply -f mysql-pod-envfrom.yaml kubectl exec -it mysql-pod-envfrom -- /bin/sh / # printenv lower=1 log=1
6、把 configmap 做成 volume,挂载到 pod
vim mysql-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql labels: app: mysql data: log: "1" lower: "1" my.cnf: | # 多行内容(文件) [mysqld] Welcome=xiaop log 和 lower 是普通的键值对(环境变量风格)。 my.cnf 使用了 | 代表多行字符串,这在挂载成文件时非常有用。 my.cnf 的内容会原样写入到 Pod 中的文件。
##Pod(挂载 ConfigMap 为文件) vim mysql-pod-volume.yaml apiVersion: v1 kind: Pod metadata: name: mysql-pod-volume spec: containers: - name: mysql image: busybox command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: mysql-config mountPath: /tmp/config # 挂载路径 volumes: - name: mysql-config configMap: name: mysql # 对应 ConfigMap 的名字 restartPolicy: Never volumes.configMap.name 指定使用的 ConfigMap。 volumeMounts.mountPath 指定挂载到容器内部的路径(这里是 /tmp/config)。 ConfigMap 里的每个 key 会变成一个文件: log → /tmp/config/log lower → /tmp/config/lower my.cnf → /tmp/config/my.cnf 文件内容就是 ConfigMap 中对应 key 的值。
##验证效果 # 创建 ConfigMap kubectl apply -f mysql-configmap.yaml # 创建 Pod kubectl apply -f mysql-pod-volume.yaml # 进入容器 kubectl exec -it mysql-pod-volume -- /bin/sh # 查看挂载的 ConfigMap 文件 cd /tmp/config ls # 输出: # log lower my.cnf # 查看文件内容 cat log # 1 cat lower # 1 cat my.cnf # [mysqld] # Welcome=xiaop
####有待补充。。。。。