Kubernetes不会将数据复制到已安装的卷中

时间:2018-04-24 01:04:29

标签: mysql docker kubernetes

根据此处的文件: https://docs.docker.com/storage/volumes/

  

如果启动一个创建新卷的容器(如上所述),并且容器在要挂载的目录中有文件或目录(例如/ app / above),则将目录的内容复制到卷中。然后容器安装并使用卷,而使用该卷的其他容器也可以访问预先填充的内容。

换句话说,期望是,如果我在/ var / lib / mysql中有这样的文件

root@d8fa9a8b305a:/var/lib/mysql# ls
auto.cnf         xtz           ib_logfile0  ibdata1  mysql               sys
debian-5.7.flag  ib_buffer_pool  ib_logfile1  ibtmp1   performance_schema

然后,当我将卷装入/var/lib/mysql时,应将容器中的所有文件复制到我的卷中。

但我发现这种情况没有发生:

/var/lib/mysql/mysql # ls
auto.cnf        ib_buffer_pool  ib_logfile0     ib_logfile1     ibdata1

这是我装入/ var / lib / mysql的卷的内容,正如您所看到的,数据与docker镜像本身的/ var / lib / mysql中的数据不同。因此,在启动时失败了。

注意:有问题的卷实际上是由kubernetes安装的。所以,我在这里做了一个重要的假设

volumeMounts:
        - name: xtz-persistent-storage
          mountPath: "/var/lib/mysql/"

相当于这样做:docker run -p 443:443 --rm -v mysql:/var/lib/mysql <image>

1 个答案:

答案 0 :(得分:2)

Kubernetes Volumes与Docker Volumes不同。

来自Kubernetes documentation

  

Docker也有卷的概念,虽然它有点宽松和管理较少。在Docker中,卷只是磁盘上或另一个容器中的目录。生命周期不受管理,直到最近才有本地磁盘支持的卷。 Docker现在提供了卷驱动程序,但是现在功能非常有限(例如,从Docker 1.7开始,每个容器只允许一个卷驱动程序,并且无法将参数传递给卷)。

     

另一方面,Kubernetes卷具有明确的生命周期 - 与包围它的pod相同。因此,卷可以比Pod中运行的任何容器更长,并且可以在Container重新启动之间保留数据。当然,当Pod不再存在时,音量也将不复存在。也许更重要的是,Kubernetes支持多种类型的卷,Pod可以同时使用任意数量的卷。

     

在核心,卷只是一个目录,可能包含一些数据,容器中的容器可以访问它。该目录是如何形成的,支持它的介质以及它的内容由所使用的特定卷类型决定。

所以,虽然概念的名称是相同的,但这是一个不同的volume

在装载上,Kubernetes覆盖目标目录。

不幸的是,目前还没有办法合并已安装的卷和容器中的内容。以下是关于它的discussions之一。