问题描述
我有一个带有两个容器的简单StatefulSet。我只想通过emptyDir卷共享路径:
volumes:
- name: shared-folder
emptyDir: {}
- image: busyBox
name: test
command:
- sleep
- "3600"
volumeMounts:
- mountPath: /cache
name: shared-folder
第二个容器在/ cache /
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是使用非常愉快的工具之一