【问题标题】:Multiple persistent volumes in minikubeminikube 中的多个持久卷
【发布时间】:2019-01-29 09:09:49
【问题描述】:

我想将多个volumeMounts附加到minikube中的一个持久卷声明上的部署。

我有一个 tomcat 部署的应用程序,它需要保留三个不同的文件夹(/var/log/app、/var/lib/app、/etc/app)。 当容器启动时,我应该在每个目录中获取文件,但只填充日志并且应用程序失败。 知道我的 yaml 是正确的还是我以错误的方式处理这个问题?

K8s yaml:

apiVersion: v1

kind: PersistentVolume
metadata:
  name: pv-volume
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 6Gi
  hostPath:
    path: /data/pv-volume
  storageClassName: manual
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: manual
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: app
spec:
  selector:
    matchLabels:
      app: app
  replicas: 1
  strategy: {}
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - image: app:latest
        name: app
        env:
        - name: JAVA_OPTS
          value: -Xms64M -Xmx512M
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1024Mi"
            cpu: "500m"
        volumeMounts:
          - name: pv-storage1
            mountPath: /var/log/app
            subPath: log
          - name: pv-storage1
            mountPath: /var/lib/app
            subPath: lib
          - name: pv-storage1
            mountPath: /etc/app
            subPath: etc
        tty: true
      volumes:
      - name: pv-storage1
        persistentVolumeClaim:
          claimName: pv-claim
      restartPolicy: Always
status: {}

v2:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume-log
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 1Gi
  hostPath:
    path: /data/pv-volume/log
  storageClassName: manual
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-log
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: manual
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume-lib
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 1Gi
  hostPath:
    path: /data/pv-volume/lib
  storageClassName: manual
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-lib
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: manual
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume-etc
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 1Gi
  hostPath:
    path: /data/pv-volume/etc
  storageClassName: manual
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-etc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: manual
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: endpoint
  labels:
    app: endpoint
spec:
  selector:
    matchLabels:
      app: endpoint
  replicas: 1
  strategy: {}
  template:
    metadata:
      labels:
        app: endpoint
    spec:
      containers:
      - image: endpoint:latest
        name: endpoint
        env:
        - name: JAVA_OPTS
          value: -Xms64M -Xmx1024M
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "1024Mi"
            cpu: "250m"
          limits:
            memory: "2048Mi"
            cpu: "500m"
        volumeMounts:
          - name: pv-storage-log
            mountPath: /var/log
          - name: pv-storage-lib
            mountPath: /var/lib
          - name: pv-storage-etc
            mountPath: /etc
        tty: true
      volumes:
      - name: pv-storage-log
        persistentVolumeClaim:
          claimName: pv-claim-log
      - name: pv-storage-lib
        persistentVolumeClaim:
          claimName: pv-claim-lib
      - name: pv-storage-etc
        persistentVolumeClaim:
          claimName: pv-claim-etc
      restartPolicy: Always
status: {}

【问题讨论】:

    标签: kubernetes minikube persistent-volumes


    【解决方案1】:

    使用上面的配置,您尝试将一个 PV 挂载到多个目录,这意味着它们将在 PV 配置中携带与您的主机路径相同的数据。

    如果你想使用多个不同内容的不同目录,你需要为每个目录创建PV和PVC,如下所示:

    kind: PersistentVolume
    metadata:
      name: pv-volume-log
    spec:
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 6Gi
      hostPath:
        path: /data/pv-volume/log
      storageClassName: manual
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pv-claim-log
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: manual
    
    ---
    kind: PersistentVolume
    metadata:
      name: pv-volume-lib
    spec:
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 6Gi
      hostPath:
        path: /data/pv-volume/lib
      storageClassName: manual
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pv-claim-lib
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: manual
    ---
    kind: PersistentVolume
    metadata:
      name: pv-volume-etc
    spec:
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 6Gi
      hostPath:
        path: /data/pv-volume/etc
      storageClassName: manual
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pv-claim-etc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: manual
    

    然后在您的部署 yaml 中分别添加这些卷并将卷附加到 mountPath:

    ...
          volumes:
          - name: pv-storage-log
            persistentVolumeClaim:
              claimName: pv-claim-log
          - name: pv-storage-lib
            persistentVolumeClaim:
              claimName: pv-claim-lib
          - name: pv-storage-etc
            persistentVolumeClaim:
              claimName: pv-claim-etc
          restartPolicy: Always
    ...
    

    希望对你有用

    【讨论】:

    • 检查并发布了 V2,但现在甚至没有日志被填充。也许 minikube 内部的权限有问题,因为 root 是文件夹的所有者。有趣的是声称文件夹是在 /data/pv-volume 中创建的
    • 是的,文件权限问题。我的 id 为 2000 的用户无法写入任何这些目录,即使在给出 chmod -R 777 /data/pv-volume 之后也是如此。
    猜你喜欢
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2017-10-07
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多