Kubernetes教程-ConfigMap
第十一章 存储之ConfigMap
1、描述信息
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制大对象
ConfigMap 的创建一共有三种方式:
I、使用目录创建
#cd ~ #mkdir configmap #cd configmap #mkdir dir #cd dir #vim game.properties enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 #vim ui.properties color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice #ll /root/configmap/dir #kubectl create configmap game-config --from-file=../dir/ #指定name为game-config #kubectl get cm
#kubectl get cm game-config -o yaml #得到game-config的值
#kubectl describe cm game-config #得到game-config的值
II、使用文件创建
只要指定为一个文件就可以从单个文件中创建 ConfigMap
#kubectl create configmap game-config-2 --from-file=../dir/game.properties #指定name为game-config-2 #kubectl get configmaps game-config-2 -o yaml
—from-file 这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的
III、使用字面值创建
使用文字值创建,利用—from-literal参数传递配置信息,该参数可以使用多次,格式如下
#kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm #指定name为special-config
#kubectl get configmaps special-config -o yaml #查看special-config的值
--from-literal=special.how=very,指定键名为special.how,键值为very。
2、Pod 中使用 ConfigMap
I、使用 ConfigMap 来替代环境变量
#cd /root/configmap #mkdir env #cd env #vim env.yaml apiVersion: v1 kind: ConfigMap metadata: name: env-config #指定name为env-config namespace: default data: log_level: INFO #kubectl apply -f env.yaml #kubectl get cm
#kubectl describe cm env-config #kubectl describe cm special-config
#将上面两个ConfigMap文件注入到pod环境中
#vim pod.yaml apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: hub.atguigu.com/library/nginx:latest command: ["/bin/sh", "-c", "env"] #输出环境变量 env: #第一种导入方案 - name: SPECIAL_LEVEL_KEY #自定义一个新的KEY字 valueFrom: configMapKeyRef: name: special-config #从那个configMap文件导入 key: special.how #导入的是那个键的键名,就是将special.how键的键值赋予 - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type envFrom: #第二种导入方案 - configMapRef: name: env-config restartPolicy: Never #kubectl apply -f pod.yaml #kubectl get pod
#kubectl log dapi-test-pod | grep SPECIAL_ #查看环境变量
II、用 ConfigMap 设置命令行参数
#vim pod1.yaml apiVersion: v1 kind: Pod metadata: name: dapi-test-pod1 spec: containers: - name: test-container image: hub.atguigu.com/library/nginx:latest command: ["/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)"] #输出环境变量 env: #第一种导入方案 - name: SPECIAL_LEVEL_KEY #自定义一个新的KEY字 valueFrom: configMapKeyRef: name: special-config #从那个configMap文件导入 key: special.how #导入的是那个键的键名,就是将special.how键的键值赋予 - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type restartPolicy: Never #kubectl create -f pod1.yaml #kubectl get pod
##kubectl log dapi-test-pod1
III、通过数据卷插件使用ConfigMap
在数据卷里面使用这个 ConfigMap,有不同的选项。最基本的就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容
#vim pod2.yaml
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod2 spec: containers: - name: test-container image: hub.atguigu.com/library/nginx:latest command: ["/bin/sh", "-c", "sleep 600s"] volumeMounts: #容器下进行volume挂载 - name: config-volume #挂载的名称为config-volume,与下边相呼应 mountPath: /etc/config #把configMap里面的值存放在/etc/config目录里 volumes: - name: config-volume #名称为config-volume configMap: #从configMap导入 name: special-config #导入的configMap的name restartPolicy: Never #kubectl apply -f pod2.yaml #kubectl get pod #kubectl log dapi-test-pod2 #kubectl exec dapi-test-pod2 -it -- /bin/sh 在容器里执行下面的命令 #cd /etc/config #ls -la
键是文件名,值是文件内容。
3、ConfigMap 的热更新
#cd /root/configmap #mkdir config #cd config #vim pod.yaml #创建一个configMap apiVersion: v1 kind: ConfigMap metadata: name: log-config #ConfigMap的name namespace: default data: log_level: INFO --- #创建Deployment对configMap进行调用,调用的方式是以volume方式进行挂载 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-nginx spec: replicas: 1 template: metadata: labels: run: my-nginx spec: containers: - name: my-nginx image: hub.atguigu.com/library/nginx:latest ports: - containerPort: 80 volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: log-config #与上面的ConfigMap.metadata.name对应 #kubectl apply -f pod.yaml #kubectl get pod #kubectl log my-nginx-7955969b99-cf84m #kubectl exec my-nginx-7955969b99-cf84m -it -- /bin/sh #kubectl exec my-nginx-7955969b99-cf84m -it -- cat /etc/config/log_level #进入容器 # cd /etc/config # ls -la # cat log_level
修改 ConfigMap
#kubectl edit configmap log-config
修改INFO的值为DEBUG
修改log_level的值为DEBUG等待大概 10 秒钟时间,再次查看环境变量的值
#kubectl exec my-nginx-7955969b99-cf84m -it -- cat /etc/config/log_level
ConfigMap 更新后滚动更新 Pod
更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新
# kubectl patch deployment my-nginx --patch'{"spec": {"template": {"metadata": {"annotations":{"version/config": "20190411" }}}}}'
这个例子里我们在.spec.template.metadata.annotations中添加version/config,每次通过修改version/config来触发滚动更新
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现