在Kubernetes中的路径内使用变量

问题描述

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

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

一个容器是一个忙碌箱:

  - 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 / $(HOSTNAME)而不是挂载/ cache / pod-0。我也尝试获取POD_NAME并将其设置为env变量,但它也不能解决

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

解决方法

我在这里进行了测试,仅使用带有env变量的Kubernetes(k8s

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

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

,

要在环境变量中使用mountpath,可以使用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)
,

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

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