【问题标题】:How to set the value of mountPath in an env variable in kubernetes?如何在 kubernetes 的环境变量中设置 mountPath 的值?
【发布时间】:2020-04-13 20:09:33
【问题描述】:

我使用 configMap 来存储挂载路径值,但是当我在我的 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"

【问题讨论】:

  • AFAIK,环境变量用于在容器中运行的进程,而不是在部署时评估。同样,AFAIK,您尝试执行的操作无法使用 configmap。
  • @BurakSerdar 有没有其他方法可以动态传递 mountPath 值?
  • 您可以在部署期间使用 kustomize 进行设置

标签: kubernetes kubernetes-pod


【解决方案1】:

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

    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

【讨论】:

    【解决方案2】:

    我将它部署在我的实验室中,使用 kubectl 部署某些东西时,无法在清单上动态定义任何参数。

    当您定义一个环境变量时,它只有在 pod 部署后才能访问,并且您在它发生之前引用它。因此,当您应用您创建的清单时,任何地方都不存在$(MOUNT_PATH)

    您还可以通过使用外部工具作为 helm 或 kustomize 以编程方式实现此目的,正如 @Burak Serdar 所评论的那样。

    当您执行此操作时,容器会收到有关它应该将卷安装在字面上的 $(MOUNT_PATH) 的信息。

    # df -h | grep MOUNT
    tmpfs           3.3G  454M  2.9G  14% /$(MOUNT_PATH)
    

    使用 Helm,您可以在 values.yaml 上定义 mountPath,并在清单中使用此变量。

    很少有关于 helm 的有用链接:

    Helm Quickstart Guide An Introduction to Helm, the Package Manager for Kubernetes Using Helm and Kustomize to Build More Declarative Kubernetes Workloads

    【讨论】:

      【解决方案3】:

      我建议检查此文档中的限制列表,以便将 ConfigMaps 与 Pod 一起使用:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#restrictions

      我想到了几个潜在的问题。

      首先需要创建 ConfigMap,以便 Pod 可以使用它,因此请确保这样做。

      另外,我看到您正在默认命名空间中创建 ConfigMap,那是您运行 Pod 的位置吗?它们需要在同一个命名空间中。

      【讨论】:

      • 是的,它在同一个命名空间中,我已经测试了一些其他环境变量并且它们可以工作,但是当我将环境变量附加到 volumeMounts 下的 mounPath 属性时它不起作用
      • 可能是 PodPreset?看起来您可以根据标签选择器选择一个。 kubernetes.io/docs/tasks/inject-data-application/podpreset
      猜你喜欢
      • 1970-01-01
      • 2017-12-22
      • 2019-05-08
      • 2019-07-21
      • 2023-03-13
      • 1970-01-01
      • 2021-06-28
      • 2019-09-13
      • 2022-11-20
      相关资源
      最近更新 更多