k8s configMap介绍
ConfigMap 功能在 Kuberbetes 1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 json 二进制大对象。
configMap 四种创建方式
使用目录创建
创建一个目录,并在里面创建两个文件:
[root@k8s-master01 ~]# mkdir configmapDir
[root@k8s-master01 ~]# cd configmapDir/
[root@k8s-master01 configmapDir]# pwd
/root/configmapDir
[root@k8s-master01 configmapDir]# vim fileOne.properties
[root@k8s-master01 configmapDir]# cat fileOne.properties
name=tom
agr=24
gender=man
[root@k8s-master01 configmapDir]# vim fileTwo.properties
[root@k8s-master01 configmapDir]# cat fileTwo.properties
color=red
number=10
创建 configMap:
[root@k8s-master01 configmapDir]# kubectl create configmap cm-by-directory --from-file=/root/configmapDir
configmap/cm-by-directory created
[root@k8s-master01 configmapDir]# kubectl get cm
NAME DATA AGE
cm-by-directory 2 11m
其中 --from-file
:指定创建方式以及所在文件所在目录。该目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键就是文件的名字,值就是文件的内容。
使用文件创建
我们使用上面例子中的 fileOne.properties
文件来创建:
[root@k8s-master01 configmapDir]# kubectl create configmap cm-by-file --from-file=/root/configmapDir/fileOne.properties
configmap/cm-by-file created
[root@k8s-master01 configmapDir]# kubectl get cm
NAME DATA AGE
cm-by-directory 2 11m
cm-by-file 1 4s
--from-file
可以被使用多次,这个例子中,如果我们将 fileOne.properties
和 fileTwo.properties
都指定了的话,那么效果和指定整个目录一样。
使用字面值创建
和上面两个例子使用的关键字不一样,这里使用 --from-literal
参数传递配置信息,该参数可以使用多次。如:
[root@k8s-master01 configmapDir]# kubectl create configmap cm-by-literal --from-literal=name=tom --from-literal=age=24
configmap/cm-by-literal created
[root@k8s-master01 configmapDir]# kubectl get cm
NAME DATA AGE
cm-by-directory 2 16m
cm-by-file 1 5m55s
cm-by-literal 2 4s
使用 yaml 创建
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
保存为 special.yaml
,并执行:
kubectl apply -f special.yaml
Pod 中使用 configMap
使用 configMap 注入环境变量
special-config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
log-level-config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: log-level-config
namespace: default
data:
log_level: INFO
创建上面两个 configMap:
[root@k8s-master01 configmapDir]# kubectl apply -f log-level-config.yaml
configmap/log-level-config created
[root@k8s-master01 configmapDir]# kubectl apply -f special-config.yaml
configmap/special-config created
编写 Pod 资源清单(cm-env-pod.yaml):
apiVersion: v1
kind: Pod
metadata:
name: cm-env-pod
namespace: default
spec:
restartPolicy: Never
containers:
- name: nginx-container
image: hub.xixihaha.com/library/mynginx:v1
command: ['sh', '-c', 'env']
envFrom:
- configMapRef:
name: log-level-config
env:
- name: SPECIAL_HOW_STR
valueFrom:
configMapKeyRef:
name: special-config
key: special.how
- name: SPECIAL_TYPE_STR
valueFrom:
configMapKeyRef:
name: special-config
key: special.type
说明,上面共使用了两种方式注入环境变量:
-
command
:输出容器的环境变量。 -
spec.envFrom
:指定一个 configMap,并使用 configMap 的 key 和 value 作为环境变量的 key 和 value。 -
spec.env
:name 为环境变量的 key,valueFrom 指定使用哪个 configMap 以及哪个 key 的值。
创建 Pod 并查看输出的环境变量:
[root@k8s-master01 ~]# kubectl apply -f cm-env-pod.yaml
pod/cm-env-pod created
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cm-env-pod 0/1 Completed 0 5s
[root@k8s-master01 ~]# kubectl log cm-env-pod
log is DEPRECATED and will be removed in a future version. Use logs instead.
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=cm-env-pod
HOME=/root
PKG_RELEASE=1~buster
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.17.9
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SPECIAL_HOW_STR=very
KUBERNETES_PORT_443_TCP_PORT=443
NJS_VERSION=0.3.9
KUBERNETES_PORT_443_TCP_PROTO=tcp
SPECIAL_TYPE_STR=charm
log_level=INFO
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
数据卷挂载
apiVersion: v1
kind: Pod
metadata:
name: volume-config-pod
namespace: default
spec:
restartPolicy: Never
containers:
- name: nginx-container
image: hub.xixihaha.com/library/mynginx:v1
command: ['sh', '-c', 'sleep 3600']
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: special-config
说明:
spec.volumes.name
:定义一个数据卷,名称为config-volume
。spec.volumes.configMap.name
:数据卷关联的 configMap 名称,这里使用上面例子中创建的 special-config。spec.containers.volumeMounts.name
:数据卷名称。spec.containers.volumeMounts.mountPath
:数据卷挂载的容器内路径。
创建 Pod 并进入容器查看挂载的目录内容:
[root@k8s-master01 ~]# kubectl apply -f volume-config-pod.yaml
pod/volume-config-pod created
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
volume-config-pod 1/1 Running 0 3s
[root@k8s-master01 ~]# kubectl exec volume-config-pod -it /bin/bash
root@volume-config-pod:/# cd /etc/config
root@volume-config-pod:/etc/config# ls
special.how special.type
root@volume-config-pod:/etc/config# cat special.how
very
root@volume-config-pod:/etc/config# cat special.type
charm
root@volume-config-pod:/etc/config#
从结果可以看见,configMap(special-config)中的内容:
data:
special.how: very
special.type: charm
在挂载数据卷后,容器内部将 configMap 的 key 作为文件名,value 作为文件内容,创建成一个个的文件。
查看 configMap 信息
查看所有 configMap:
[root@k8s-master01 configmapDir]# kubectl get cm -n default
NAME DATA AGE
cm-by-directory 2 4s
查看 configMap 内容:
[root@k8s-master01 configmapDir]# kubectl describe cm cm-by-directory
Name: cm-by-directory
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
fileOne.properties:
----
name=tom
agr=24
gender=man
fileTwo.properties:
----
color=red
number=10
Events: <none>
查看 configMap yaml 内容:
[root@k8s-master01 configmapDir]# kubectl get cm cm-by-directory -o yaml
apiVersion: v1
data:
fileOne.properties: |
name=tom
agr=24
gender=man
fileTwo.properties: |
color=red
number=10
kind: ConfigMap
metadata:
creationTimestamp: "2020-03-30T03:33:51Z"
name: cm-by-directory
namespace: default
resourceVersion: "204260"
selfLink: /api/v1/namespaces/default/configmaps/cm-by-directory
uid: 2ce09007-f6fa-42cc-8f4f-7fc115034b6d
-- end --