当前位置: 首页 > news >正文

【云原生丨Kubernetes系列16】深入学习 ConfigMap 的使用

前言

在上一篇文章中,我们学习了ConfigMap的创建,那么创建成功了,我们应该怎么在 Pod 中来使⽤它呢?今天我们就来深入地学习ConfigMap的使用。

在这里插入图片描述

文章目录

  • 前言
  • 使用
  • 使用ConfigMap的限制条件

使用

ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。

我们说ConfigMap 这些配置数据可以通过很多种⽅式在 Pod ⾥使⽤,主要有以下⼏种⽅式:

  • 设置环境变量的值
  • 在容器⾥设置命令⾏参数
  • 在数据卷⾥⾯创建config⽂件

⾸先,我们使⽤ ConfigMap 来填充我们的环境变量

apiVersion: v1
kind: Pod
metadata:
name: testcm1-pod
spec:
containers:
- name: testcm1
image: busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.port
envFrom:
- configMapRef:
name: cm-demo1

这个Pod运⾏后会输出如下⼏⾏:

$ kubectl logs testcm1-pod
......
DB_HOST=localhost
DB_PORT=3306
mysql.conf=host=127.0.0.1
port=3306
redis.conf=host=127.0.0.1
port=6379
......

我们可以看到 DB_HOSTDB_PORT 都已经正常输出了,另外的环境变量是因为我们这⾥直接把 cmdemo1 给注⼊进来了,所以把他们的整个键值给输出出来了,这也是符合预期的。

另外我们可以使⽤ ConfigMap 来设置命令⾏参数, ConfigMap 也可以被⽤来设置容器中的命令或者参数值,如下 Pod :

apiVersion: v1
kind: Pod
metadata:
name: testcm2-pod
spec:
containers:
- name: testcm2
image: busybox
command: [ "/bin/sh", "-c", "echo $(DB_HOST) $(DB_PORT)" ]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.port

运⾏这个 Pod 后会输出如下信息:

$ kubectl logs testcm2-pod
localhost 3306

另外⼀种是⾮常常⻅的使⽤ ConfigMap 的⽅式:通过数据卷使⽤,在数据卷⾥⾯使⽤ ConfigMap ,就是将⽂件填⼊数据卷,在这个⽂件中,键就是⽂件名,键值就是⽂件内容:

apiVersion: v1
kind: Pod
metadata:
name: testcm3-pod
spec:
containers:
- name: testcm3
image: busybox
command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-demo2

运⾏这个 Pod 的,查看⽇志:

$ kubectl logs testcm3-pod
host=127.0.0.1
port=6379

当然我们也可以在 ConfigMap 值被映射的数据卷⾥去控制路径,如下 Pod 定义:

apiVersion: v1
kind: Pod
metadata:
name: testcm4-pod
spec:
containers:
- name: testcm4
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/path/to/msyql.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-demo1
items:
- key: mysql.conf
path: path/to/msyql.conf

运⾏这个 Pod 的,查看⽇志:

$ kubectl logs testcm4-pod
host=127.0.0.1
port=3306

另外需要注意的是,当 ConfigMap 以数据卷的形式挂载进 Pod 的时,这时更新 ConfigMap (或删掉重建 ConfigMap ), Pod 内挂载的配置信息会热更新。这时可以增加⼀些监测配置⽂件变更的脚本,然后 reload 对应服务。


使用ConfigMap的限制条件

使用ConfigMap的限制条件如下:

  • ConfigMap必须在Pod之前创建(除非把 ConfigMap 标志成”optional”)。如果您引用了一个不存在的 ConfigMap, 那这个Pod是无法启动的。就像引用了不存在的 Key 会导致 Pod 无法启动一样。
  • ConfigMap受Namespace限制,只有处于相同的Namespace中的Pod可以引用它;
  • ConfigMap中的配额管理还未能实现
  • kubelet值支持可以被API Server管理的Pod使用ConfigMap。kubelet在当前Node上通过 --manifest-url--config 自动创建的静态Pod将无法引用ConfigMap;
  • 在Pod对ConfigMap进行挂载(volumeMount)操作是,容器内部只能挂载为目录,无法挂载为文件
  • 在挂载到容器内部后,目录中将包含ConfigMap定义的每个item,如果该目录下原理还有其他文件,则容器内的该目录会被挂载的ConfigMap覆盖

在这里插入图片描述

相关文章:

  • Python-字典,从基础到进阶用法大总结,进来查漏补缺
  • 2. 深度生成模型-扩散模型(去噪扩散概率模型)
  • java6:枚举类和注解
  • webpack5(高级)
  • Python从入门到数据分析第一篇—Python简介- Python介绍与初探
  • Element-UI+Vue实现主页布局——侧边栏用户布局(上)
  • java16-多线程
  • 数据分析可视化03 技术框架:数据可视化分析的两种武器
  • 模拟实现atoi
  • Go 和 C# 的速度比较来了
  • 谷歌Guava LoadingCache介绍
  • 第二章:微服务架构构建
  • Python 基础阶段
  • 我发现凡是给offer的公司,面试时基本不问技术细节,那些问得又多又细的公司,后面就没下文了
  • 【微搭低代码】JavaScript基础知识-变量定义及初始化
  • CentOS从零开始部署Nodejs项目
  • Effective Java 笔记(一)
  • Flannel解读
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java 多线程编程之:notify 和 wait 用法
  • Node 版本管理
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • python 学习笔记 - Queue Pipes,进程间通讯
  • spark本地环境的搭建到运行第一个spark程序
  • SpringBoot 实战 (三) | 配置文件详解
  • unity如何实现一个固定宽度的orthagraphic相机
  • V4L2视频输入框架概述
  • Vue2 SSR 的优化之旅
  • yii2权限控制rbac之rule详细讲解
  • 包装类对象
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 分布式事物理论与实践
  • 简单易用的leetcode开发测试工具(npm)
  • 简析gRPC client 连接管理
  • 批量截取pdf文件
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 正则表达式
  • 智能网联汽车信息安全
  • 1.Ext JS 建立web开发工程
  • Java性能优化之JVM GC(垃圾回收机制)
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (33)STM32——485实验笔记
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (顺序)容器的好伴侣 --- 容器适配器
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)项目管理杂谈-我所期望的新人
  • (转载)Linux 多线程条件变量同步