如何通过pvc在Kubernetes中挂载数据文件?

时间:2018-08-02 07:58:23

标签: kubernetes kubernetes-pvc

我想在kubernetes中使用glusterfs通过pvc持久化数据文件,我挂载了目录,它会工作,但是当我尝试挂载文件时,它将失败,因为文件已挂载到目录类型,如何在k8s中挂载数据文件?

图片信息:error log

pod yaml file

1 个答案:

答案 0 :(得分:2)

  

如何在k8s中装载数据文件?

这通常是特定于应用程序的,并且有几种方法可以实现,但是主要是您想了解subPath

通常,您可以选择:

  • 使用subPath分隔配置文件。
  • 将卷/路径作为目录挂载在其他位置,然后将文件链接到pod中的特定位置(在极少数情况下,与其他配置文件或同一目录中的目录权限混合会出现问题,或应用程序的启动/启动策略防止文件在Pod开始时挂载,但必须在执行某些初始化后才存在,这确实是很极端的情况)。
  • 使用ConfigMaps(甚至是Secrets)来保存配置文件。请注意,如果将subPath与configMap和Secret Pod一起使用不会自动在那里获得更新,但是是处理配置文件的更常见的方式,并且您的conf/interpreter.json看起来是一个很好的例子...

注意事项:

  • 安装是“重叠的”基本路径,因此必须将文件挂载到文件的最高点才能与其他文件共享其文件夹。共享一个文件夹会使您的文件夹中只有一个文件,而这通常不是必需的。
  • 如果使用ConfigMaps,则必须使用subPath引用单个文件才能挂载它,即使ConfigMap中只有一个文件也是如此。像这样:

    containers:
    - volumeMounts:
      - name: my-config
        mountPath: /my-app/my-config.json
        subPath: config.json
    volumes:
    - name: my-config
      configMap:
        name: cm-my-config-map-example
    

编辑:

使用example.sh将单个/bin脚本文件安装到容器的ConfigMap目录的完整示例。

您可以调整此示例,以适合将具有任何特权的任何文件放置在任何所需文件夹中的需要。将my-namespace替换为任何所需的字符(或将default完全删除)

配置图:

kind: ConfigMap
apiVersion: v1
metadata:
  namespace: my-namespace
  name: cm-example-script
data:
  example-script.sh: |
     #!/bin/bash
     echo "Yaaaay! It's an example!"

部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: my-namespace
  name: example-deployment
  labels:
    app: example-app
spec:
  selector:
    matchLabels:
      app: example-app
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - image: ubuntu:16.04
        name: example-app-container
        stdin: true
        tty: true
        volumeMounts:
          - mountPath: /bin/example-script.sh
            subPath: example-script.sh
            name: example-script
      volumes:
      - name: example-script
        configMap:
          name: cm-example-script
          defaultMode: 0744

使用持久卷将单个test.txt文件安装到容器的/bin目录中的完整示例(文件已经存在于卷的根目录中)。

但是,如果您希望使用永久性卷而不是configMap进行挂载,这是另一个以几乎相同的方式进行挂载的示例(test.txt挂载在/bin/test.txt中)...请注意两件事:{{ 1}}必须存在于PV上,并且我正在使用statefulset以便与自动配置的pvc一起运行,并且您可以进行相应的调整...

test.txt