ConfigMap已安装在持久卷声明上

时间:2020-04-17 07:48:58

标签: kubernetes containers kubernetes-helm helmfile

在我的部署中,我想结合使用持久卷声明和配置映射安装。例如,我想要以下内容:

volumeMounts:
    - name: py-js-storage
        mountPath: /home/python
    - name: my-config
        mountPath: /home/python/my-config.properties
        subPath: my-config.properties
        readOnly: true
...
    volumes:
    - name: py-storage
    {{- if .Values.py.persistence.enabled }}
        persistentVolumeClaim:
        claimName: python-storage
    {{- else }}
        emptyDir: {}
    {{- end }}

这是可行的可行方法吗?有没有更好的方法来解决这种情况?

2 个答案:

答案 0 :(得分:2)

由于您没有提供用例,因此我的答案将取决于是否可行。实际上:是的。

我假设您希望从configMap的挂载文件中已包含其他文件的挂载点,并且您使用subPath的方法是正确的!

当您需要在同一路径上装载不同的卷时,需要指定subPath,否则原始目录的内容将被隐藏

换句话说,如果要保留两个文件(从configMap的挂载点),则必须使用subPath

为了说明这一点,我已经使用下面的部署代码进行了测试。我在那里安装了hostPath /mnt,该主机路径包含一个名为filesystem-file.txt的文件(位于我的pod中)和一个来自配置映射/mnt/configmap-file.txt的文件test-pd-plus-cfgmap

注意:我正在使用Kubernetes 1.18.1

配置映射:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-pd-plus-cfgmap
data:
  file-from-cfgmap: file data

部署:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-pv
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test-pv
  template:
    metadata:
      labels:
        app: test-pv
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - mountPath: /mnt
          name: task-pv-storage
        - mountPath: /mnt/configmap-file.txt
          subPath: configmap-file.txt
          name: task-cm-file
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
            claimName: task-pv-claim
        - name: task-cm-file
          configMap:
            name: test-pd-plus-cfgmap

部署后,您可以在窗格的/mnt中看到以下内容:

$ kubectl exec test-pv-5bcb54bd46-q2xwm -- ls /mnt
configmap-file.txt
filesystem-file.txt

您可以通过相同的讨论来查看此github issue

Here,您可以了解有关卷subPath的更多信息。

答案 1 :(得分:1)

您可以采用以下方法。

在您的 deployment.yaml 模板文件中,您可以配置:

...
{{- if .Values.volumeMounts }}
        volumeMounts:
{{- range .Values.volumeMounts }}
        - name: {{ .name }}
          mountPath: {{ .mountPath }}
{{- end }}
{{- end }}
...
{{- if .Values.volumeMounts }}
      volumes:
{{- range .Values.volumeMounts }}
      - name: {{ .name }}
{{ toYaml .volumeSource | indent 8 }}
{{- end }}
{{- end }}

以及您的 values.yaml 文件,您可以定义任何体积来源:

volumeMounts:
  - name: volume-mount-1
    mountPath: /var/data
    volumeSource:
      persistentVolumeClaim:
        claimName: pvc-name
  - name: volume-mount-2
    mountPath: /var/config
    volumeSource:
      configMap:
        name: config-map-name

通过这种方式,您不必担心卷的来源。您可以在values.yaml文件中添加任何类型的源,而不必更新 deployment.yaml 模板。

希望这会有所帮助!