如何在kubernetes中设置环境变量中mountPath的值?

如何在kubernetes中设置环境变量中mountPath的值?,kubernetes,kubernetes-pod,Kubernetes,Kubernetes Pod,我使用configMap来存储mount path值,但当我在pod中调用它时,它似乎无法将mountPath属性分配给env变量 这是我的密码: apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template:

我使用configMap来存储mount path值,但当我在pod中调用它时,它似乎无法将mountPath属性分配给env变量

这是我的密码:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        env:
        - name: MOUNT_PATH
          valueFrom:
           configMapKeyRef:
            name: my-configMap
            key: MOUNT_PATH
        volumeMounts:
        - name: nginx-volume
          mountPath: $(MOUNT_PATH)
      volumes:
      - name: nginx-volume
        persistentVolumeClaim:
         claimName: my-pvc

     ---


apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configMap
  namespace: default
data:
  MOUNT_PATH: "/opt/somepath"

我建议检查本文档中的限制列表,以便将ConfigMaps与POD一起使用:

我想到了几个潜在的问题

首先需要创建ConfigMap,以便Pod可以使用它,因此请确保正在进行


另外,我看到您正在默认名称空间中创建ConfigMap,这是运行Pod的地方吗?它们需要在同一名称空间中。

我在实验室中部署了它,在使用kubectl部署某些东西时,不可能在清单上动态定义任何参数

当您定义一个env变量时,只有在pod部署之后,并且在它发生之前,您正在引用它,它才会被访问。因此,当您应用您创建的清单时,没有
$(MOUNT\u PATH)
在任何地方都不存在

您还可以通过使用外部工具helm或kustomize(如@所述)以编程方式实现这一点

当您执行此操作时,容器中的信息是它应该在
$(mount\u PATH)
处装入卷

使用Helm,您可以在values.yaml上定义挂载路径,并在清单中使用此变量

关于helm的几个有用链接:


如果您使用的是k8s 1.17或更高版本,则可以实现您想要的功能

    env:
    - name: MOUNT_PATH
      valueFrom:
        configMapKeyRef:
          name: myconfigmap
          key: MOUNT_PATH
    volumeMounts:
    - name: nginx-volume
      mountPath: /opt
      subPathExpr: $(MOUNT_PATH)
  volumes:
  - name: nginx-volume
    persistentVolumeClaim:
      claimName: my-pvc

  ---

  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: myconfigmap
    namespace: default
  data:
    MOUNT_PATH: "somepath"
容器内的结果:

# ls -l /opt
total 4
drwxrwxrwx    2 root     root          4096 Oct 29 14:58 somepath

是的,它在同一个名称空间中,我已经测试了一些其他环境变量,它们可以工作,但是当我将环境变量附加到volumeMounts下的mounPath属性时,它就不工作了——可能是PodPreset?看起来您可以根据标签选择器选择一个。好的,环境变量是用于容器中运行的进程的,在部署时不进行评估。再次提醒您,使用configmap无法完成您要做的事情。@BurakSerdar是否有其他方法可以动态传递mountPath值?您可以在部署期间使用kustomize进行设置
# ls -l /opt
total 4
drwxrwxrwx    2 root     root          4096 Oct 29 14:58 somepath