如何通过pvc在kubernetes中装载数据文件?

如何通过pvc在kubernetes中装载数据文件?,kubernetes,kubernetes-pvc,Kubernetes,Kubernetes Pvc,我想通过pvc在kubernetes中使用glusterfs持久化数据文件,我挂载了diretory,它会工作,但是当我尝试挂载文件时,它会失败,因为文件挂载到了目录类型,我如何在k8s中挂载数据文件 图像信息: 如何在k8s中装入数据文件 这通常是特定于应用程序的,有几种方法可以做到这一点,但您主要想了解 通常,您可以选择: 用于分隔配置文件 将卷/路径作为目录装载到其他位置,然后将文件链接到pod中的特定位置(在极少数情况下,与同一目录中的其他配置文件或目录权限混合会出现问题,或者应用程

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

图像信息:

如何在k8s中装入数据文件

这通常是特定于应用程序的,有几种方法可以做到这一点,但您主要想了解

通常,您可以选择:

  • 用于分隔配置文件
  • 将卷/路径作为目录装载到其他位置,然后将文件链接到pod中的特定位置(在极少数情况下,与同一目录中的其他配置文件或目录权限混合会出现问题,或者应用程序的启动/启动策略会阻止文件在pod启动时装载,但在执行某些初始化后需要存在,这是非常边缘的情况)
  • 使用(甚至)保存配置文件。请注意,如果将子路径与configMap和Secret pod一起使用,则不会自动在那里获得更新,但这是处理配置文件的更常见的方法,而您的
    conf/interpreter.json
    看起来是一个很好的示例
注意事项:

  • 装载是“重叠”基础路径,因此您必须将文件装载到文件点,以便与其他文件共享其文件夹。共享到一个文件夹将使您的文件夹中包含单个文件,这通常不是必需的
  • 如果使用ConfigMaps,则即使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
    
编辑: 使用
ConfigMap
将单个
example.sh
脚本文件装载到容器的
/bin
目录的完整示例。 您可以调整此示例,以满足将具有任何权限的任何文件放置在任何所需文件夹中的需要。将
my namespace
替换为任何所需文件夹(或将
default
one完全删除)

配置映射:

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中)…注意两件事:
test.txt
必须存在于PV上,并且我使用statefolset只是为了与自动配置的pvc一起运行,您可以相应地进行调整

apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: my-namespace
  name: ss-example-file-mount
spec:
  serviceName: svc-example-file-mount
  replicas: 1
  selector:
    matchLabels:
      app: example-app
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
        - image: ubuntu:16.04
          name: example-app-container
          stdin: true
          tty: true
          volumeMounts:
            - name: persistent-storage-example
              mountPath: /bin/test.txt
              subPath: test.txt
  volumeClaimTemplates:
  - metadata:
      name: persistent-storage-example
    spec:
      storageClassName: sc-my-storage-class-for-provisioning-pv
      accessModes: [ ReadWriteOnce ]
      resources:
        requests:
          storage: 2Gi

似乎子路径无法解决问题,子路径主要用于装载特定的子目录,而不是整个目录,也不能是文件。我添加了一些使用清单中使用的子路径装载数据文件的示例。我还添加了使用子路径将单个文件从持久卷装载到已填充卷的示例示例在我们的集群上进行了测试,并按预期工作,但您需要考虑提供持久卷的不同方式(与子路径无关,只是为了给您一些指针,以便根据您的设置调整示例)我尝试了配置映射,它可以挂载文件,但它无法解决我的问题,文件内容为空,文件内容无法预填充。在我的情况下,解释器.json由齐柏林飞艇服务自动更新,我想在服务之外挂载文件解释器.json以保存状态,以防服务ice重启。为了澄清问题。问题是我想持久化某个服务的一个状态文件(由服务生成的状态),以防服务重启时状态丢失,如何解决?