ConfigMap介绍
configMap在K8S中充当配置中心的角色,用于修改Pod中的配置文件信息且支持动态修改,修改完配置文件后需手动使Pod重载配置文件
在K8S中与configMap功能相同的资源是secret,不同的是configMap是以明文形式保存到ETCD中的,而secret是以密文形式保存到ETCD
configMap的重要作用:
让配置信息与镜像文件解耦,从而增强了应用的可移植性以及应用的可复用性,简单来说一个configMap就是一切应用数据的集合,而这些数据将来可以注入到Pod对象中的容器中所使用。
注入的方式有两种:
第一、直接把configMap当存储卷
第二、使用ENV volumeFrom的方式引用configMap当中所保存进去的数据
在每个configMap中所有的配置信息都保存为键值格式比如键名为name键值为张三 name=张三 值是没有限制的所以可以保存相当长的一些配置文件
值可以保存为一些参数,也可以保存为一些完整的配置文件都是没有问题的,例如nginx为键,nginx的配置文件为值的信息,同样我们可以在Pod启动时从configMap键上获取相关的数据项
创建configMap
建议configMap用CLI的方式来创建,这样会简单很多
例如:
kubectl create configmap NAME --from-file=PATH/File
此方式直接指定文件内容为值文件名为键的方式。例如,当前文件有个名为txt而内容是123的文件执行完以上命令,键名就为txt,值就是123 txt=123
举例现在有一个在当前目录名为www.conf的配置文件具体配置信息如下:
server {
server_name myapp.com
listen 80;
root /data/web/html/;
}
以文件内容方式创建configMap:
kubectl create configmap nginx-www --from-file=./www.conf
如果不写出键名是什么,系统会自动把文件名作为键名,文件内容作为键值来创建configMap
查询configMap是否创建完成:
[root@master configMap]# kubectl get cm
NAME DATA AGE
nginx-config 2 13m
nginx-www 1 6s
验证刚创建的configMap内容:
[root@master configMap]# kubectl describe cm nginx-www
Name: nginx-www
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
www.conf:
----
server {
server_name myapp.com
listen 80;
root /data/web/html/;
}
Events: <none>
以上内容以www.conf来作为名字且内容为键值,www.conf和文件名相对应
当然也可以直接指明键名是什么值是什么:
kubectl create configmap NAME --from-literal=KEY1=CONFIG1
举例:
kubectl create cm nginx-config --from-literal=nginx_port=8080 --from-literal=server_name=myapp.com
以上创建了一个名为nginx-config的configMap文件,其中存在两个键值分别是nginx_port=8080和server_name=myapp.com
验证刚创建的configMap内容:
[root@master configMap]# kubectl describe cm nginx-config
Name: nginx-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
server_name:
----
myapp.com
nginx_port:
----
8080
Events: <none>
通过环境变量来传递configMap中的配置信息:
[root@master configMap]# vim pod-configMap.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-1
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
env:
- name: NGINX_SERVER_PORT #此处为传递到容器中的环境变量名字
valueFrom:
configMapKeyRef:
name: nginx-config #此处为configMap的名字
key: nginx_port #此处为configMap中的键值名
- name: NGINX_SERVER_NAME #此处为传递到容器中的环境变量名字
valueFrom:
configMapKeyRef:
name: nginx-config #此处为configMap的名字
key: server_name #此处为传递到容器中的环境变量名字
configMap上面是已经创建的有的因此在上方示例直接引用,通常也是要先创建configMap后引用
以上Pod创建完成后进入Pod中查看环境变量信息是否有NGINX_SERVER_PORT=8080和NGINX_SERVER_NAME=myapp.com。
验证环境变量传递configmap信息:
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
KUBERNETES_SERVICE_PORT=443
MYAPP_SERVICE_PORT_HTTP=80
KUBERNETES_PORT=tcp://10.1.0.1:443
TOMCAT_PORT_8080_TCP=tcp://10.1.155.239:8080
TOMCAT_PORT_8009_TCP=tcp://10.1.155.239:8009
MYAPP_SVC_PORT_80_TCP_PORT=80
HOSTNAME=pod-cm-1
SHLVL=1
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
HOME=/root
MYAPP_SERVICE_HOST=10.1.80.253
NGINX_SERVER_PORT=8080
NGINX_SERVER_NAME=myapp.com
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
MYAPP_PORT=tcp://10.1.80.253:80
MYAPP_SERVICE_PORT=80
TERM=xterm
NGINX_VERSION=1.12.2
KUBERNETES_PORT_443_TCP_ADDR=10.1.0.1
MYAPP_PORT_80_TCP_ADDR=10.1.80.253
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
TOMCAT_SERVICE_PORT_HTTP=8080
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYAPP_PORT_80_TCP_PORT=80
MYAPP_PORT_80_TCP_PROTO=tcp
MYAPP_SVC_SERVICE_HOST=10.98.57.156
TOMCAT_PORT_8080_TCP_ADDR=10.1.155.239
TOMCAT_SERVICE_HOST=10.1.155.239
TOMCAT_PORT_8009_TCP_ADDR=10.1.155.239
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.1.0.1:443
TOMCAT_PORT_8080_TCP_PORT=8080
PWD=/
TOMCAT_PORT_8080_TCP_PROTO=tcp
MYAPP_PORT_80_TCP=tcp://10.1.80.253:80
TOMCAT_PORT_8009_TCP_PORT=8009
KUBERNETES_SERVICE_HOST=10.1.0.1
MYAPP_SVC_SERVICE_PORT=80
MYAPP_SVC_PORT=tcp://10.98.57.156:80
TOMCAT_PORT_8009_TCP_PROTO=tcp
TOMCAT_PORT=tcp://10.1.155.239:8080
TOMCAT_SERVICE_PORT=8080
TOMCAT_SERVICE_PORT_AJP=8009
以上看出是存在NGINX_SERVER_PORT=8080和NGINX_SERVER_NAME=myapp.com的证明环境变量传入成功!
注意:当我们使用环境变量注入时只在Pod启动时生效,更改configmaps时Pod中不生效,缺乏灵活性,通过存储卷的方式获取是可以实时更新的,修改configMap时可以用edit来修改相关信息
使用存储卷来传递configMap中的信息:
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-2
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf #挂载到容器中的名字一般要和volumes中的名字一样
mountPath: /etc/nginx/config.d/ #挂载到容器中的位置信息
readOnly: true
volumes:
- name: nginxconf #存储卷名字
configMap: #存储卷类型
name: nginx-config #事先创建的configMap的名字,因为上方已经创建过了
此存储卷可以动态更改配置文件,意思是说可以直接更改configMap文件更改完成后Pod也会生效,只不过需要一点时间来做同步。
注意注入到Pod中文件显示为浅蓝色,但是其实他就是一个链接文件,可以直接使用cat查看,或者使用都是可以的
举例注入Nginx配置文件:
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-3
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/conf.d/
readOnly: true
volumes:
- name: nginxconf
configMap:
name: nginx-www
此处引用的也是上方事先创建好的configMap文件,其挂在路径换到nginx的默认配置路径下然后创建出配置文件下的网页目录和index.html
注意:此方式可以随时更改Nginx的配置文件,但是要想使配置文件生效需要手动重载下nginx的配置信息,不然不生效
仅登录用户可评论,点击 登录