Kubernetes(k8s)之Configmap配置管理
Posted Tuki_a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes(k8s)之Configmap配置管理相关的知识,希望对你有一定的参考价值。
Configmap
镜像和配置文件的解耦
应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。从Kubernetes1.2开始提供了一种统一的应用配置管理方案一ConfigMap。
ConfigMap作用
Configmap用于保存配置数据,以键值对形式存储。
configMap 资源提供了向 Pod 注入配置数据的方法。
旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
ConfigMap应用场景
(1)生成为容器内的环境变量。
(2)设置容器启动命令的启动参数(需设置为环境变量)。
(3)以Volume的形式挂载为容器内部的文件或目录。
ConfigMap以一个 或多个key:value的形式保存在Kubermetes系统中供应用使用,既可以用于表示一个变量的值(例如apploglevel=info),也可以用于表示一个完整配置文件的内容(例如Iserver.xml=< ?x… )可以通过YAML配置文件或者直接使用kubectl create configmap命令行的方式来创建ConfigMap。
创建ConfigMap的方式
1、使用字面值创建
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
有两个键值对,如图标注
2、使用文件创建
kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
key键的名称是文件名称,value的值是这个文件的内容
一个键值对,如图标注,值就是文件内容
和原文件内容一致
3、使用目录创建
kubectl create configmap my-config-3 --from-file=test
目录中的文件名为key,文件内容是value
新建一个目录,在里边放入一些内容(相当于配置文件)
下图标注有问题,一个键值对,键是目录,值是目录下的内容
4、编写configmap的yaml文件创建
创建cm的yaml配置文件内容如下
vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.38.250"
db_port: "3306"
应用文件,cm创建成功
如何使用configmap
1、通过环境变量的方式直接传递给pod
编写配置文件,内容如下
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: key1 #定义环境变量的名称
valueFrom: #key1对应的value
configMapKeyRef:
name: cm1-config #环境变量的值取自cm1-config,我们在上边创建的cm
key: db_host #key是cm1-config中的db_host
- name: key2
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_port
restartPolicy: Never
应用文件创建pod,查看日志可以看到键值对
查看详细描述效果一样
2、通过在pod的命令行下运行的方式
编写配置文件,内容如下
$ vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busyboxplus
command: ["/bin/sh", "-c", "env"] #获取环境变量
envFrom: #用于在容器中填充环境变量的源列表
- configMapRef:
name: cm1-config #选择一个ConfigMap来填充环境具有的变量。cm1-config的键值对作为环境变量
restartPolicy: Never #重启策略:永不
创建pod
可以看到键值对和cm1-config的一致
3、作为volume的方式挂载到pod内
编写配置文件,内容如下:
没有指定items(将字符串键映射到卷内的路径),在引用ConfigMap时不指定items(如果未指定,则引用的ConfigMap的数据字段中的每个键值对将作为文件投影到卷中,该文件的名称为键,内容为值),则使用volumeMount方式在容器内的目录下为每个item都生成一个 文件名为key的文件。
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod3
image: busyboxplus
command: ["/bin/sh", "-c", "cat /config/db_host"] #只要cm1-config的db_host这个key
volumeMounts:
- name: config-volume #引用卷的名称
mountPath: /config #挂载到容器内的目录
volumes:
- name: config-volume #定义volume的名称
configMap:
name: cm1-config #使用我们前面创建的cm1-config
restartPolicy: Never
查看日志得到我们想要的value
使用ConfigMap的限制条件
使用ConfigMap的限制条件如下:
1、ConfigMap必须在Pod之前创建。
2、ConfigMap受Namespace限制, 只有处于相同Namespace中的Pod才可以引用它。
3、ConfigMap中的配额管理还未能实现。
4、kubelet只支持可以被API Server管理的Pod使用ConfigMap。kubelet在本Node上通过–manifest- url或- config自动创建的静态Pod将无法引用ConfigMap。
5、在Pod对ConfigMap进行挂载(volumeMount) 操作时,在容器内部只能挂载为“目录”,无法挂载为“文件”。在挂载到容器内部后,在目录下将包含ConfigMap定义的每个item,如果在该目录下原来还有其他文件,则容器内的该目录将被挂载的ConfigMap覆盖。
热更新
实现修改配置文件可以做到动态更新。
演示:
创建配置nginx的cm,首先我们要有一个nginx的简单的配置文件nginx.conf,内容如下:
server {
listen 8000; #该配置文件主要是设置端口
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.html;
}
}
接下来将配置文件nginx.conf作为键值对创建cm,使用如下命令:
kubectl create configmap nginxconf --from-file=nginx.conf #这是使用文件的方式创建configmap
接下来创建控制器,使用volumemount的方式使用上面创建的cm,nginx.yaml文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d #容器内挂载路径
volumes:
- name: config-volume
configMap:
name: nginxconf #使用nginxconf这个cm
应用文件创建出pod
查看ip
使用我们设置的端口访问没有问题
修改nginx.conf里的端口为8080
Pod数据并不会实时更新,需要等待几秒,可以使用命令kubectl edit cm nginxconf查看是否更新完成。
configmap热更新后,并不会触发相关Pod的滚动更新,需要手动触发,使用以下命令:
kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210730"}}}}}'
#version值一旦变动就会实现更新
但使用手动出发更新较慢,还是直接删除掉pod重新创建来的快,建议直接删除重新创建,如下,访问8080没有问题,热更新完成!
以上是关于Kubernetes(k8s)之Configmap配置管理的主要内容,如果未能解决你的问题,请参考以下文章
k8s之安全信息(secret)及配置信息(configmap)管理
#yyds干货盘点#spring-cloud-kubernetes与k8s的configmap