文章目录
一、Configmap概述
1.1、什么是Configmap?
ConfigMap是一种API对象,用来将 非机密性的数据保存到key/value键值对中。使用时,Pods可以将其用作 环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 将您的环境配置信息和容器镜像解耦,便于应用配置的修改。
1.2、Configmap应用场景
1、使用微服务架构,存在多个服务共用配置的情况,如果每个服务都有一份配置的话,更新配置就会比较麻烦,configmap可以实现多个服务配置共享。
2、使用K8S部署应用,当把应用配置写进代码中,更新配置时需要重新打包镜像,configmap可以将配置信息和docker镜像进行解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,可直接注入到Pod中给容器使用。configmap常用注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中。
1.3、Configmap局限性
ConfigMap在设计上不是用来保存大量数据的。 在ConfigMap中保存的数据不可超过1MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷或者使用独立的数据库或者文件服务。
二、Configmap创建
2.1、通过命令行创建
说明:直接在命令行中指定configmap参数创建,通过–from-literal 指定参数
[root@k8s-client-17 configmap]# kubectl create configmap nginx-config --from-literal=nginx_http_port=80 --from-literal=nginx_https_port=443
configmap/nginx-config created
[root@k8s-client-17 configmap]# kubectl describe configmap nginx-config
如下图所示:
2.2、通过文件创建
2.2.1、通过–from-file
说明:通过指定文件创建一个configmap,–from-file=<文件>
[root@k8s-client-17 configmap]# cat nginx.conf
server {
server_name upload.nginx.com;
listen 80;
root /usr/share/nginx/html
}
[root@k8s-client-17 configmap]# kubectl create configmap nginx-config --from-file=./nginx.conf
configmap/nginx-config created
[root@k8s-client-17 configmap]# kubectl describe configmap nginx-config
如下图所示:
2.2.2、通过–from-env-file
说明:通过指定文件创建一个configmap,–from-env-file=<文件>
[root@k8s-client-17 configmap]# cat env.conf
redis.host=192.168.1.168
redis.port=53000
[root@k8s-client-17 configmap]# kubectl create configmap redis-config --from-env-file=./env.conf
configmap/redis-config created
[root@k8s-client-17 configmap]# kubectl get configmap redis-config -o yaml
如下图所示:
2.3、指定目录创建
说明:通过指定文件创建一个configmap,–from-file=<目录地址>
[root@k8s-client-17 test]# pwd
/root/configmap/test
[root@k8s-client-17 test]# cat redis1.conf
redis1.host=192.168.1.100
redis1.port=53000
[root@k8s-client-17 test]# cat redis2.conf
redis2.host=192.168.1.101
redis2.port=53001
[root@k8s-client-17 test]# kubectl create configmap redis-cluster --from-file=/root/configmap/test
configmap/redis-cluster created
[root@k8s-client-17 test]# kubectl get configmap redis-cluster -o yaml
如下图所示:
2.4、通过YAML配置文件
配置文件内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-demo
namespace: default
data:
data.1: hello # 类属性键;每一个键都映射到一个简单的值
data.2: world
config: | # 类文件键
property.1=value-1
property.2=value-2
property.3=value-3
如下图所示:
三、Configmap使用
1、创建configmap
[root@k8s-client-17 test]# cat config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
namespace: default
labels:
app: redis
data:
redis.conf: |
dir /data
port 6379
bind 0.0.0.0
appendonly yes
protected-mode no
requirepass zisefeizhu
pidfile /data/redis-6379.pid
[root@k8s-client-17 test]# kubectl apply -f redis-pod.yaml
ConfigMap创建成功了,那么我们应该怎么在Pod中来使用呢?我们说ConfigMap这些配置数据可以通过很多种方式在Pod里使用,主要有以下两种方式:
第一种是通过环境变量的方式,直接传递给pod。
第二种是作为volume的方式挂载到pod内。
3.1、通过环境变量使用
方法一:使用valueFrom、configMapKeyRef、name、key指定要用的key。
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql1-config
namespace: default
labels:
app: mysql1
data:
mysql.host: "192.168.1.11"
mysql.port: "3306"
mysql.passwd: "zisefeizhu"
---
apiVersion: v1
kind: Pod
metadata:
name: mysql1-pod
spec:
containers:
- name: mysql1-single
image: busybox
imagePullPolicy: IfNotPresent
args: [ "/bin/sh", "-c", "sleep 3000" ]
env:
- name: MYSQL_HOST #必须为大小且字符串之间必须带下划线
valueFrom:
configMapKeyRef:
name: mysql1-config #需与上面定义的configmap name必须保持一致,则configm配置才能被pod引用
key: mysql.host
- name: MYSQL_PORT #必须为大小且字符串之间必须带下划线
valueFrom:
configMapKeyRef:
name: mysql1-config #需与上面定义的configmap name必须保持一致,则configm配置才能被pod引用
key: mysql.port
- name: MYSQL_PASSWD #必须为大小且字符串之间必须带下划线
valueFrom:
configMapKeyRef:
name: mysql1-config #需与上面定义的configmap name必须保持一致,则configm配置才能被pod引用
key: mysql.passwd
进入mysql1-single容器查看环境变量,如下图所示:
方法二:通过envFrom、configMapRef、name使得configmap中的所有key/value对都自动变成环境变量。
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql2-config
namespace: default
labels:
app: mysql2
data:
mysql.host: "192.168.1.11"
mysql.port: "3306"
mysql.passwd: "zisefeizhu"
---
apiVersion: v1
kind: Pod
metadata:
name: mysql2-pod
spec:
containers:
- name: mysql2-single
image: busybox
imagePullPolicy: IfNotPresent
args: [ "/bin/sh", "-c", "sleep 3000" ]
envFrom:
- configMapRef:
name: mysql2-config #需与上面定义的configmap name必须保持一致,则configm配置才能被pod引用
进入mysql2-single容器查看环境变量,如下图所示:
3.3、作为volume挂载使用
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql3-config
namespace: default
labels:
app: mysql3
data:
mysql.host: "192.168.1.11"
mysql.port: "3306"
mysql.passwd: "zisefeizhu"
---
apiVersion: v1
kind: Pod
metadata:
name: mysql3-pod
spec:
containers:
- name: mysql3-single
image: busybox
imagePullPolicy: IfNotPresent
args: [ "/bin/sh", "-c", "sleep 3000" ]
volumeMounts:
- name: mysql-config #必须与下面定义的volumes名称保持一致
mountPath: "/etc/mysql" #容器里挂载路径
readOnly: true
volumes:
- name: mysql-config #卷名称
configMap: #基于configmap创建本地卷
name: mysql3-config #指定configMap名称,必须与上面定义的configmap name保持一致,configmap配置才能被pod引用
进入mysql3-single容器查看,看到在/etc/mysql目录下以每一个key为文件名value为值创建了mysql.host、mysql.passwd、mysql.port三个文件。如下图所示:
四、Configmap配置更新
1、使用该ConfigMap挂载的env不会同步更新;
说明:修改configmap中的变量,如下所示
修改前
mysql.host: "192.168.1.11"
mysql.port: "3306"
mysql.passwd: "zisefeizhu"
修改后
mysql.host: "192.168.1.12"
mysql.port: "3307"
mysql.passwd: "123456"
说明:修改configmap中的变量后,重新apply资源清单文件
[root@k8s-client-17 test]# kubectl apply -f mysql1-configmap.yaml
configmap/mysql1-config configured
pod/mysql1-pod unchanged
进入容器mysql1-single,查看变量没有发生变化
2、使用该ConfigMap 挂载的Volume 中的数据需要一段时间才能同步更新。
说明:修改configmap中的变量,如下所示
修改前
mysql.host: "192.168.1.11"
mysql.port: "3306"
mysql.passwd: "zisefeizhu"
修改后
mysql.host: "192.168.1.12"
mysql.port: "3307"
mysql.passwd: "123456"
说明:修改configmap中的变量后,重新apply资源清单文件
[root@k8s-client-17 test]# kubectl apply -f mysql3-configmap.yaml
configmap/mysql3-config configured
进入容器mysql3-single,等待一段时间后,查看变量已经发生变化,如下图所示:
五、Configmap总结
ConfigMap的限制条件:
1、ConfigMap必须在Pod之前创建,Pod才能引用它。
2、如果Pod使用envFrom基于ConfigMap定义环境变量,则无效的环境变量名称(例如名称以数字开头)将被忽略,并在事件中被记录为InvalidVariableNames。
3、ConfigMap受命名空间限制,只有处于相同命名空间的Pod才可以引用它。
4、ConfigMap无法用于静态Pod。
什么是静态pod?
在Kubernetes中有一个DaemonSet类型的pod,这种类型的pod可以在某个节点上长期运行,这种类型的pod就是静态pod。静态pod直接由某个节点上的kubelet程序进行管理,不需要api server介入,静态pod也不需要关联任何RC,完全是由kubelet程序来监控,当kubelet发现静态pod停止掉的时候,重新启动静态pod。
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级K8s集群运维实战