一、认识ConfigMap资源
在分布式环境中,基于负载、容错等需求的考虑,几乎所有的服务器都需要在不同的机器上分别部署不止一个实例。随着程序功能的日益复杂,同时配置文件的修改频率通常远远大于代码本身,这种情况下,有时仅仅是一个配置内容的修改,就不得不重新进行代码提交、打包、分发上线的流程。部署模式较大的场景中,分发上线工作即繁杂又沉重。
究其根本,所有的这些麻烦都是由于配置和代码在管理和发布过程中紧密耦合所致。配置本身源于代码,是为了提高代码的灵活性而提取出来的一些经常变化的或需要定制的内容,而正是配置的这种天生的变化特征为部署过程带来了不小的麻烦,也最终催生了分布式系统配置管理系统,从而将配置内容从代码完全分离出来,及时可靠高效的提供配置访问和更新服务。
作为分布式系统的Kubernetes也提供了统一配置管理方案–ConfigMap。Kubernetes基于ConfigMap对象实现了将配置文件从容器镜像中解耦,从而增强了容器应用的可移植性。简单来说,一个ConfigMap对象就是一系列配置数据的集合,这些数据可"注入"到Pod对象中,并为容器应用所使用,注入方式有挂载为存储卷和传递为环境变量两种。
ConfigMap对象将配置数据以键值对的形式进行存储,这些数据可以在Pod对象中使用或者为系统组件提供配置,例如控制器对象等。不过,无论应用程序如何使用ConfigMap对象中的数据,用户都完全可以通过在不同的环境中创建名称相同但是内容不同的ConfigMap对象,从而为不同环境中同一功能的Pod资源提供不同的配置信息,实现应用于配置的灵活勾兑。
二、创建ConfigMap
Kubernetes的不少资源既可以使用kubelet create命令创建,也可以使用清单创建,例如namespace。ConfigMap是另一个两种创建方式都可以常见的资源。而且,通过使用"kubectl create configmap"命令,用户可以根据目录、文件或直接值创建ConfigMap对象,命令语法格式如下所示:
kubectl create configmap <map-name> <data-source>
.
其中,<map-name>即为ConfigMap对象的名称,而<data-source>是数据源,它可以通过直接值、文件或目录来获取。无论是哪一种数据源供给方式,它都要转换为ConfigMap对象中的Key-Value数据,其中Key由用户在命令行给出或者是文件数据源的文件名,它仅能由数字、字母、连接号和点号组成,而Value则是直接值或文件数据源的内容。
1)利用直接值创建
为"kubelet create configmap"命令使用"--from-literal"选项可在命令行直接给出键值对来创建ConfigMap对象,重复使用此选项则可以传递多个键值对。命令格式如下:
kubelet create configmap configmap_name --from-literal=key-name-1=value-1
例如,下面的命令创建了一个名为special-config时传递了两个键值对:
]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap/special-config created
查看ConfigMap对象的详细信息:
]# kubectl get configmap -o wide
NAME DATA AGE
special-config 2 8s
]# kubectl get configmap special-config -o yaml
apiVersion: v1
data:
special.how: very
special.type: charm
kind: ConfigMap
metadata:
creationTimestamp: "2020-08-30T07:39:16Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {
}
f:special.how: {
}
f:special.type: {
}
manager: kubectl
operation: Update
time: "2020-08-30T07:39:16Z"
name: special-config
namespace: default
resourceVersion: "6456083"
selfLink: /api/v1/namespaces/default/configmaps/special-config
uid: 6d5f473b-bd99-49eb-9729-00fac9dd8642
2)基于文件创建
为"kubectl create configmap"命令使用"--from-file"选项即可基于文件内容来创建ConfigMap对象,它的命令格式如下。可以重复多次使用"--from-file"选项以传递多个文件内容:
kubectl create configmap <configmap_name> --from-file=<path-to-file>
例如,下面的命令可以把事先准备好的Nginx配置文件模板保存于ConfigMap对象nginx-config中:
]# kubectl create configmap nginx-conf --from-file=/etc/nginx/nginx.conf.default
configmap/nginx-conf created
查看ConfigMap资源对象详细信息:
]# kubectl get configmap nginx-conf -o yaml
apiVersion: v1
data:
nginx.conf.default: |2
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
kind: ConfigMap
metadata:
creationTimestamp: "2020-08-30T07:47:58Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {
}
f:nginx.conf.default: {
}
manager: kubectl
operation: Up