从Docker Compose迁移到Kubernetes,将配置存储在持久卷上



我是Kubernetes的新手,但我已经使用Docker和Docker Compose很长时间了。我试图找到更多关于Kubernetes与Docker Compose相比如何处理共享/只读配置文件的信息。

在我的docker-compose.yaml文件中,我使用绑定挂载共享特定的配置文件到我的容器,类似于:

...
elasticsearch:
image: elasticsearch:7.3.2
environment:
- discovery.type=single-node
networks: 
mycoolapp:
aliases: 
- elasticsearch
ports:
- "9200:9200"
- "9300:9300"
volumes:
- elasticdata:/usr/share/elasticsearch/data
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
...

我一直在阅读Persistent volume,我相信这是我所需要的,但是,我对一些问题的理解仍然不是100%清楚。

  1. 我使用azureFile作为我的卷类型,我已经将我的配置复制到文件共享中。如何将文件共享的子文件夹挂载到容器中?mountPath只出现在volumeMounts中,我找不到相应的位置在volume的哪个位置
  2. 如何共享单个文件?
  3. 我如何使我上面共享的单个文件只读?

Kubernetes ConfigMap对象在这里会派上用场。

ConfigMap是一个API对象,用于在键值对中存储非机密数据。

的例子:

apiVersion: v1
kind: ConfigMap
metadata:
name: elastic-demo
data:
# property-like keys; each key maps to a simple value; available as env var
properties_file_name: "database.properties"
# file-like keys
database.properties: |
data1=value1
data2=value2      

您可以以只读模式挂载上面的ConfigMap卷。

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: elasticsearch
volumeMounts:
- name: elastic-volume
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: elastic-volume
configMap:
name: elastic-demo

正如@Pulak所说,您可以使用configmap。我看到您要将包含100个文件的文件夹导入到configmap中。我认为,你可以用另一种方法。这是使用zip/jar文件作为ConfigMap支持的二进制文件,所以在挂载后,它可以解压缩到容器内所需的路径。

例如,在文件夹中有如下结构:

.
├── test1.html
├── test2.css
├── test3.xml
└── testN.html

现在你可以把它们做成jar/zip,并且可以通过kubectl create configmap example --from-file=./创建一个configmap

另一件事是configmap大小(以MiB为单位)不应该太大。所以,如果你真的有很多东西,可以使用kubernetes的典型卷。