目录
什么是ConfigMap
在传统架构中,配置文件往往被保存在宿主机上,程序启动是可以指定某个配置文件,但是使用容器部署时,容器所在的节点并不固定,所以不能使用这种方式,此处在构建镜像时,如果把配置文件也放在容器里面,那么配置文件一旦有更改的话,也是一件非常麻烦的事情。所以k8s 抽象了一个configMap的概念,将配置与 pod 和组件分开,这有助于保持工作负载的可移植性,使配置更易于更改和管理。比如在生产环境中,可以将 Nginx、Redis 等应用的配置文件存储在 configMap 上,然后将其挂载即可使用。
相对于 secret,ConfigMap 更倾向于存储和共享非敏感、未加密的配置信息,假如是集群中使用敏感信息,最好使用 secret。
ConfigMap 用来在键值对数据库(etcd)中保存非加密数据。一般用来保存配置文件。
ConfigMap 可以用作环境变量、命令行参数或者存储卷。
ConfigMap 将环境配置信息与 容器镜像 解耦,便于配置的修改。
ConfigMap 在设计上不是用来保存大量数据的。
ConfigMap中保存的数据不可超过1mb。
创建ConfigMap
ConfigMap 可以用目录(目录下有多个文件)、单个文件或字符值的方式创建,使用 kubect1 创建一个 ConfigMap 的命令格式如下:
kubectl create configmap <map-name><data-source>
map-name:ConfigMap 的名称
data-source:数据源,可以使数据的目录、文件或字符值
ConfigMap 中的数据是以键值对(key-value pair)的形式保存的,其中🔑文件名或秘钥
value:文件内容或字符值
1:基于目录创建ConfigMap
假如一次性需要多个文件来创建 ConfigMap,可以使用 kubectl create configmap 命令从同一个
目录中的多个文件创建 configMap。
1.创建conf目录,放置文件
2.基于目录下的所有文件创建ConfigMap
注意:
ConfigMap 是按namespace 隔离的,不同的namespace 之间的configMap 的名称可以相同,但是不能跨namespace 进行访问,创建ConfigMap 时,可以使用-n选项指定资源所在的namespace。
3.查看当前创建的ConfigMap
注意:
由于该 ConfigMap 是直接基于目录创建的,没有指定 ConfigMap 中的 key 名,因此默认是按照目录下的文件名作为 ConfigMap 数据中的 key 名。
2:基于文件创建ConfigMap
1.单个文件创建ConfigMap
注意:
由于没有指定 ConfigMap 的 key,因此使用文件名作为 key。
2.使用带有key的命令创建ConfigMap
3.多个文件创建ConfigMap
3:基于ENV文件创建ConfigMap
假如有一个文件 game-env-file.cfg,里面存储的 key=value 形式的数据,此类文件可以当做某个应用的环境变量配置,此时可以使用–from-env-file 从 ENV 文件创建 configMap。
1.创建测试用的key-value文件
2.创建ConfigMap
4:基于字符值创建ConfigMap
利用字符值创建ConfigMap
5:删除创建的ConfigMap
ConfigMap实践
本实践案例将 CM 创建的变量引入到 pod 内。
在 kubernetes 中,用户可以使用环境变量引用 ConfigMap 中的数据,当容器启动时,kubernetes会将 configMap 数据作为环境变量注入到容器的进程中。为了使用 configMap 中的数据,用户需要在 pod的规范(spec)中定义一个 env 字段,并指定 configMap 中的“键值对”
1:使用valueFrom定义容器的环境变量
1.先以字符集的形式创建ConfigMap
2.使用valueFrom从ConfigMap中定义变量
在此案例中,env 用于定义环境变量,valueFrom 指定了环境变量的值来源于ConfigMap。“name:my-name01”用于定义容器中用的变量名,其值来自于 CM 中的 name1 的值。“name1”是在 CM 中定义的 key。
用 valueFrom 的方式引入 pod 中的变量名,可以在定义 pod 的之后指定成另一个名称。相当于在 pod中起了一个新的名字,但是值还是原来 ConfigMap 中给定的值。
3.创建此pod
2:使用envFrom定义容器的环境变量
k8s 从 1.6的版本开始,引入了一个新的字段 envFrom,实现了在 Pod 中将 configMap 中所有定义的key=value 自动生成为环境变量。
使用 envFrom 时,环境变量的名字是 configMap 中数据的 key 名。
备注:valueFrom 和envfrom的区别
通过 valueFrom 来配置环境变量,Pod 的环境变量名与 configMap 中定义的变量名不必相同valueFrom 是指定变量进行映射。
通过 envFrom 会把 configMap 的所有键值对都映射到 Pod 的环境变量中去envFrom 配置的环境变量和 Pod 的环境变量名是相同的
1.使用envFrom从ConfigMap中定义变量
2.创建此pod
3:以文件形式挂载ConfigMap
大部分情况下,ConfigMap 定义的都是配置文件,而不是环境变量,因此需要将 ConfigMap 的文件挂载到 Pod 中,然后 Pod 中的容器就可以引用,此时可以通过 Pod 的 volume 字段进行挂载。
1.使用带有key的命令创建ConfigMap
2.编写文件,将名为spec-config的ConfigMap挂载到容器的/etc/conf目录下
注意:
容器的/etc/config 目录会被覆盖掉
3.登录容器
4:自定义文件名挂载ConfigMap
很多情况下,需要更改挂载的文件名,可以使用 path 字段指定 ConfigMap 挂载的文件名,比如将文件 app2.conf 挂载到/etc/conf 下,并重命名为 app2.cfg。
1.编写pod文件
2.创建此pod
3.登录容器
5:指定挂载文件权限
1.编写pod文件
备注:
defaultMode:0666
没有设置权限的其他文件默认的权限
2.创建此pod
3.登录容器
6:利用SubPath解决挂载覆盖的问题
当挂载 ConfigMap 或 Secret 到容器内部时,会覆盖容器中的目录,也就是是说,在容器中的对应的目录中,就只剩下我们挂载进去的文件,此目录中其他的文件都会丢失。从而导致容器无法正常运行。为了解决挂载覆盖的问题,需要使用 subPath 的方式进行挂载。
1.创建配置文件
2.使用带有key的命令创建ConfigMap
3.创建pod文件,挂载文件
备注:
mountPath 表示容器中目录
subPath 表示configMap 中文件的key 名
items::这部分定义了如何将 configMap 中的键值对映射到文件系统中。
key: nginx.conf:这个键(key)是指 ConfigMap 中的一个键值对的键名,这里的键名是nginx.conf.
path:nginx.conf:这指定了当这个键被注入到容器的文件系统时,它将被写入的具体路径和文件名
4.登录容器
加密数据管理
上一节讲解的 ConfigMap 主要用于非安全的数据,与其对应的是 Secret 对象类型,用来保存敏感信息,例如密码、令牌或 SSH Key,将这些信息放在 Serret 中比较安全和灵活。用户可以创建 Secret 并且引用到 Pod 中,比如使用 Secre 初始化 Redres、MySQL 密码等。
1:创建secret
1.使用kubectl命令创建secret
创建账户信息
备注:
generic:通用类型
user-pass:创建的secret 的名字
查看Secret:
备注:
Opaque:不透明的,表示 secret是加密的形式保存数据的
默认情况下,get 和 describe 命令都不会显示文件的内容,这是为了防止 Secret 中的内容被意外暴露。所以,显示出来的信息中 Data字段没有对应的值,只显示了文件的名字。
2.通过yaml文件创建secret
手动创建 Secret 时,每一项内容必须是 base64 编码的,所以要先对明文进行编码:
创建一个secret
2:解码secret
3:在pod中应用secret
secret 和 ConfigMap 的用法类似,也可以作为数据卷挂载,或作为环境变量以供 Pod 的容器使用。
和 configMap 一样,可以在 Pod 的 volume 中使用 Secret: