在 Kubernetes 的路径中使用变量

Using a variable within a path in Kubernetes

我有一个带有两个容器的简单 StatefulSet。我只想通过 emptyDir 卷共享路径:

volumes:
 - name: shared-folder
 emptyDir: {}

第一个容器是busybox:

  - image: busybox
    name: test
    command:
      - sleep
      - "3600"
    volumeMounts:
    - mountPath: /cache
      name: shared-folder

第二个容器在 /cache/ 上创建一个文件。我想在 emptyDir 卷中挂载这两个路径,以便能够在容器之间共享文件。

  volumeMounts:
    - name: shared-folder
      mountPath: /cache/$(HOSTNAME)

问题。 第二个容器没有解析 /cache/$(HOSTNAME),所以它没有挂载 /cache/pod-0,而是挂载 /cache/$(HOSTNAME)。我也尝试获取 POD_NAME 并设置为 env 变量,但它也没有解决它。

有人知道是否可以在 mountPath 属性中使用这样的路径(带有环境变量)吗?

我在这里进行了测试,仅仅使用 Kubernetes (k8s < 1.16) 和环境变量是不可能实现你想要的,基本上发生的事情是只有在 pod 被部署并且你是在它发生之前引用它。

您可以使用 Helm 在 values.yaml 文件中使用相同的值定义您的 mounthPath 和 statefulset,然后获取相同的值并将其设置为 mounthPath 字段和 statefulset 名称的值。你可以看看这个here.

编辑: 如果您使用的是 k8s 1.17 或更高版本,请遵循 Matt 的回答。

问题是 YAML 配置文件完全按照写入的方式发布到 Kubernetes。这意味着您需要创建一个模板化的 YAML 文件,您可以在其中将引用的 ti 环境变量替换为绑定到环境变量的值。

由于这是 Kubernetes 的一个已知“怪癖”,因此已经存在可以规避此问题的工具。 Helm 是那些使用起来非常愉快的工具之一

要将 mountpath 与 env 变量一起使用,您可以使用 subPath with expanded environment variables (k8s v1.17+)。

在您的情况下,它看起来如下所示:

containers:
- env:
  - name: MY_POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  volumeMounts:
  - mountPath: /cache
    name: shared-folder
    subPathExpr: $(MY_POD_NAME)