1.作用
对于应用的可变配置在 Kubernetes 中是通过一个 ConfigMap 资源对象来实现的,我们知道许多应用经常会有从配置文件、命令行参数或者环境变量中读取一些配置信息的需求,这些配置信息我们肯定不会直接写死到应用程序中去的,比如你一个应用连接一个 redis 服务,下一次想更换一个了的,还得重新去修改代码,重新制作一个镜像,这肯定是不可取的,而ConfigMap 就给我们提供了向容器中注入配置信息的能力,不仅可以用来保存单个属性,还可以用来保存整个配置文件,比如我们可以用来配置一个 redis 服务的访问地址,也可以用来保存整个 redis 的配置文件。接下来我们就来了解下 ConfigMap 这种资源对象的使用方法。
2.创建一个configmap
[root@k8s-master01 configmap]# cat cm-demo1.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: cm-demo
namespace: default
data:
data.1: hello
data.2: world
config: |
property.1=value-1
property.2=value-2
property.3=value-3
[root@k8s-master01 configmap]# kubectl get configmaps
NAME DATA AGE
cm-demo 3 7m26s
[root@k8s-master01 configmap]# kubectl describe configmaps cm-demo
Name: cm-demo
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
config:
----
property.1=value-1
property.2=value-2
property.3=value-3
data.1:
----
hello
data.2:
----
world
Events: <none>
3.我们可以可以从一个给定的目录来创建一个 ConfigMap 对象,比如我们有一个 testcm 的目录,该目录下面包含一些配置文件,redis 和 mysql 的连接信息
[root@k8s-master01 testcm]# cat redis.conf
host=127.0.0.1
port=6379
[root@k8s-master01 testcm]# cat mysql.conf
host=127.0.0.1
port=3306
[root@k8s-master01 configmap]# kubectl create configmap cm-demo2 --from-file=testcm/
configmap/cm-demo2 created
[root@k8s-master01 configmap]# kubectl get configmaps
NAME DATA AGE
cm-demo 3 13m
cm-demo2 2 25s
game-config 2 22d
kube-root-ca.crt 1 71d
[root@k8s-master01 configmap]# kubectl describe configmaps cm-demo2
Name: cm-demo2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
redis.conf:
----
host=127.0.0.1
port=6379
mysql.conf:
----
host=127.0.0.1
port=3306
Events: <none>
[root@k8s-master01 configmap]# kubectl get configmaps cm-demo2 -oyaml
apiVersion: v1
data:
mysql.conf: |
host=127.0.0.1
port=3306
redis.conf: |
host=127.0.0.1
port=6379
kind: ConfigMap
metadata:
creationTimestamp: "2021-04-11T05:30:28Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:mysql.conf: {}
f:redis.conf: {}
manager: kubectl-create
operation: Update
time: "2021-04-11T05:30:28Z"
name: cm-demo2
namespace: default
resourceVersion: "2856094"
uid: 93937b91-6488-4a6f-8277-7e15a486b0ef
4.指定文件来创建
[root@k8s-master01 configmap]# kubectl create configmap cm-demo3 --from-file=testcm/redis.conf
configmap/cm-demo3 created
[root@k8s-master01 configmap]# kubectl get configmaps cm-demo3 -oyaml
apiVersion: v1
data:
redis.conf: |
host=127.0.0.1
port=6379
kind: ConfigMap
metadata:
creationTimestamp: "2021-04-11T05:33:09Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:redis.conf: {}
manager: kubectl-create
operation: Update
time: "2021-04-11T05:33:09Z"
name: cm-demo3
namespace: default
resourceVersion: "2856476"
uid: 26b0b246-606c-4077-aea5-494954787e1c
5.通过帮助文档我们可以看到我们还可以直接使用字符串进行创建,通过 --from-literal 参数传递配置信息,同样的,这个参数可以使用多次,格式如下:
[root@k8s-master01 configmap]# kubectl create configmap cm-demo4 --from-literal=db.host=localhost --from-literal=db.port=3306
configmap/cm-demo4 created
[root@k8s-master01 configmap]# kubectl get configmaps cm-demo4 -oyaml
apiVersion: v1
data:
db.host: localhost
db.port: "3306"
kind: ConfigMap
metadata:
creationTimestamp: "2021-04-11T05:35:39Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:db.host: {}
f:db.port: {}
manager: kubectl-create
operation: Update
time: "2021-04-11T05:35:39Z"
name: cm-demo4
namespace: default
resourceVersion: "2856827"
uid: 43285a9c-d1ea-48b1-a311-1f630ea764d3
6.使用
ConfigMap 创建成功了,那么我们应该怎么在 Pod 中来使用呢?我们说 ConfigMap 这些配置数据可以通过很多种方式在 Pod 里使用,主要有以下几种方式:
设置环境变量的值
在容器里设置命令行参数
在数据卷里面挂载配置文件
非常常见的使用 ConfigMap 的方式:通过数据卷使用,在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容,如下资源对象所示:
apiVersion: v1
kind: Pod
metadata:
name: testcm3-pod
spec:
volumes:
- name: config-volume
configMap:
name: cm-demo2
containers:
- name: testcm3
image: busybox
command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
[root@k8s-master01 configmap]# kubectl apply -f cmtest3-pod.yaml
pod/testcm3-pod created
[root@k8s-master01 configmap]# kubectl logs testcm3-pod
host=127.0.0.1
port=6379
当然我们也可以在 ConfigMap 值被映射的数据卷里去控制路径,如下 Pod 定义:
apiVersion: v1
kind: Pod
metadata:
name: testcm4-pod
spec:
volumes:
- name: config-volume
configMap:
name: cm-demo1
items:
- key: mysql.conf
path: path/to/msyql.conf
containers:
- name: testcm4
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/path/to/msyql.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
[root@k8s-master01 configmap]# kubectl create -f cmtest4-pod.yaml
pod/testcm4-pod created
[root@k8s-master01 configmap]# kubectl logs cmtest4
host=127.0.0.1
port=3306