3

我有一个 Kubernetes POD 正在运行,并且我已将 PVC 附加到它上面。PVC 卷是 /opt/stackstorm。

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

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

即使附加了 PVC,我们如何保留目录?

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

因此,连接到 POD 时的 PVC 会产生问题。

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 应该将所有文件作为图像的一部分。

4

2 回答 2

3

您可以将 /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 附加到它。

于 2020-04-05T08:10:58.930 回答
0

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

在这种情况下,如果您想保存 docker 映像默认附带的文件,您可以使用 init 容器来复制数据或更改权限,这样文件就不会被删除。

initContainers:
     - name: init-sysctl
       image: busybox
       imagePullPolicy: IfNotPresent
       command: ["sysctl", "-w", "Command"]
       securityContext:
         privileged: true
       volume:
         mount path : /
于 2019-04-10T13:13:08.167 回答