K8s-存储_ConfigMap
K8s-存储
- 引入:K8s-存储分类
- ConfigMap --- 用于配置文件
- Secret ---用于安全方面
- Volume ---用于卷方面
- Persistent Volume ---用于卷方面
ConfigMap
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序 会从配置文件、命令行参数或环境变量中读取配置信息。 ConfigMap API 给我们提供了向容器中注入配置信息的机制, ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文 件或者 JSON 二进制等对象
基于base 64位算法
演示base 64位算法 #-d解密
-
ConfigMap的创建
-
使用目录创建:步骤如下
-
使用命令创建configmap实例
若想使用资源清单形式创建configmap实例,可以先使用以下命令 查看书写形式
kubectl apply configmap game-config --fromfile=/root/data/ --dry-run -o yam
由于我们的值比较灵活,volumes字段很多,如果每次都使用资源 清单来创建,则比较麻烦,之前是因为能使用标签,但此处不行,所以推荐以下命令来创建configmap
kubectl create configmap game-config --fromfile=/root/data/
注 :--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,键值就是文件的内容
-
使用文件创建configmap,和目录创建没什么区别
kubectl create configmap game-config-2 --fromfile=./game.file
-
使用字面值创建configmap
使用文字值创建,利用--from-literal参数传递配置信息,该参数 可以使用多次,格式如下
kubectl create configmap literal-config --fromliteral=name=dave --from-literal=password=pass
kubectl get configmap literal-config -o yaml
-
pod中如何使用ConfigMap
使用ConfigMap来替代环境变量,基于以下模板完成
即两种实现方式
1、替换环境变量
2、直接将值注入进去
apiVersion: v1 kind: configMap metadata: name: literal-config namespace: default data: name: dave password: pass --- apiVersion: v1 kind: configMap metadata: name: env-config namespaces: default data: log_level: INFO --- apiVersion: v1 kind: Pod metadata: name: cm-env-test-pod spec: containers: - name: test-container image: chenxiyanglinux/myapp:v1 command: ["/bin/sh","-c","env"] env: - name: USERNAME valueFrom: configMapKeyRef: name: literal-config key: name - name: PASSWORD valueFrom: configMapKeyRef: name: literal-config key: password envFrom: - configMapRef name: env-config restartPolicy: Never #env:替换环境变量名 #envFrom:直接原封不动的传递进去 #注:第一个模板上面已经使用命令创建,所以我们只需要将后两个 模板放在一起创建即可,使用---将两模板隔开即可
查看日志:
kubectl logs cm-env-test-pod # 已经成功被注入环境变量
注:要想使用此种方式注入环境变量,文件里的内容要遵循k:v结 构,即什么等于什么
-
用 ConfigMap 设置命令行参数
基于以下模板完成
apiVersion: v1 kind: Pod metadata: name: cm-command-dapi-test-pod spec: containers: - name: test-container image: chenxiyanglinux/myapp:v1 command: ["/bin/sh","-c","echo $(USERNAME) $(PASSWORD)"] env: - name: USERNAME valueFrom: configMapKeyRef: name: literal-config key: name - name: PASSWORD valueFrom: configMapKeyRef: name: literal-config key: password restartPolicy: Never
注:这里调用的是值,倘若是命令的话,即直接调用了
-
通过数据卷插件使用ConfigMap
在数据卷里面使用这个 ConfigMap,有不同的选项。最基本的就 是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容
apiVersion: v1 kind: Pod metadata: name: cm-volume-test-pod spec: container: - name: test-container image: chenxiyanglinux/myapp:v1 volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: literal-config restartPolivy: Nerver # 创建,进入pod查看是否挂载
-
ConfigMap的热更新
基于以下模板创建,此模板创建后,会在hot-updatepod中 的/etc/config目录下有一个config-volume文件,文件内容是logconfig的log_level: INF
apiVersion: v1 kind: ConfigMap metadata: name: log-config namespace: default data: log_level: INFO --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hot-update spec: replicas: 1 template: metadata: label: run: my-nginx sepc: containers: - name: my-nginx image: chenxiyanglinux/myapp:v1 ports: - containerPort: 80 volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: log-config # 为了实现热更新,我们采取死循环的方式
执行命令修改值
kubectl edit configmap log-config 修改ConfigMap的值,将两处INFO改为ERROR(随便改的),
注意:只要有INFO字段,都必须更改
观察左侧变化,稍微等一会,已自动更新
-
提问:若使用此种方法运用在服务器领域,怎样实现重载配置文件?
1、伪造---即更新版本为小版本v1.1,但实际未修改镜像,但也达到 了镜像的修改;可以实现滚动更新
2、ConfigMap 更新后滚动更新 Pod 更新
ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通 过修改 pod annotations 的方式强制触发滚动更新,以下两中方法
交互模式
kubectl edit deployment hot-update,添加annotations字段
-
保存退出后查看:
先移除之前的,再创建新的,达到滚动更新
命令方式
kubectl patch deployment hot-update --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20220224" }}}}}'
这个例子里我们在 .spec.template.metadata.annotations 中添加 version/config,每次通过修改 version/config 来触发滚动更新
注:!!! 更新 ConfigMap 后: 使用该 ConfigMap 挂载的 Env 不会同步更新 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概20秒)才能同步更新