从 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% 清楚。

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

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 典型卷。