k8s configMap
k8s configMap
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象
ConfigMap 的创建
根据文件夹创建cm
# 创建
kubectl create cm cm名 --from-file=目录名 -n namespace
# 该目录下的每个文件被定义为一个键值对,其中文件名作为键,文件内容作为值
# 查看
kuebctl get cm cm名 -n namespace
kubectl describe cm cm名 -n namespace
# 删除
kubectl delete cm cm名 -n namespace
//也可以这样写,重新定义文件名字
rancher kubectl create configmap game-config -n ecs-dev --from-file=alex=alex
—from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
使用文件创建
只要指定为一个文件就可以从单个文件中创建 ConfigMap
—from-file 这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的
# 创建,configmap简写为cm
# 第一种是将文件名作为键,文件内容作为值
kubectl create cm configmap名 --from-file=文件名 --from-file=文件名 ... -n namespace
# 第二种,不以文件名作为键,自定义键
kubectl create cm configmap名 --from-file=键值1=文件名 --from-file=键值2=文件名 ... -n namespace
# 查看
kuebctl get cm -n namespace
kubectl describe cm cm名 -n namespace
# 删除
kubectl delete cm cm名 -n namespace
kubectl delete cm --all -n namespace # 删除所有cm
命令行声明键值对创建configmap
# 创建
kubectl create cm cm名 --from-literal=键1=值1 --from-literal=键2=值2 ... -n namespace
# 查看
kuebctl get cm -n namespace
kubectl describe cm cm名 -n namespace
# 删除
kubectl delete cm cm名 -n namespace
通过资源清单文件创建configmap
# 资源清单文件
apiVersion: v1
kind: ConfigMap
metadata:
name:
namespace:
data:
key1: value1
key2: value2
...
# 下面是嵌套写法
data:
key1:
key2:value2
key3:value2
...
# 创建
kubectl create -f 资源清单文件
kubectl apply -f 资源清单文件
# 查看
kubectl describe cm cm名 -n namespace
kubectl describe -f 资源清单文件
# 删除
kubectl delete cm cm名 -n namespace
kubectl delete -f 资源清单文件
Pod 中使用 ConfigMap
使用 ConfigMap 来替代环境变量
apiVersion: v1
kind: ConfigMap
metadata:
name: literal-config
namespace: default
data:
name: dave
password: pass
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
apiVersion: v1
kind: Pod
metadata:
name: cm-env-test-pod
spec:
containers:
- name: test-container
image: wangyanglinux/myapp:v1
command: [ "/bin/sh", "-c", "env" ]
env:
- name: USERNAME //定义环境变量的key
valueFrom: //value来源
configMapKeyRef: //value来源configMap
name: literal-config //configMap里面的名字 kubectl get cm
key: name //literal-config 这个里面的name对应的value
- name: PASSWORD
valueFrom:
configMapKeyRef:
name: literal-config
key: password
envFrom: //将configmap env-config里面的key-value全部注入到容器中
- configMapRef:
name: env-config
restartPolicy: Never //永不重启,容器死了就死了
用 ConfigMap 设置命令行参数
apiVersion: v1
kind: Pod
metadata:
name: cm-command-dapi-test-pod
spec:
containers:
- name: test-container
image: wangyanglinux/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,有不同的选项。最基本的就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容
spec:
containers:
- name: <APP_NAME>
image: <HARBOR>/<PROJECT>/<APP_NAME>:<BUILD_TAG>
imagePullPolicy: Always
volumeMounts:
- name: wxpay-key //对应下面创建的卷
mountPath: "/app/key/apiclient_key.pem" //指定配置文件存放到容器的哪个位置
subPath: apiclient_key.pem //重新指定文件名称,防止文件冲突
- name: wxpay-cert
mountPath: "/app/cert/apiclient_cert.pem"
subPath: apiclient_cert.pem
ports:
- name: http
containerPort: 8080
startupProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 30
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 8080
periodSeconds: 30
failureThreshold: 3
timeoutSeconds: 20
readinessProbe:
httpGet:
path: /health
port: 8080
periodSeconds: 30
failureThreshold: 3
timeoutSeconds: 20
volumes:
- name: wxpay-key //在这里定义卷,可以和上面匹配关联到一起
configMap:
name: soi-chat-wxpay-key-cm //kubectl get cm获取到的configmap名称
- name: wxpay-cert
configMap:
name: soi-chat-wxpay-cert-cm
热更新
ConfigMap 的热更新
像这种文件注入到环境里面去的,不是挂载进去的,批量化注入,可以缓解磁盘的IO
apiVersion: v1
kind: ConfigMap
metadata:
name: log-config //configMap的名字
namespace: default
data:
log_level: INFO //configMap里面的key,value
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hot-update
spec:
replicas: 1
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: wangyanglinux/myapp:v1
ports:
- containerPort: 80
volumeMounts:
- name: config-volume //调用volume里面的config-volume
mountPath: /etc/config //把内容放到 /etc/config里面
volumes:
- name: config-volume //起一个名字config-volume关联configMap
configMap:
name: log-config //configMap的名字
//实时刷新查看挂载进去的value
while 2>1;do kubectl exec hot-update-c484b98b4-fmh4x -- cat /etc/config/log_level;sleep 1;date;done
修改 ConfigMap
kubectl edit configmap log-config
把INFO改成ERROR,注意有没有nginx里面的annotations: 里面是否有INFO,有的话也要改成ERROR
再次刷新查看
while 2>1;do kubectl exec hot-update-c484b98b4-fmh4x -- cat /etc/config/log_level;sleep 1;date;done
等待几秒~几十秒,可以看到日志开始打印ERROR,因为是注入的,并不是挂载的,减小磁盘IO
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 来触发滚动更新
!!! 更新 ConfigMap 后:
- 使用该 ConfigMap 挂载的 Env 不会同步更新
- 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
不可变更的ConfigMap
Kubernetes还提供了一种将ConfigMap设置为不可变更的特性(也支持Secret)。对于大量使用ConfigMap的集群(至少有数万个各不相同的ConfigMap给Pod挂载)而言,禁止更改ConfigMap的数据有以下好处:
保护应用,使之免受意外(不需要的)更新所带来的负面影响;
大幅降低对kube-apiserver的压力,从而提升集群性能。这是因为系统会关闭对已标记为不可变更的ConfigMap的监控。
我们可以通过将immutable字段设置为true创建不可变更的ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
...
data:
...
immutable: true
要注意的是,一旦某ConfigMap被标记为不可变更,则无法逆转这一变化,也无法更改data或binaryData字段的内容。只能删除并重建ConfigMap。因为现有的Pod会维护一个已被删除的ConfigMap的挂载点,建议重新创建这些Pods
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!