部署应用,我们经常碰到的问题是配置文件的内容会变化,我们可以通过 configMap 来保存配置文件的内容。比如:一个 spring boot 的 Java 应用,做了一个镜像,jar 包是放在容器的 /opt 目录里,程序启动命令为:
java -jar mock-app-1.0.jar
我们知道,如果在 /opt 这个目录下放上一个 application.properties 文件的话, 这个程序就会使用这个文件做为程序的配置文件。我们要做的就是把 application.properties 文件里面的内容放到 configMap 里,然后在容器的配置里挂载上一个目录。这个挂载的目录对应到 configMap 就可以实现了配置外置化了。
apiVersion: v1
kind: ConfigMap
metadata:
# 设置这个 configMap 的名称
name: mock-app-conf
data:
application.properties: |
db.user=root
db.password=123456
db.driver=xxxx
another.conf: |
aaa=bbb
上面的内容保存为: configmap.yaml (注:这里的 another.conf 只是演示一个 configMap 可以包含多个配置文件。) 运行下面的命令可以创建这个 configMap
kubectl apply -f configmap.yaml
下面再创建我们要部署的程序的模板(mock-app.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: mock-app-deploy
labels:
app: mock-app
spec:
replicas: 1
selector:
matchLabels:
app: mock-app
template:
metadata:
labels:
app: mock-app
spec:
containers:
- name: mock-app
image: mock/app:1.0
volumeMounts:
# mountPath 要指定到文件,不是目录
- mountPath: "/opt/application.properties"
# subPath 一定要加,要不然容器启动后,会发现 application.properties 是一个目录。
subPath: application.properties
name: mock-app-volume
volumes:
- name: mock-app-volume
configMap:
# 这里的 name 是上面定义的 confimap 的 name
name: mock-app-conf
items:
# 这里的 key 对应的是上面定义的 configMap 中的 data 里面的某个值。下面的 key 的值写成 another.conf 的话,
# application.properties 文件的内容就会变成 another.conf 对应的内容
- key: application.properties
path: application.properties
注: 以上举例是 jar 包和配置文件是放在同一个目录下面(/opt) 下面,如果 application.properties 是放在 /opt/config 下面的话,则mountPath 可以指定为 /opt/config,然后再去掉 subPath,也是可以的。
下面是配置多个配置文件的示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mock-app-deploy
labels:
app: mock-app
spec:
replicas: 1
selector:
matchLabels:
app: mock-app
template:
metadata:
labels:
app: mock-app
spec:
containers:
- name: mock-app
image: mock/app:1.0
volumeMounts:
# mountPath 这里指定的是目录
- mountPath: "/opt/config"
name: mock-app-volume
volumes:
- name: mock-app-volume
configMap:
# 这里的 name 是上面定义的 confimap 的 name
name: mock-app-conf
items:
- key: application.properties
path: application.properties
- key: another.conf # 对应的是 ConfigMap 里 data 的某个值
path: cba.conf # 把 another.conf 的内容作为容器中 /opt/config/cba.conf 这个文件的内容