kubernetes 如何使用一个容器的持久卷作为另一个容器的卷挂载?

jjjwad0x  于 2023-04-29  发布在  Kubernetes
关注(0)|答案(2)|浏览(161)

我创建了一个容器,它基本上是一个包含配置文件的目录。这些配置文件将由包含应用程序可执行文件的另一个容器使用。两个容器部署在同一个pod中。
我已经创建了pv和pvc的第一个容器像-

apiVersion: v1
kind: PersistentVolume
metadata:
  name: app-pv
  labels:
    type: local
spec:
  storageClassName: standard
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-pvc
  labels:
    type: local
spec:
  storageClassName: standard
  volumeName: app-pv
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

接下来,我将创建两个容器的部署,如-

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: app
spec:
  selector:
     matchLabels:
       app: app
  strategy:
     type: Recreate
  template:
     metadata:
       labels:
         app: app
     spec:
       containers:
         - name: lshome
           image: <local_registry>/container1:latest
           imagePullPolicy: Always
           volumeMounts:
              - name: container1-persistant-storage
                mountPath: /home/app/config
         - name: wildfly
           image: <local_registry>/container2:latest
           imagePullPolicy: Always
           volumeMounts:
              - name: container1-config
                mountPath: /home/app/config                 
       volumes:
        - name: container1-persistant-storage
          persistentVolumeClaim:
            claimName: app-pvc
        - name: container1-config
          persistentVolumeClaim:
            claimName: app-pvc

我想要的是容器1中/home/app/config目录下的数据可以在相同目录结构的容器2中使用。我也在container 2中创建了相同的目录结构。
当我尝试创建部署时,它会显示消息-无法连接或装载卷,然后无法创建部署。

2nc8po8w

2nc8po8w1#

不要定义两个卷,删除container 1-config即可。就像下面。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: app
spec:
  selector:
     matchLabels:
       app: app
  strategy:
     type: Recreate
  template:
     metadata:
       labels:
         app: app
     spec:
       containers:
         - name: lshome
           image: <local_registry>/container1:latest
           imagePullPolicy: Always
           volumeMounts:
              - name: container1-persistant-storage
                mountPath: /home/app/config
         - name: wildfly
           image: <local_registry>/container2:latest
           imagePullPolicy: Always
           volumeMounts:
              - name: container1-persistant-storage
                mountPath: /home/app/config                 
       volumes:
        - name: container1-persistant-storage
          persistentVolumeClaim:
            claimName: app-pvc
xyhw6mcr

xyhw6mcr2#

只是为了给你的问题增加更多的见解。挂载卷失败的原因是两个不同的容器lshomewildfly试图挂载同一个可写存储。
当创建lshome容器时,它已经使用app-pvcclaimName请求声明并绑定了storage/PV,因此不允许其他容器wildfly请求另一个存储或挂载已经挂载的storage/pv,因为它已经与第一个容器绑定。
所以,你的问题的解决方案是:

1.只声明一次存储/PV,如下所示:

volumes:
    - name: shared-storage
      persistentVolumeClaim:
        claimName: app-pvc

2.在所有容器的volumeMount中调用此PV(shared-storage),如下图所示:

volumeMounts:
          - name: shared-storage
            mountPath: /home/app/config

我还建议您查看K8s中的**“Mounting configMaps as Volumes”**,作为您的方法的替代最佳实践。通过这种方式,您可以将所有应用配置文件作为configMaps对象存储在K8s中,然后将这些configMaps作为卷直接挂载到多容器Pod中,以便使这些应用配置文件可用于同一Pod中的其他容器。
参考网址:
https://www.golinuxcloud.com/mount-configmap-as-file-in-existing-directory/https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

相关问题