ConfigMap创建方式
1.以目录形式创建ConfigMap
[root@k8s-master01 cm]# ls
aaa bbb
[root@k8s-master01 cm]# cat aaa
host=127.0.0.1
port=3308
[root@k8s-master01 cm]# cat bbb
host=127.0.0.1
port=65535
[root@k8s-master01 cm]# kubectl create configmap cm-1 --from-file .
configmap/cm-1 created
[root@k8s-master01 cm]# kubectl describe configmap cm-1
Name: cm-1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
aaa:
----
host=127.0.0.1
port=3308
bbb:
----
host=127.0.0.1
port=65535
Events: <none>
--from-file
指定在目录下的所有文件都会被用在ConfigMap里面创建一个键值对,键的名字就是文件名,值就是文件的内容
2.使用文件创建ConfigMap
[root@k8s-master01 cm]# kubectl create configmap cm-2 --from-file ./aaa
configmap/cm-2 created
[root@k8s-master01 cm]# kubectl create configmap cm-3 --from-file ./aaa --from-file=./bbb
configmap/cm-3 created
--from-file
这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的
3.使用键值创建(使用文字值创建,利用--from-literal
参数传递配置信息,该参数可以使用多次,格式如下)
[root@k8s-master01 cm]# kubectl create configmap cm-4 --from-literal=host.allow=127 --from-literal=host.deny=128
configmap/cm-4 created
[root@k8s-master01 cm]# kubectl describe configmap cm-4
Name: cm-4
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
host.deny:
----
128
host.allow:
----
127
Events: <none>
直接写yaml文件创建ConfigMap
[root@k8s-master01 cm]# cat ccc.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: cm-5
namespace: default
data:
data.1: hello
data.2: world
config: | #会被保存为一个文件(通俗易懂就是config是文件名,下面的是内容)
property.1=value-1
property.2=value-2
property.3=value-3
[root@k8s-master01 cm]# kubectl describe configmap cm-5
Name: cm-5
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>
Pod中ConfigMap应用
1.设置环境变量的值
[root@k8s-master01 haimaxueyuan]# kubectl describe configmap cm-1
Name: cm-1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
aaa:
----
host=127.0.0.1
port=3308
bbb:
----
host=127.0.0.1
port=65535
Events: <none>
[root@k8s-master01 haimaxueyuan]# kubectl describe configmap cm-4
Name: cm-4
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
host.allow:
----
127
host.deny:
----
128
Events: <none>
[root@k8s-master01 cm]# cat cm1.yaml
apiVersion: v1
kind: Pod
metadata:
name: testcm1-pod
spec:
containers:
- name: testcm1
image: busybox
command: [ "/bin/sh", "-c", "env" ]
env: ##声明变量
- name: DB_HOST
valueFrom: ##值从何而来
configMapKeyRef: ## 指定configmap来源
name: cm-4
key: host.allow
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-4
key: host.deny
envFrom: ##引用变量到容器
- configMapRef:
name: cm-1
[root@k8s-master01 cm]# kubectl logs testcm1-pod
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=testcm1-pod
DB_PORT=128
SHLVL=1
HELLO_WORLD_SERVICE_HOST=10.104.245.92
HOME=/root
aaa=host=127.0.0.1
port=3308
HELLO_WORLD_SERVICE_PORT=80
HELLO_WORLD_PORT=tcp://10.104.245.92:80
HELLO_WORLD_PORT_80_TCP_ADDR=10.104.245.92
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HELLO_WORLD_PORT_80_TCP_PORT=80
KUBERNETES_PORT_443_TCP_PORT=443
HELLO_WORLD_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PROTO=tcp
bbb=host=127.0.0.1
port=65535
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
HELLO_WORLD_PORT_80_TCP=tcp://10.104.245.92:80
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
DB_HOST=127
2.设置命令行参数
[root@k8s-master01 haimaxueyuan]# kubectl describe configmap cm-4
Name: cm-4
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
host.deny:
----
128
host.allow:
----
127
Events: <none>
[root@k8s-master01 cm]# cat cm2.yaml
apiVersion: v1
kind: Pod
metadata:
name: testcm2-pod
spec:
containers:
- name: testcm2
image: busybox
command: [ "/bin/sh", "-c", "echo $(DB_HOST) $(DB_PORT)" ]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: cm-4
key: host.allow
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-4
key: host.deny
[root@k8s-master01 cm]# kubectl logs testcm2-pod
127 128
3.数据卷使用
另外一种是非常常见的使用ConfigMap 的方式:通过数据卷使用,在数据卷里面使用ConfigMap,就
是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容:
[root@k8s-master01 cm]# kubectl get configmaps cm-1 -o yaml
apiVersion: v1
data:
aaa: |
host=127.0.0.1
port=3308
bbb: |
host=127.0.0.1
port=65535
kind: ConfigMap
metadata:
creationTimestamp: "2020-06-24T06:03:25Z"
name: cm-1
namespace: default
resourceVersion: "2027726"
selfLink: /api/v1/namespaces/default/configmaps/cm-1
uid: 5865a79d-5309-480a-a67f-4bb73cdf966e
[root@k8s-master01 cm]# kubectl logs testcm3-pod
host=127.0.0.1
port=3308
[root@k8s-master01 cm]# cat cm3.yaml
apiVersion: v1
kind: Pod
metadata:
name: testcm3-pod
spec:
containers:
- name: testcm3
image: busybox
command: [ "/bin/sh", "-c", "cat /etc/config/aaa" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-1
[root@k8s-master01 cm]# kubectl logs testcm3-pod
host=127.0.0.1
port=3308
当然我们也可以在 ConfigMap 值被映射的数据卷⾥去控制路径,如下 Pod 定义:
[root@k8s-master01 cm]# kubectl get configmaps cm-1 -o yaml
apiVersion: v1
data:
aaa: |
host=127.0.0.1
port=3308
bbb: |
host=127.0.0.1
port=65535
kind: ConfigMap
metadata:
creationTimestamp: "2020-06-24T06:03:25Z"
name: cm-1
namespace: default
resourceVersion: "2027726"
selfLink: /api/v1/namespaces/default/configmaps/cm-1
uid: 5865a79d-5309-480a-a67f-4bb73cdf966e
[root@k8s-master01 cm]# cat cm4.yaml
apiVersion: v1
kind: Pod
metadata:
name: testcm4-pod
spec:
containers:
- name: testcm4
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/path/to/bbb" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-1
items: ##yaml文件中挂载点为/etc/config,而command字段执行是另一个路径,与挂载目录不匹配,因此引入items
##items存在的意义就是映射路径关系,path字段映射为path/to/bbb,那么command字段的内容就可以访问到了
- key: bbb
path: path/to/bbb
[root@k8s-master01 cm]# kubectl logs testcm4-pod
host=127.0.0.1
port=65535
另外需要注意的是,当 ConfigMap 以数据卷的形式挂载进 Pod 的时,这时更新 ConfigMap (或删掉重 建 ConfigMap ), Pod 内挂载的配置信息会热更新。