【问题标题】:Kubernetes persistent volume overriding existing data in the pod/containerKubernetes 持久卷覆盖 pod/容器中的现有数据
【发布时间】:2021-01-29 18:22:49
【问题描述】:

我们正在尝试使用映射到 pod/container 目录的 kubernetes 持久卷作为备份。容器目录(/home)已经有来自 dockerimage 的数据,但是当我们使用容器目录(/home)挂载 kubernetes 持久卷时,容器数据会被覆盖或消失。

如何让 kubernetes 持久化卷不覆盖容器的数据,只用预先存在的数据修改任何数据?

cat pv.yml

 apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: task-pv-volume
      labels:
        type: local
    spec:
      storageClassName: manual
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/home/xyz/dock/main/kube/storage"

cat pvclaim.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

以下是主要清单文件,用于部署具有持久卷的 pod

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
    - name: cgroup
      hostPath:
        path: /sys/fs/cgroup
        type: Directory
  containers:
    - name: rbf-container
      image: 10.190.205.11:5000/myimage/ubuntu:1.0
      securityContext:
        privileged: true
      volumeMounts:
        - mountPath: "/home/xyz"      ##-> mounting persistent volume with container directory /home/xyz**
          name: task-pv-storage
        - mountPath: /sys/fs/cgroup
          name: cgroup

使用 Kubernetes 持久卷输出:

$ ssh 10.244.4.29
Failed to add the host to the list of known hosts (/home/xyz/.ssh/known_hosts).
xyz@10.244.4.29's password:
Last login: Tue Aug 25 11:16:48 2020 from 10.252.85.167
$ bash
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

xyz@mypod:~$ ls
xyz@mypod:~$ ls -l
total 0                    ##--> no data present it all get vanished
xyz@mypod:~$ pwd
/home/xyz

没有持久性卷的 pod 输出

$ ssh 10.244.4.29
Failed to add the host to the list of known hosts (/home/xyz/.ssh/known_hosts).
xyz@10.244.4.29's password:
Last login: Tue Aug 25 11:16:48 2020 from 10.252.85.167
$ bash
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

xyz@mypod:~$ ls
xyz@mypod:~$ ls -l
total 465780
drwxrwxrwx 1 xyz xyz      4096 Aug 13 12:44 Desktop
drwxr-xr-x 2 xyz xyz      4096 Aug 25 11:12 Documents
drwxr-xr-x 2 xyz xyz      4096 Aug 25 11:12 Downloads
drwxr-xr-x 2 xyz xyz      4096 Aug 25 11:12 Music
drwxr-xr-x 2 xyz xyz      4096 Aug 25 11:12 Pictures
drwxr-xr-x 2 xyz xyz      4096 Aug 25 11:12 Public
drwxr-xr-x 2 xyz xyz      4096 Aug 25 11:12 Templates
drwxr-xr-x 2 xyz xyz      4096 Aug 25 11:12 Videos
-rw------- 1 xyz xyz   2404352 Aug 25 11:12 core
drwx------ 4 root root      4096 Aug 10 08:39 local.bak
-rw-r--r-- 1 root root 474439680 Aug 10 08:35 local.tar

如您所见,来自 dockerimage 的数据无需使用持久卷即可获得

【问题讨论】:

标签: kubernetes persistent-volumes


【解决方案1】:

我的 Kubernetes 之旅才刚刚开始,仍在努力掌握最佳实践,但我认为您尝试做的事情是不可能的(在 /home 到 /home 的情况下)。 AFAIK 数据不会被覆盖,但存在于挂载“下”。您可以通过使用mount --bind folder_a folder_b 安装一个文件夹然后使用umount folder_b 卸载该文件夹来自己尝试此操作。创建挂载会隐藏 folder_b 中的文件,但卸载会使它们再次出现。

这意味着您只需要通过将文件复制到卷来初始化卷。您可以使用kubectl exec &lt;pod&gt; -- &lt;command&gt;、运行jobinitContainers 或使用入口点shell 脚本来实现此目的。由于一遍又一遍地将文件复制到安装的卷是浪费能源,我认为前两个选项是首选。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多