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

How to set the value of mountPath in an env variable in kubernetes?

我使用 configMap 来存储挂载路径值,但是当我在我的 pod 中调用它时它不起作用似乎无法将 mountPath 属性 分配给环境变量。

这是我的代码:

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"

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

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

需要先创建 ConfigMap,以便 Pod 可以使用它,因此请确保它正在发生。

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

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

当您定义一个 env 变量时,只有在部署 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

如果您使用的是 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