在 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)
我有一个带有两个容器的简单 StatefulSet。我只想通过 emptyDir 卷共享路径:
volumes:
- name: shared-folder
emptyDir: {}
第一个容器是busybox:
- image: busybox
name: test
command:
- sleep
- "3600"
volumeMounts:
- mountPath: /cache
name: shared-folder
第二个容器在 /cache/
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)