传统配置管理模式
云原生要素-配置分离
ep:
使用nginx.conf配置文件创建一个configmap资源,在创建nginx的pod资源时,通过 volume将configmap中的配置文件挂载到容器对应的目录,即可实现配置分离管理,当配置修改后,程序通过热加载或reload,即可获取到最新的配置文件,不必每个服务都进行更新
ConfigMaps|Kubernetes
eg:创建ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# property-like keys; each key maps to a simple value
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# file-like keys
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
eg:Pod使用ConfigMap
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env: #环境变量配置
# Define the environment variable
- name: PLAYER_INITIAL_LIVES # Notice that the case is different here 将上面player_initial_lives的值赋值给变量PLAYER_INITIAL_LIVES
# from the key name in the ConfigMap.
valueFrom:
configMapKeyRef:
name: game-demo # The ConfigMap this value comes from.
key: player_initial_lives # The key to fetch.
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
volumeMounts: # 这里配置volumes的挂载
- name: config # 下面volumes的名称
mountPath: "/config" # 路径
readOnly: true
volumes:
# You set volumes at the Pod level, then mount them into containers inside that Pod
- name: config
configMap:
# Provide the name of the ConfigMap you want to mount.
name: game-demo #对应创建的ConfigMap名称
# An array of keys from the ConfigMap to create as files
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
创建configmap的几种方法
1、基于文件夹创建configmap【目录下有多个配置文件,以目录为单位一起创建】
kubectl create cm cmfromdir --from-file=conf/
2、基于配置文件创建configmap【目录下有多个配置文件,以其中一个配置文件来创建】
kubectl create cm cmfromfile --from-file=conf/redis.conf
3、基于配置文件创建自定义名称的configmap【很少使用】
kubectl create cm cmspecialname --from-file=my-redis.conf=conf/redis.conf
4、基于环境变量文件创建configmap
kubectl create cm gameenvcm --from-env-file=conf/game.conf
5、也可以直接在命令中设置环境变量来创建configmap
kubectl create cm envfromliteral --from-literal=level=info --from-literal=password=redis123
6、基于yaml文件来创建configmap
kubectl create f game-demo.yaml
Pod中如何使用configmap
1、当我们要使用gameenvcm这个configmap中的live的值时,我们需要在pod中进行如下配置
....
spec:
containers:
- image: nginx:1.15.1
name: nginx
env:
- name: LIVE # pod中定义的变量名
valueFrom:
configMapKeyRef:
name: gameenvcm # configmap的名字
key: live # configmap中的key值
- name: ZW_TEST_ENV # 手动指定环境变量
value: zw_test_env # 手动指定的ZW_TEST_ENV变量的值为zw_test_env
....
当创建pod之后,就可以查看pod中的环境变量里 LIVE 这个变量的值和我们在configmap中配置的值一致,
2、当我们要一次性导入更多的环境变量时又该怎么做呢?---------> envFrom
....
spec:
spec:
containers:
- image: nginx:1.15.1
name: nginx
envFrom:
- configMapRef:
name: cmenvfile
#env:
# - name: LIVE
# valueFrom:
# configMapKeyRef:
# name: gameenvcm
# key: live
# - name: ZW_TEST_ENV
# value: zw_test_env
....
3、以文件形式挂载配置文件
....
spec:
containers:
- image: nginx:1.15.1
name: nginx-mount
volumeMounts:
- name: zw-volume # 与下面volumes中的名称一致,如果有多个,就是要使用的那个volume的名字
mountPath: /etc/config # 挂载到pod中的路径
volumes:
- name: zw-volume # volumes的名称
configMap:
name: zwvolume # 集群中已经创建的ConfigMap的名字
....
如果在configMap中再配置items,则可以给挂载的pod中的配置文件进行重命名操作
...
spec:
containers:
- image: nginx:1.15.1
name: nginx-mount
volumeMounts:
- name: zw-volume
mountPath: /etc/config
volumes:
- name: zw-volume
configMap:
name: zwvolume
items:
- key: game2.conf # zwvolume中的key值
path: game2.conf.bak # 挂载到pod中后,新取的名字
...
修改挂载文件的权限如何做呢?在configMap中配置defaultMode项
...
spec:
containers:
- image: nginx:1.15.1
name: nginx-mount
volumeMounts:
- name: zw-volume # 与下面volumes中的名称一致,如果有多个,就是要使用的那个volume的名字
mountPath: /etc/config # 挂载到pod中的路径
volumes:
- name: zw-volume # volumes的名称
configMap:
name: zwvolume # 集群中已经创建的ConfigMap的名字
items:
- key: game2.conf
path: game2.conf.bak
defaultMode: 0644 # 设置文件权限为644
...
如果有多个挂载文件,也可以单独给挂载文件设置mode
...
spec:
containers:
- image: nginx:1.15.1
name: nginx-mount
volumeMounts:
- name: zw-volume # 与下面volumes中的名称一致,如果有多个,就是要使用的那个volume的名字
mountPath: /etc/config # 挂载到pod中的路径
volumes:
- name: zw-volume # volumes的名称
configMap:
name: zwvolume # 集群中已经创建的ConfigMap的名字
items:
- key: game2.conf
path: game2.conf.bak
- key: game2.conf
path: game2.conf.bak2
mode: 0755 # 也可以给key单独配置权限,这个权限优先于defaultMode的配置
defaultMode: 0644 # 设置文件权限为644
...