像在 docker 中一样在 Helm 中公开卷

Expose volumes in Helm just like in docker

我正在创建一个使用 helm(v3.3.0) + k3s 的应用程序。容器中的程序使用不同的配置文件。到目前为止,只有几个配置文件(我在构建图像之前手动添加的)但我想增加在容器为 运行 时动态添加它们的可能性,并且一旦 container/pod 死了。在 docker 中,我会通过公开这样的文件夹来做到这一点:

docker run [image] -v /host/path:/container/path

是否有 helm 的等效项? 如果不是,您建议如何在不停止使用 helm/k3s 的情况下解决此问题?

在 Kubernetes 中(Helm 只是它的一个工具)你需要做两件事来在容器内挂载主机路径:

spec:
  volumes:
  # 1. Declare a 'hostPath' volume under pod's 'volumes' key:
  - name: name-me
    hostPath:
      path: /path/on/host
  containers:
  - name: foo
    image: bar
    # 2. Mount the declared volume inside container using volume name
    volumeMounts:
    - name: name-me
      mountPath: /path/in/container

Kubernetes 中的许多其他卷类型和示例 documentation

Kubernetes 有一个专门用于保存配置文件的构造,ConfigMaps. Helm in turn has support for Accessing Files Inside Templates 可以帮助您将它们复制到 ConfigMap 对象中。此处的最小设置如下所示:

# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  config.ini: |
{{ .Files.Get "config.ini" | indent 4 }}
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment:
metadata: { ... }
spec:
  template:
    spec:
      volumes:
        - name: config-data
          configMap:
            name: my-config  # matches ConfigMap metadata: { name: }
      containers:
        - volumeMounts:
            - name: config-data  # matches volume name: in this file
              mountPath: /container/path

您可以在这里以多种方式使用 Helm 的模板构造:动态构造 ConfigMap 的内容,设置环境变量说明要使用的文件,等等。

不要在此处使用 hostPath 卷。由于 Kubernetes 被设计为集群环境,因此您无法控制给定 pod 运行 在哪个节点上;您必须将这些配置文件复制到集群中的 每个 节点,并在文件更改时尝试更新它们。这是一个巨大的维护问题,特别是如果您没有对节点的直接文件系统访问权限。