[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122856681
目录
第2章 创建ConfigMap对象, 关联pod内部的配置文件的路径
2.3 根据多个键值对文件创建(一个configmap支持多个配置文件)
前言:
PV和PVC解决了pod间共享目录的挂载,有时候,我们只期望挂载pod内部的配置文件,以便于在pod外部对pod的配置进行修改,PV和PVC就搞不定了,新的机制来满足上述需求,这就是ConfigMap。
第1章 ConfigMap概述
1.1 什么是ConfigMap?
为了让Docker镜像和Docker镜像运行时的配置文件解耦,以便实现镜像的可移植性和可复用性,进入了ConfigMap。
ConfigMap是用来存储集群中的Pod所需要的配置文件信息的kubernetes资源对象。Map是键值对的映射,是一种字典。
ConfigMap所管辖的配置信息是非加密的非安全性要求的数据。
通过configmpa,多个pods对象可以在集群内部共享相同的配置文件。
1.2 配置信息真正的保存地方
ConfigMap只是用来在集群内部,在Pod外部,描述配置信息的对资源对象,本身并不存放配置信息。所有的配置内容实际上都存储在K8S系统中的etcd,并通过ConfigMap这个对象实现pod之间,pod与pod外部共享配置信息。
1.3 配置信息保存格式
存放在etcd中的配置文件信息,是按照键值对的方式存储的,如IP:value; port:value等。
1.4 创建ConfigMap对象的4种方式
(1)通过指定命令行参数创建,即--from-literal
(2)通过指定特定文件创建,即将一个配置文件创建为一个ConfigMap--from-file=<文件>
(3)通过指定特定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录>
(4)事先写好标准的configmap的yaml文件,然后kubectl create -f 创建
第2章 创建ConfigMap对象, 关联pod内部的配置文件的路径
2.1 通过命令行参数--from-literal
创建
$ kubectl create configmap config-map1 --from-literal=db.host=10.5.10.116 --from-literal=db.port='3306'
$ kubectl get configmap
# 以yaml 格式输出config map的内容
$ kubectl get configmap config-map1 -o yaml >> config-map1.yaml
$ cat config-map1.yaml
[root@k8s-master1 ~]# cat config-map1.yaml
apiVersion: v1
data: # 配置文件的名称data
db.host: 10.5.10.116 # 配置文件的内容
db.port: "3306" # 配置文件的内容
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-10T06:23:49Z"
name: config-map1 # configmap对象的名称
namespace: default
resourceVersion: "72089"
uid: 5aaef0ba-2ac3-4a19-a97a-ebbe53c16d84
因此,configmap的内容以字典的形式存在的:
configmap对象的名称:name: config-map1
配置文件的名称:无
配置文件的内容:
db.host: 10.5.10.116
db.port: "3306"
2.2 根据键值对文件创建(非configmap文件)
(1)生成属性文件
touch app.properties
vi app.properties
propertie1 = 1
propertie2 = 2
propertie3 = 3
(2)根据属性文件生成configmap对象
kubectl create configmap config-map2 --from-file=./app.properties --from-file=./app.params
- --from-file=./app.properties : 指定配置文件名
(3)展现configmap对象的内容
[root@k8s-master1 ~]# kubectl get configmap config-map2 -o yaml
apiVersion: v1
data:
app.properties: | # 配置文件的名称
propertie1 = 1 # 配置文件的内容
propertie2 = 2 # 配置文件的内容
propertie3 = 3 # 配置文件的内容
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-10T06:35:55Z"
name: config-map2 # configmap对象的名称
namespace: default
resourceVersion: "73035"
uid: 8d773265-b04f-4017-ace4-c557c1c517fd
configmap对象的名称:name: config-map2
配置文件的名称:app.properties,一个configmap可以包含多个配置文件
配置文件的内容:
propertie1 = 1 # 配置文件的内容
propertie2 = 2 # 配置文件的内容
propertie3 = 3 # 配置文件的内容
2.3 根据多个键值对文件创建(一个configmap支持多个配置文件)
(1)生成多个配置文件
touch app.properties1
vi app.properties1
propertie1 = 1
propertie2 = 2
propertie3 = 3
touch app.properties2
vi app.properties2
propertie1 = 4
propertie2 = 5
propertie3 = 6
(2)根据多个配置文件生成configmap对象
kubectl create configmap config-map3 --from-file=./app.properties1 --from-file=./app.properties2
--from-file=./app.properties : 指定配置文件名
(3)展现configmap对象的内容
2.4 根据键值对文件所在文件目录(目录中可能有多个文件)
方法基本同2.2, 不同的是:--from-file参数指定的是键值对文件所在的目录,而是是文件本身。
$ mkdir config
$ kubectl create configmap config-map2 --from-file=./config/
[root@k8s-master1 ~]# kubectl get configmap config-map3 -o yaml
apiVersion: v1
data:
app.properties1: |
propertie1 = 1
propertie2 = 2
propertie3 = 3
app.properties2: |
propertie1 = 4
propertie2 = 5
propertie3 = 6
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-10T09:14:46Z"
name: config-map3
namespace: default
resourceVersion: "85423"
uid: f0b24171-b45a-460f-8fd8-d11a343d2699
app.properties1: 配置文件1
app.properties2: 配置文件2
通过items来指定configmap中的多个不同的文件名。
2.5 根据configmap.yaml文件生成
这是最标准的方法。
kubectl create configmap config-map1 --from-file=./config-map1.yaml
# 以yaml 格式输出config map的内容
$ kubectl get configmap config-map1 -o yaml >> config-map1.yaml
$ cat config-map1.yaml
[root@k8s-master1 ~]# cat config-map1.yaml
apiVersion: v1
data:
db.host: 10.5.10.116
db.port: "3306"
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-10T06:23:49Z"
name: config-map1
namespace: default
resourceVersion: "72089"
uid: 5aaef0ba-2ac3-4a19-a97a-ebbe53c16d84
configmap对象的名称:name: config-map1
配置文件的名称:无
配置文件的内容:
db.host: 10.5.10.116
db.port: "3306"
第3章 创建pod,关联ConfigMap对象
创建ConfigMap对象后,把配置文件的内容存放在K8S的etcd档案库中,并且通过ConfigMap对象就可以访问键值对的配置文件的值,而不是需要通过文件路径名访问。
前一章创建了configmap对象以及相关的内容,有三种使用configmap中键值对配置的方式。
- 第一种是通过环境变量的方式,直接传递给pod
- 使用configmap中指定的key
- 使用configmap中所有的key
- 第二种是通过在pod的命令行下运行的方式(启动命令中)
- 第三种是作为volume的方式挂载到pod内。
3.1 通过环境变量使用
3.2 通过在pod的命令行下运行的方式(启动命令中)
3.3 作为volume的方式挂载到pod内。
(1)configmap的内容解读
configmap对象的名称:name: config-map1
配置文件的名称:redis-conf, 一个configmap可以包含多个配置文件名。
配置文件的内容:
appendonly=yes
(2)pod的mount映射解读
- 第1个mount
本地的路径:mountpath=data
远程的volume:data
data即不是NFS, 也不是configmap,而是空目录
- 第2个mount
本地的路径:mountpath=redis-master
远程的volume:config
config对象的类型是K8S的configmap,而不是NFS, 也不是本地目录
config对应的configmap的对象名为redis-conf
items: 指定redis-master目录应该包含configmap中哪些配置文件。
key:redis-conf =》指定configmap中一个配置文件名。
path:redis-conf =》 指定configmap中的配置文件名,mount后的文件名。
至此,第2个mount为的映射结果为:redis-master/redis-conf
如果有多个配置文件需要映射到redis-master/目录中,则至少有两个步骤要改进
首先,configmap中有多个配置文件,至少有两个配置文件。
然后,在items再增加新的key和path。
3.4 配置命令详解
$ vi cm-redis.conf
appendonly = yes
$ kubectl create configmap cm-redis-conf --from-file=./cm-redis.conf
[root@k8s-master1 ~]# kubectl get configmap cm-redis-conf -o yaml
apiVersion: v1
data:
cm-redis.conf: |+
appendonly yes
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-10T16:44:40Z"
name: cm-redis-conf
$ touch redis-pod-cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-redis-pod
spec:
containers:
- name: my-redis-container
image: kubernetes/redis:v1
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
resources:
limits:
cpu: "0.1"
volumeMounts:
- mountPath: /redis-master-data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir:
- name: config
configMap:
name: cm-redis-conf
items:
- key: cm-redis.conf
path: redis.conf
$ kubectl apply -f redis-pod-cm.yaml
$ kubectl get pod
$ kubectl exec -it my-redis-pod -- /bin/sh
[root@k8s-master1 ~]# kubectl exec -it my-redis-pod -- /bin/sh
# cd /redis-master-data
# ls
# cd /redis-master
# ls
redis.conf
# cat redis.conf
appendonly yes
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122856681
以上是关于[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap的主要内容,如果未能解决你的问题,请参考以下文章
[云原生专题-43]:K8S - 核心概念 - placeholder - 加密数据
[云原生专题-42]:K8S - 核心概念 - placeholder-有状态服务
[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC
[云原生专题-40]:K8S - 核心概念 - 网络模型网络通信集群内负载均衡机制(重要重要重要)