从 Docker Compose 迁移到 Kubernetes,将配置存储在持久卷上
Moving from Docker Compose to Kubernetes, storing configuration on persistent volumes
我是 Kubernetes 的新手,但我已经使用 Docker 和 Docker Compose 很长时间了。与 Docker Compose 相比,我正在尝试查找有关 Kubernetes 如何仅处理 shared/read 配置文件的更多信息。
在我的 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 Volumes,我相信这是我需要的,但是,我的理解在一些问题上仍然不是 100% 清楚。
- 我使用
azureFile
作为我的卷类型,并且我已将我的配置复制到文件共享中。如何将文件共享的子文件夹挂载到我的容器中? mountPath
只出现在volumeMounts
中,找不到卷内对应的位置。
- 如何只共享一个文件?
- 如何将上面共享的单个文件设为只读?
Kubernetes ConfigMap 对象在这里会派上用场。
A ConfigMap is an API object used to store non-confidential data in key-value pairs.
示例:
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 个文件的文件夹导入到配置映射中。我的想法是,你可以用另一种方式做到这一点。即使用 zip/jar 文件作为 ConfigMap 支持的二进制文件,所以挂载后可以解压到容器内你想要的路径。
例如,文件夹中的结构如下:
.
├── test1.html
├── test2.css
├── test3.xml
└── testN.html
现在您可以制作它们 jar/zip 并且可以通过 kubectl create configmap example --from-file=./
创建一个 configmap
另一件事是 configmap 大小(以 MiB 为单位)不应该很大。所以,如果你真的有很多东西不能使用 kubernetes 典型卷。
我是 Kubernetes 的新手,但我已经使用 Docker 和 Docker Compose 很长时间了。与 Docker Compose 相比,我正在尝试查找有关 Kubernetes 如何仅处理 shared/read 配置文件的更多信息。
在我的 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 Volumes,我相信这是我需要的,但是,我的理解在一些问题上仍然不是 100% 清楚。
- 我使用
azureFile
作为我的卷类型,并且我已将我的配置复制到文件共享中。如何将文件共享的子文件夹挂载到我的容器中?mountPath
只出现在volumeMounts
中,找不到卷内对应的位置。 - 如何只共享一个文件?
- 如何将上面共享的单个文件设为只读?
Kubernetes ConfigMap 对象在这里会派上用场。
A ConfigMap is an API object used to store non-confidential data in key-value pairs.
示例:
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 个文件的文件夹导入到配置映射中。我的想法是,你可以用另一种方式做到这一点。即使用 zip/jar 文件作为 ConfigMap 支持的二进制文件,所以挂载后可以解压到容器内你想要的路径。
例如,文件夹中的结构如下:
.
├── test1.html
├── test2.css
├── test3.xml
└── testN.html
现在您可以制作它们 jar/zip 并且可以通过 kubectl create configmap example --from-file=./
另一件事是 configmap 大小(以 MiB 为单位)不应该很大。所以,如果你真的有很多东西不能使用 kubernetes 典型卷。