【概念说明】
Kubernetes 里专门用来管理配置信息的两种对象:ConfigMap 和 Secret,使用它们来灵活地配置、定制我们的应用。配置根据数据安全划分,分为两种:
- 明文配置:不加密的字符串,可以任意查询修改,比如服务端口、运行参数、文件路径等等。用ConfigMap保存;
- 机密配置:加密字符串,由于涉及敏感信息需要保密,不能随便查看,比如密码、密钥、证书等等。用Secret保存。
【ConfigMap】
用命令 kubectl create 来创建一个它的 YAML 样板。注意,它有简写名字“cm”,所以命令行里没必要写出它的全称:
由于configmap存储的是静态数据,所以,YAML中,不需要spec这种定义运行参数的字段了,只有apiversion,kind,metadata。但是 ConfigMap 要存储数据,是需要用另一个含义更明确的字段“data”。YAML生成样板的时候,需要这样添加参数--from-literal,注意,因为在 ConfigMap 里的数据都是 Key-Value 结构,所以 --from-literal 参数需要使用 k=v 的形式:
基于这个YAML,做一下修改,如下图就是一个典型的configmap对象:
现在就可以kubectl apply -f,创建一个cm对象,使用get cm,describe cm info来查看状态。可以看到数据已经存入etcd,后面其他应用就可以使用这个数据了。
【Secret】
在 Kubernetes 里 Secret 对象又细分出很多类,比如:
- 访问私有镜像仓库的认证信息
- 身份识别的凭证信息
- HTTPS 通信的证书和私钥
- 一般的机密信息(格式由用户自行解释)
前几种我们现在暂时用不到,所以就只使用最后一种,创建 YAML 样板的命令是 kubectl create secret generic ,同样,也要使用参数 --from-literal 给出 Key-Value 值。可以看到,这个YAML里,“name”值是一串“乱码”,而不是刚才在命令行里写的明文“root”,因为这个是Base64编码:
创建secrec,查看信息。由于是加密的数据,只能看到大小,不能看到具体内容:
【如何使用cm和secret】
如何让其他的应用来使用这两个数据呢?方式有两种:
1、环境变量:通过声明环境变量的方式来使用。如pod里,有env字段,可以使用“valueFrom”字段来引用cm或者secret对象。如下就是一个引用了cm和secret的pod,yaml是如何描述的:
这个 Pod 的名字是“env-pod”,镜像是“busybox”,执行命令 sleep 睡眠 300 秒,在这段时间里可以使用命令 kubectl exec 进入 Pod 观察环境变量。重点关注的是它的“env”字段,里面定义了 4 个环境变量,COUNT、GREETING、USERNAME、PASSWORD。对于明文配置数据, COUNT、GREETING 引用的是 ConfigMap 对象,所以使用字段“configMapKeyRef”,里面的“name”是 ConfigMap 对象的名字,也就是之前创建的“info”,而“key”字段分别是“info”对象里的 count 和 greeting。同样的对于机密配置数据, USERNAME、PASSWORD 引用的是 Secret 对象,要使用字段“secretKeyRef”,再用“name”指定 Secret 对象的名字 user,用“key”字段应用它里面的 name 和 pwd 。参考下图理解这层套娃关系:
运行一下这个pod,进入pod查看pod定义的一些数据,可以看到引用值,确实是我们在cm和secret里面定义的。
2、加载文件。Kubernetes 为 Pod 定义了一个“Volume”的概念,可以翻译成是“存储卷”。如果把 Pod 理解成是一个虚拟机,那么 Volume 就相当于是虚拟机里的磁盘。通过为 Pod“挂载(mount)”多个 Volume,里面存放供 Pod 访问的数据,这种方式有点类似 docker run -v,虽然用法复杂了一些,但功能也相应强大一些。在 Pod 里挂载 Volume 很容易,只需要在“spec”里增加一个“volumes”字段,然后再定义卷的名字和引用的 ConfigMap/Secret 就可以了。要注意的是 Volume 属于 Pod,不属于容器,所以它和字段“containers”是同级的,都属于“spec”。
- 定义volume:定义好引用的cm和secret对象;
- 在容器里挂载:这要用到“volumeMounts”字段,正如它的字面含义,可以把定义好的 Volume 挂载到容器里的某个路径下,所以需要在里面用“mountPath”“name”明确地指定挂载路径和 Volume 的名字。具体可以参看下面的套娃说明:
接下来,加载这个pod的YAML,来感受下:
运行看一下效果。 ConfigMap 和 Secret 都变成了目录的形式,而它们里面的 Key-Value 变成了一个个的文件,而文件名就是 Key。
这两种方式,区别:
1、实现上:环境变量是直接引用了 ConfigMap/Secret,而 Volume 又多加了一个环节,需要先用 Volume 引用 ConfigMap/Secret,然后在容器里挂载 Volume。volume这种方式的好处在于:以 Volume 的概念统一抽象了所有的存储,不仅现在支持 ConfigMap/Secret,以后还能够支持临时卷、持久卷、动态卷、快照卷等许多形式的存储,扩展性非常好。(我没用过这些,我就照搬过来了,我肯定也记不住,就是有个印象吧。。);
2、使用上:ConfigMap 和 Secret 对存储数据的大小没有限制。但环境变量用法简单,更适合存放简短的字符串,而 Volume 更适合存放大数据量的配置文件,在 Pod 里加载成文件后让应用直接读取使用。
标签:ConfigMap,kubernetes,cm,chrono,Volume,YAML,Secret,Pod From: https://www.cnblogs.com/1234roro/p/16944044.html