如何最好地使用 helm charts 在 Kubernetes 的卷上保存文件?

Chi*_*lax 8 kubernetes docker-volume kubernetes-helm

计划是将我的 dockerized 应用程序移至 Kubernetes。

docker 容器使用几个文件 - 我曾经通过在 docker-compose 文件中指定将它们挂载在 docker 卷上:

volumes:
      - ./license.dat:/etc/sys0/license.dat
      - ./config.json:/etc/sys0/config.json
Run Code Online (Sandbox Code Playgroud)

对于不同的环境,配置文件会有所不同,许可证文件也会相同。

如何在 helm 模板文件 (yaml) 中定义它以便它可用于正在运行的应用程序?

通常,最好的做法是什么?是否也可以在 values.yaml 中定义配置值并且 config.json 文件可以获得它?

Rya*_*son 11

由于您正在处理 json,因此一个很好的例子可能是官方的 stable/centrifugo chart。它定义了一个包含 config.json 文件的 ConfigMap:

data:
  config.json: |-
{{ toJson .Values.config| indent 4 }}
Run Code Online (Sandbox Code Playgroud)

因此,它config从 values.yaml 中获取一个部分,并使用 toJson 函数将其转换为 json。配置可以是您想要在该 yaml 中定义的任何内容 - 图表具有:

config:
  web: true
  namespaces:
  - name: public
    anonymous: true
    publish: true
...
Run Code Online (Sandbox Code Playgroud)

在 deployment.yaml 中,它从 configmap 创建一个卷

      volumes:
      - name: {{ template "centrifugo.fullname" . }}-config
        configMap:
          name: {{ template "centrifugo.fullname" . }}-config
Run Code Online (Sandbox Code Playgroud)

请注意,{{ template "centrifugo.fullname" . }}-config 匹配 ConfigMap 的名称

并将其挂载到部署的 pod/s 中

        volumeMounts:
        - name: "{{ template "centrifugo.fullname" . }}-config"
          mountPath: "/centrifugo"
          readOnly: true
Run Code Online (Sandbox Code Playgroud)

这种方法可以让您从 values.yaml 填充 json 配置文件,以便您可以通过为每个 env 提供自定义值文件来覆盖图表中的默认值,从而为不同的环境设置不同的值。

要处理 license.dat,您可以向 ConfigMap 添加额外的条目以定义附加文件,但嵌入了静态内容。由于这是一个许可证,您可能希望将 ConfigMap 切换为 Secret,这是将定义中的 Secret 一词替换为 ConfigMap 的简单更改。不过你可以先用 ConfigMap 试试。