简单介绍
ConfigMap也是k8s中的一大资源对象,它以键值对的方式预先定义好配置存储,在Pod中就可以使用ConfigMap获取配置到环境变量中,当然它也可以是一个配置文件,通过挂载的方式动态挂载到Pod目录中,实现配置与容器的分离
既然是一个资源对象,可以通过写Yaml指定kind的方式创建。
编写 ConfigMap Yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-base
data:
appVersion: 1.0.0
jdkVersion: "1.8" #不能是number,如果符合number类型就加个引号
env: prod
logDir: /var/data
logLevel: info
1err_config: err #定义一个不合规范的key,看能否使用,貌似现在可以以数字开头了
通过Yaml方式创建
[root@master configMap]# kubectl create -f kube-configMap.yml
configmap/configmap-base created
查看 ConfigMap
[root@master configMap]# kubectl get configmap configmap-base -o yaml
apiVersion: v1
data:
1err_config: err
appVersion: 1.0.0
env: prod
jdkVersion: "1.8"
logDir: /var/data
logLevel: info
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-09T15:19:07Z"
name: configmap-base
namespace: default
resourceVersion: "1082049"
uid: 6470a340-0375-43c1-86fc-0814e218e7f2
查看描述
如果创建失败的配置会在 Events 有提示。
[root@master configMap]# kubectl describe configmap configmap-base
Name: configmap-base
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
1err_config:
----
err
appVersion:
----
1.0.0
env:
----
prod
jdkVersion:
----
1.8
logDir:
----
/var/data
logLevel:
----
info
BinaryData
====
Events: <none>
在Pod中使用ConfigMap
ValueFrom方式
这种方式每次只能将一个key加载到环境变量,需要多个key可以多写几个ValueFrom
编写Pod Yaml
kube-configMap-valueFrom.yml
apiVersion: v1
kind: Pod
metadata:
name: configmap-valuefrom
spec:
containers:
- name: configmap-base-busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","env"]
env:
- name: APP_VERSION
valueFrom:
configMapKeyRef:
name: configmap-base
key: appVersion
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: configmap-base
key: logLevel
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: configmap-base
key: logLevel
restartPolicy: Never
创建Pod
[root@master configMap]# kubectl create -f kube-configMap-valueFrom.yml
pod/configmap-valuefrom created
Pod 使用 /bin/sh -c env 打印了环境变量,查看Pod 的日志
[root@master configMap]# kubectl logs configmap-valuefrom
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
LOG_LEVEL=info
HOSTNAME=configmap-valuefrom
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
ERR_CONFIG=err
APP_VERSION=1.0.0
LOG_LEVEL,APP_VERSION,ERR_CONFIG均已获取到
但是这种方式挺麻烦的,用一个配置一个,如果有100个都需要使用那就显得有点配置多余。
1.6版本以后引入了envFrom,可以加载整个configmap到环境变量中
envfrom
编写Pod yaml,使用envFrom直接将 configmap-base 所有内容加载至环境变量
apiVersion: v1
kind: Pod
metadata:
name: configmap-envfrom
spec:
containers:
- name: configmap-base-busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","env"]
envFrom:
- configMapRef:
name: configmap-base
restartPolicy: Never
查看Pod的日志信息,
[root@master configMap]# kubectl logs configmap-envfrom
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
appVersion=1.0.0
HOSTNAME=configmap-envfrom
SHLVL=1
HOME=/root
logLevel=info
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
jdkVersion=1.8
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
env=prod
logDir=/var/data
1err_config=err
可以看到,所有的配置都在环境变量中,这种方式方便了不少,实际中大部分情况都会使用这种方式。
通过命令行方式创建ConfigMap
from-literal
在命令行直接指定key-value
[root@master configMap]# kubectl create configmap configmap-literal --from-literal=role=slave --from-literal=mode=cluster
configmap/configmap-literal created
查看创建好的configmap详细信息,最终还是保存在了 data 下面
[root@master configMap]# kubectl get configmap configmap-literal -o yaml
apiVersion: v1
data:
mode: cluster
role: slave
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-07T18:25:46Z"
name: configmap-literal
namespace: default
resourceVersion: "855425"
uid: 9d06ca90-e5a4-42c6-a5fa-2bb42b101f0a
–from-file
通过指定一个目录或者文件的方式创建ConfigMap
如果是文件,以文件名作为key,文件的所有内容作为value
如果是目录,目录下所有文件都会加载,每个文件分别以文件名key,内容为value
在 /root/k8s/configMap/dir 下main创建两个文件
index.html
cat <<EOF > /root/k8s/configMap/dir/index.html
welcome to use configMap
I'm index111
EOF
index2.html
cat <<EOF > /root/k8s/configMap/dir/index2.html
welcome to use configMap
I'm index222
EOF
通过 --from-file 指定 /root/k8s/configMap/dir 目录
[root@master dir]# kubectl create configmap configmap-file --from-file=/root/k8s/configMap/dir
configmap/configmap-file created
查看configmap详细信息,发现data中 多了两个key,两个key的名字就是该目录下的两个文件名,value就是该文件的内容
[root@master dir]# kubectl get configmap configmap-file -o yaml
apiVersion: v1
data:
index.html: |
welcome to use configMap
I'm index111
index2.html: |
welcome to use configMap
I'm index222
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-09T19:29:24Z"
name: configmap-file
namespace: default
resourceVersion: "860848"
uid: d5dce3f2-882e-4764-b038-ced95c966b40
volumeMount
配置挂载
在 volumes 中也可以使用 configMap,通过指定 configmap中的key 并且将value挂载到某个目录中。
编写Pod Yaml
kube-configMap-volumeMount.yml
apiVersion: v1
kind: Pod
metadata:
name: configmap-volumemount
spec:
containers:
- name: configmap-volumemount-nginx
image: nginx
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
imagePullPolicy: IfNotPresent
volumeMounts:
- name: index
mountPath: /usr/share/nginx/html #nginx的index页面访问目录
volumes:
- name: index
configMap:
name: configmap-file
items:
- key: index.html #configmap中的key
path: index.html #挂载后的文件名
- key: index2.html
path: index2.html
创建
[root@master configMap]# kubectl create -f kube-configMap-volumeMount.yml
pod/configmap-volumemount created
由于将文件挂载到了 nginx 的 /usr/share/nginx/html目录,如果成功挂载,应该是可以访问到。
直接访问容器
[root@master configMap]# kubectl exec -it configmap-volumemount -- curl 127.0.0.1
welcome to use configMap
I'm index111
[root@master configMap]# kubectl exec -it configmap-volumemount -- curl 127.0.0.1/index2.html
welcome to use configMap
I'm index222
index.html与index2.html都能正确访问的,并且内容正确。
到这就简单介绍完了ConfigMap,大家如果没有分布式配置中心,又需要配置与容器分离,可以尝试这种方式。
欢迎关注,学习不迷路!