Kubernetes PVC删除POD的内容

时间:2019-04-10 12:54:42

标签: kubernetes kubernetes-pvc

我正在运行Kubernetes POD,并且已为其附上PVC。 PVC卷为/ opt / stackstorm。

默认情况下,/ opt / stackstorm中有某些文件,这些文件是docker官方映像的一部分。当没有PVC连接到POD时,这些文件可见。

但是,当附加PVC时,将替换文件并创建一个lost&found目录。

即使附上PVC,我们如何仍可以保留目录?

我已经更改了PVC的目录。当我将目录从opt / stackstorm更改为/ opt / stack时,/ opt / stackstorm包含所有详细信息,但/ opt / stack变为空。

因此,将PVC附加到POD时会产生问题。

pvc.yaml:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: stacke
  annotations:
    volume.beta.kubernetes.io/storage-class: "ebs"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

deployment.yaml:

       volumeMounts:
          - name: stacke
            mountPath: /opt/stackstorm
      volumes:
      - name: stacke
        persistentVolumeClaim:
          claimName: stacke
      imagePullSecrets:
      - name: regcred

预期结果是/ opt / stackstorm应该将所有文件作为映像的一部分。

2 个答案:

答案 0 :(得分:2)

您可以将/ opt / stackstorm的内容复制到dockerfile中的新目录并构建新映像。之后,您可以在运行时将新目录的内容复制回/ opt / stackstorm。发生所有此问题是因为此目录在构建时进行了初始化。 要在运行时进行复制,可以在kubernetes的容器生命周期中使用postStart。 例如: spec: containers: - name: .... image: .... lifecycle: postStart: exec: command: ["cp" , "-r" , "/test/" ,"/opt/stackstorm"] 此命令在容器启动后运行。 但是这种方法在每次pod启动时都会复制一次,如果要避免这种情况,可以在构建时删除dockerfile中/ opt / stackstorm的内容,然后在postStart命令中编写脚本以检查此目录是否为空,以进行复制。 而且,您可以将/ opt / stackstorm作为mountPath并将pvc附加到它,就像完成操作一样。

答案 1 :(得分:0)

您的数据已从pod中删除,因为您的PVC路径未指向特定目录。

在这种情况下,如果要保存docker image随附的默认文件,则可以使用init容器,该容器将复制数据或更改权限,因此不会删除文件。

initContainers:
     - name: init-sysctl
       image: busybox
       imagePullPolicy: IfNotPresent
       command: ["sysctl", "-w", "Command"]
       securityContext:
         privileged: true
       volume:
         mount path : /