应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。K8S提供了一种统一的应用配置管理方案ConfigMap(环境变量)。
创建ConfigMap:
用yaml的方式创建:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
port: 80
server_name: wl.com
#值可以用于存储配置文件
用kubectl创建ConfigMap:
kubectl crate configmap nginx-config --from-literal=port=80 --from-literal=server_name=wl.com
kubectl crate configmap nginx-www--from-file=nginx.conf=./www.conf
#文件内容会成为环境变量的值;--from-file=./www.conf环境变量名称为文件名称
Pod使用ConfigMap:
无volume:
apiVesion: v1
kind: Pod
metadata:
name: www
namespace: default
spec:
containers:
- name: nginx
image: wl/nginx:v1.12
env:
- name: PORT
valueFrmo:
configMapKeyRef:
- name: nginx-config
key: port
#如果需要ConfigMap中全部变量
apiVesion: v1
kind: Pod
metadata:
name: www
namespace: default
spec:
containers:
- name: nginx
image: wl/nginx:v1.12
envFrom:
- configMapRef
name: nginx-config
通过volume挂载ConfigMap:
apiVesion: v1
kind: Pod
metadata:
name: www
namespace: default
spec:
containers:
- name: nginx
image: wl/nginx:v1.12
volumeMounts:
- name: config
mountPath: /data
volumes:
- name: config
configMap:
name: nginx-config
items:
- key: port
path: port
#如果你只想挂载ConfigMap中某个值可以用items字段单独挂载,要全部挂载不用写items字段。
如果你用volume方式挂载ConfigMap,运行时的Pod也能实时获取ConfigMap的更新,不用volume就不能。
secret资源:
secret用于存储比较私密的数据(不安全)
kubectl crate secret generic mysql-root-password --from-literal=pass=root123
#创建secret,在Pod的使用方法和ConfigMap的方法类似只是刚刚字段名称即可。