概述
为了解决传统容器中配置的挂载、变更、管理等问题,在k8s中引入了一个叫做configmap的资源对象,在configmap中,各个配置项都是以key-value的方式存在的,value的数据可以是一个配置文件的内容,这些配置项被保存在k8s使用的持久化存储etcd中。
这样就形成了一个k8s中的配置中心,可以独立的对configmap中的数据进行修改,然后将configmap挂载到pod中进行使用,可以以env的方式,也可以以配置文件的方式在pod中进行引用。
这样配置和pod就实现了解耦,都是k8s中独立的资源对象。
ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷,ConfigMap对象用于为容器中的应用提供配置文件等信息。但是比较敏感的数据,例如密钥、证书等由Secret对象来进行配置。它们将相应的配置信息保存于对象中,而后在Pod资源上以存储卷的形式挂载并获取相关的配置,以实现配置与镜像文件的解耦。
Pod可以通过三种方式来使用ConfigMap,分别为:
- 将ConfigMap中的数据设置为环境变量
- 将ConfigMap中的数据设置为命令行参数
- 使用Volume将ConfigMap作为文件或目录挂载
下面主要介绍使用Volume将ConfigMap作为文件或目录挂载
1.首先在容器外面创建一个redis.conf的配置文件,然后根据这个配置文件创建出一个名为redis.conf的ConfigMap
2.通过kubectl get cm redis.conf -o yaml可以将刚才创建的ConfigMap以yaml格式输出
3.剔除一些创建时间等元数据,精简过后的ConfigMap的yaml文件的内容如下所示
apiVersion: v1 data: #data里面是配置文件的名字以及相应的配置,以key:value的格式来书写。 redis.conf: | #key:redis.conf (默认是你创建ConfigMap时--from-file=redis.conf那哪个配置文件就叫什么名字) appendonly yes #value:配置文件的内容 kind: ConfigMap metadata: name: redis-conf namespace: default
注:data里可以包含多个配置文件的数据,所以data里面是通过key:value的形式来表示对应的配置文件的名字及内容的,创建完ConfigMap后通过创建一个pod来具体讲述一下ConfigMap是如何使用的。
apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: redis command: #创建容器后在容器里面执行的命令 - redis-server - "/redis-master/redis.conf" #指的是redis容器内部的位置 ports: - containerPort: 6379 volumeMounts: - mountPath: /data #指的是容器内部的/data目录 name: data #卷挂载的名字,与下面相同名字的volumes进行匹配并挂载 - mountPath: /redis-master name: config volumes: - name: data emptyDir: {} - name: config #将volumeMounts需要进行挂载且name为config的目录以配置集的方式进行挂载 configMap: name: redis-conf #这是配置集的名称,k8s会根据这个名字来寻找对应的ConfigMap items: - key: redis.conf #这是ConfigMap当中data里面的key值,也就是要挂载的配置文件的名字,k8s要根据这个key值从名为redis.conf的ConfigMap中找到需要挂载的配置文件的真正内容。 path: redis.conf #这是最终容器当中配置文件的名字,也就是容器中配置文件路径为/redis-master/redis.conf
用图片描述对应关系就是如下所示:
4.另外还可通过kubectl edit来编辑ConfigMap从而直接修改容器内部的配置文件的内容:
综上就是一个ConfigMap从创建到使用的全部过程,
总结
对于configmap的创建,方式如下:
- 命令行
- –from-file
- –from-literal
- yaml定义文件
pod使用configmap的方式
- 环境变量
- volume挂载为容器内的配置文件