如何在本地设置上创建可由Kubernetes中的多个Pod和cronjobs访问的PV和PVC

问题描述

我正在尝试创建PVPVC,它们也可以在同一pod上通过cronjobnode访问。

当前我正在使用以下yaml文件

apiVersion: v1
kind: PersistentVolume
Metadata:
  name: wwwroot
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "wwwroot"
---
apiVersion: v1
kind: PersistentVolumeClaim
Metadata:
  labels:
    app: wwwroot
  name: wwwroot
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
status: {}

statefulSet

apiVersion: apps/v1
kind: StatefulSet
Metadata:
  labels:
    app: web
  name: web
spec:
  selector:
    matchLabels:
      app: web
  serviceName: web
  replicas: 1
  template:
    Metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: xy:latest
        ports:
        - containerPort: 80
        - containerPort: 443
        volumeMounts:
        - mountPath: /app/wwwroot
          name: wwwroot
          subPath: tempwwwroot
      imagePullSecrets:
        - name: xy
      restartPolicy: Always
      serviceAccountName: ""
  volumeClaimTemplates:
    - Metadata:
        name: wwwroot
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 100Gi    

这在pods上工作正常,但是我有一个cronjob,需要访问相同的wwwroot PV

apiVersion: batch/v1beta1
kind: CronJob
Metadata:
  labels:
    app: import
  name: import
spec:
  schedule: "09 16 * * *"
  jobTemplate:
    spec:
      template:
        spec:  
          containers:
          - name: import
            image: xy:latest
            imagePullPolicy: Always
            volumeMounts:
            - mountPath: /app/wwwroot
              name: wwwroot
              subPath: tempwwwroot
          imagePullSecrets:
           - name: xy
          restartPolicy: OnFailure
          volumes:
          - name: wwwroot
            persistentVolumeClaim:
              claimName: wwwroot

据我所知,您无法将这些PV绑定到主机上的文件夹,就像Docker中那样(这很好,但是我可以接受)。当我使用以下设置运行kubectl get pvc时,似乎使用了相同的PVC名称wwwroot,但显然不是。我将/bin/bash放入pod创建的cronjob中,并且wwwroot文件夹不包含来自网络pod wwwroot文件夹的文件

知道我在做什么错吗?在本地1 PV PVC上创建node / Kubernetes的最佳选择是什么?我也在考虑在主机上创建一个NFS share,以便于访问文件

此外,当首次创建PV / PVC并部署网络statefulSet时,网络pod应使用CSS和JS文件填充wwwroot PV ,但是当它绑定到PV时,它似乎会删除文件夹中的所有内容,因此我不得不再次手动复制这些文件。有什么解决方法吗?

解决方法

您正在通过设置accessModes:ReadWriteOnce

在创建并使用pv的两个Pod上安装pv。

您可以在下面检查它们。 https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes

还可以在本地使用存储类NFS卷,该卷可以给您提供许多读写功能。我不确定本地存储类是否提供它,因为它不在官方文档中。下方的Chk https://kubernetes.io/docs/concepts/storage/persistent-volumes/

P.S。切勿在实际部署中使用存储类,因为k8中的节点会不断出现。