Kubernetes - subpath指定卷中的一个子目录
我们在部署项目中的一个服务的时候,这个服务的配置相对比较复杂(如下),有没有办法一次性把这些在不同文件夹下的配置文件,都作为本服务的configmaps,统一在启动pod的时候挂载进去呢:
[root test-server]# tree
.
├── @
├── check.sh
├── ci.pid
├── config
│ ├── application.yml
│ ├── logback.xml
│ ├── plugin
│ │ ├── test-s101-v1.yml
│ │ └── test-smk-v1.yml
│ ├── plugin-bak1115
│ │ ├── test-s101-v1.yml
│ │ └── test-smk-v1.yml
│ ├── plugin.bak20190111
│ │ ├── test-s101-v1.yml
│ │ └── test-smk-v1.yml
│ ├── Xxxxxx.json
│ ├── resource
│ │ ├── test-S101-V1.json
│ │ └── TEST-PARK-V1.json
│ ├── resource-bak1115
│ │ ├── test-S101-V1.json
│ │ └── test-SMK-V1.json
│ └── resource.bak20190111
│ ├── test-S101-V1.json
│ └── TEST-PARK-V1.json
├── error_nohup_outpoint20181022.sh
├── kill.sh
├── lib_bak
│ ├── test-server-0.0.1-SNAPSHOT.jar.0808
│ └── test-server-0.0.1-SNAPSHOT.jar.timezone
├── logtest
│ ├── tests101-v1.2018-11-15.0.log
│ └── tests109-v1.2019-06-22.0.log
├── logwww
│ ├── www-cover-v1.2018-11-15.0.log
│ └── www-trash-v1.2019-06-22.0.log
├── logvvv
│ ├── vvv-v2.2019-01-02.0.log
│ └── vvv-v2.2019-06-22.0.log
├── loguuuu
│ ├── uuuu-park-v1.2019-06-03.0.log
│ └── uuuu-park-v1.2019-07-03.0.log
├── logttt
│ ├── ttt.2019-05-07.0.log
│ └── ttt.2019-06-22.0.log
├── logsss
│ ├── sss-detectors-v1.2018-11-19.0.log
│ └── sss-detectors-v1.2019-06-22.0.log
├── logrrr
│ ├── rrr-envir-v1.2018-11-15.0.log
│ └── rrr-envir-v1.2019-06-22.0.log
├── logqqq
│ ├── qqq-park-v1.2018-11-15.0.log
│ └── qqq-park-v1.2019-06-22.0.log
├── logppp
│ ├── ppp-v1.2018-11-15.0.log
│ └── ppp-v1.2019-06-22.0.log
├── logooo
│ ├── ooo-smk-v1.2018-11-15.0.log
│ └── ooo-smk-v1.2019-06-22.0.log
├── logs
│ ├── log-nnn
│ │ ├── nnn-hs90bw-v1.2018-11-15.0.log
│ │ └── nnn-hs90bw-v1.2019-06-22.0.log
│ ├── logmmm
│ │ ├── mmm-hydrant-v1.2019-06-04.0.log
│ │ └── mmm-hydrant-v1.2019-07-03.0.log
│ ├── loglll
│ │ ├── lll-park-v1.2019-04-25.0.log
│ │ └── lll-park-v1.2019-06-22.0.log
│ └── logkkk
│ ├── kkk-cover-v1.2019-01-09.0.log
│ └── kkk-cover-v1.2019-06-22.0.log
├── logjjj
│ ├── jjj-gas-v1.2018-11-15.0.log
│ └── jjj-sos-v1.2019-06-22.0.log
├── logiii
│ ├── iii-cover-v1.2018-11-15.0.log
│ └── iii-cover-v1.2019-06-22.0.log
├── loghhh
│ ├── hhh-lock-v1.2018-11-15.0.log
│ └── hhh-lock-v1.2019-06-22.0.log
├── logggg
│ ├── ggg-park-v1.2018-11-19.0.log
│ └── ggg-uspark-v1.2019-07-02.0.log
├── logfff
│ ├── fff-v1.2018-11-15.0.log
│ └── fff-v1.2019-06-22.0.log
├── logeee
│ ├── eee-elev-v1.2018-12-19.0.log
│ └── eee-elev-v1.2019-07-02.0.log
├── logddd
│ ├── ddd-park-v1.2019-03-24.0.log
│ └── ddd-park-v1.2019-06-22.0.log
├── logccc
│ ├── ccc-press-v1.2018-12-19.0.log
│ └── ccc-press-v1.2019-06-22.0.log
├── logbbb
│ ├── bbb-hydra-v1.2018-11-15.0.log
│ └── bbb-hydra-v1.2019-06-22.0.log
├── logaaa
│ ├── aaa-trash-v1.2018-12-12.0.log
│ └── aaa-trash-v1.2019-06-22.0.log
├── log000
│ ├── 000-park-v1.2018-11-15.0.log
│ └── 000-park-v1.2019-06-22.0.log
├── logTEST
│ ├── TEST-park-v1.2018-12-30.0.log
│ └── TEST-park-v1.2019-06-22.0.log
├── logtest
│ ├── test-gas-v1.2018-11-15.0.log
│ └── test-smk-v1.2019-06-22.0.log
├── nohup.out
├── nohup.out.bak190622
├── plugin
│ ├── jar
│ │ ├── test-S101-V1.jar
│ │ └── test-SMK-V1.jar
│ ├── jar-bak1115
│ │ ├── test-S101-V1.jar
│ │ └── test-SMK-V1.jar
│ ├── js
│ │ ├── common.js
│ │ └── TH_LOCK_SAMPLE_V1.js
│ ├── python
│ └── test-SMK-V1.jar
├── test-adapter.2019-07-03.1.log
├── test-server-0.0.1-SNAPSHOT.jar
├── restart.sh
├── start.sh
└── tmp
├── device_add.sh
├── device_del.sh
├── device_up.sh
├── logback.xml
├── uplinkMsgSender.sh
└── uplinkMsgSenderST.sh
我们还是先看看官方文档中给的解释:
Using subPath
有时,可以在一个pod中,将同一个卷共享,使其有多个用处。volumeMounts.subPath特性可以用来指定卷中的一个子目录,而不是直接使用卷的根目录。
以下是使用单个共享卷的LAMP堆栈(Linux Apache Mysql PHP)的pod的示例。HTML内容映射到其html文件夹,数据库将存储在mysql文件夹中:
apiVersion: v1
kind: Pod
metadata:
name: my-lamp-site
spec:
containers:
- name: mysql
image: mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
- name: php
image: php
volumeMounts:
- mountPath: /var/www/html
name: site-data
subPath: html
volumes:
- name: site-data
persistentVolumeClaim:
claimName: my-lamp-site-data
下面是我们配置的YAML文件:
apiVersion: v1
kind: Service
metadata:
name: TEST-server
labels:
app: TEST-server
spec:
type: NodePort
sessionAffinity: ClientIP
ports:
- port: 11116
name: TEST-server-port
nodePort: 31116
selector:
app: TEST-server
---
apiVersion: v1
kind: ReplicationController
metadata:
name: TEST-server
spec:
replicas: {{.Values.core.replicas}}
selector:
app: TEST-server
template:
metadata:
name: TEST-server
labels:
app: TEST-server
spec:
containers:
- name: TEST-server
image: {{.Values.docker.registry}}/TEST-server:{{.Values.TESTserver.version}}
imagePullPolicy: {{.Values.docker.pullPolicy}}
volumeMounts:
- mountPath: /home/plugin/TEST-server/config/application.yml
name: config-TESTserver
subPath: application.yml
- mountPath: /home/plugin/TEST-server/config/logback.xml
name: config-TESTserver
subPath: logback.xml
- mountPath: /home/plugin/TEST-server/config/xxxx.json
name: config-TESTserver
subPath: Res2Param.json
- mountPath: /home/plugin/TEST-server/config/plugin
name: config-TESTserver-yml
# subPath: *.yml
- mountPath: /home/plugin/TEST-server/config/resource
name: config-TESTserver-json
# subPath: *.json
- mountPath: /home/plugin/TEST-server/plugin/jar
name: config-TESTserver-jar
# subPath: *.jar
volumes:
- name: config-TESTserver
configMap:
name: config-TESTserver-cfg
- name: config-TESTserver-yml
configMap:
name: config-TESTserver-yml
- name: config-TESTserver-json
configMap:
name: config-TESTserver-json
- name: config-TESTserver-jar
configMap:
name: config-TESTserver-jar
我们可以将config文件夹的文件配置到configmaps,但是不能将里面的子目录同时添加进去,需要将里面的子目录同样创建一个configmaps如(config-pluginserver-json),不过这样做的话,是需要创建多个configmaps的,不知道这样做是不是最好的方案;