【问题标题】:Moving from Docker Compose to Kubernetes, storing configuration on persistent volumes从 Docker Compose 迁移到 Kubernetes,将配置存储在持久卷上
【发布时间】:2021-03-07 13:30:33
【问题描述】:

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

在我的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 对象,非常适合注入配置文件和环境设置。我不会尝试在这里使用 PersistentVolume。

标签: kubernetes docker-compose azure-aks


【解决方案1】:

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

【讨论】:

  • 对于properties_file_name,我可以添加任何文件类型还是必须是字符串文字/键值对?它可以是 .json 文件,甚至是 .bin 文件吗?另外,如果我有一个包含 100 多个文件的文件夹结构,有没有办法导入所有内容并维护文件路径?
  • 'properties_file_name' 是这里的键值对。您可以使用任何键值对,文件可以是 .json/.bin 或任何类型。
  • 文件夹呢?有没有办法自动将 100 个文件导入 configMap?还是我应该把它们全部塞进去?
  • ConfigMap 中没有添加文件夹或目录的选项。您必须在 ConfigMap 中单独将它们全部卡住。
  • 我应该将每个文件包含在单独的配置映射中吗?或者我应该在一个单独的配置图中包含每个文件夹的文件价值?感谢您提供到目前为止的信息!我想这就是我要找的
【解决方案2】:

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

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

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

现在您可以将它们制作成 jar/zip 并可以通过 kubectl create configmap example --from-file=./ 创建配置映射

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

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2018-11-15
    • 2019-08-11
    • 2021-12-28
    • 2019-06-02
    • 2018-07-26
    相关资源
    最近更新 更多