如何在 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
我使用 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