在阿里云容器服务上使用OSS数据卷(Volume)

  1. 云栖社区>
  2. 博客>
  3. 正文

在阿里云容器服务上使用OSS数据卷(Volume)

jimmycmh 2016-03-08 19:29:13 浏览10869

数据卷

Docker的特性,决定了容器本身是非持久化的,容器被删除后其中的数据也一并被删除了。Docker提供数据卷(Volume),通过挂载宿主机上的目录来实现持久存储。

但在集群环境中,宿主机上的数据卷有很大的局限性

  • 容器在机器间迁移时,数据无法迁移
  • 不同机器之间不能共享数据卷

为了解决这些问题,阿里云容器服务提供第三方数据卷,将各种云存储包装成数据卷,可以直接挂载在容器上,并在容器重启、迁移时自动重新挂载。目前支持ossfs和云盘两种存储。

开通数据卷功能

点击容器服务控制台左侧数据卷,展开数据卷功能。
开通数据卷需要满足两个条件:集群agen版本>=0.6;及集群里部署了acsvolumedriver应用。如果您的集群不满足条件,请按提示升级。

数据卷管理

该页面列出当前集群中所有的数据卷,包括本地和第三方数据卷,如下图所示。

_

对于本地卷,其卷名是node_name/volume_name。
对于第三方数据卷,点击“查看”会返回创建参数。
同一个第三方卷在每个节点上都会创建,便于容器在不同节点间迁移。可以通过“删除所有同名卷”按钮删除。

创建ossfs数据卷

ossfs是阿里云官方提供的基于FUSE的文件系统,项目主页见https://github.com/aliyun/ossfs

ossfs数据卷将oss的bucket包装成数据卷,创建界面如下。

_OSS_

  • 数据卷名:数据卷的id,在集群内唯一。
  • AccessKeyId、AccessKeySecret:访问OSS所需的AK,可以从oss控制台获取。
  • 访问域名:如果bucket跟ECS在同一个区(Region),选内网域名;否则选外网域名
  • 文件缓存:如果需要在不同机器间同步同一个文件的修改(比如在A机器中修改文件,在B机器中读取修改后的内容),请关闭文件缓存。==但请注意,关闭文件缓存将导致ls文件夹变得很缓慢,尤其是同一个文件夹下文件比较多时==。没有上述需求时,请打开文件缓存,提高ls的速度。

云盘数据卷(暂未开放)

云盘数据卷将云盘包装成数据卷。因为云盘只能挂载到一台机器上,为了容器迁移时能带走数据,引用了云盘数据卷的服务,只能有一个容器。

  • 可用区:由于云盘只能挂载到同一个可用区的ECS中,所以当某个容器引用了云盘数据卷时,只会被调度到该可用区的机器上。如果集群中没有该可用区的机器,容器将无法启动。

如何使用第三方数据卷

第三方数据卷使用方法跟本机数据卷相同。

  • 通过镜像创建应用:在数据卷的“主机路径”处填写数据卷名,如下图所示

_

  • 通过编排文件创建应用:在volumes一节中,第一个冒号前填写数据卷名
volumes:
  - o1:/aaa
  - /tmp:/bbb

常见错误

如果用数据卷名:镜像中已有目录的方式使用第三方数据卷(如o1:/data,而镜像中有/data目录),启动容器会失败,报类似chown /mnt/acs_mnt/ossfs/XXXX: input/output error的错误。

产生这个错误的原因是,对于命名数据卷,docker会把镜像中已有的文件复制到数据卷中,并用chown设置相应的用户权限,而linux禁止对挂载点使用chown。

解决办法有两种:

  • 升级docker到1.11或以上版本,升级agent到最新版本,在编排模板中指定nocopy选项
    volumes:
      - o1:/data:nocopy
      - /tmp:/bbb

这样,docker会跳过复制数据的过程,也就不会产生chown错误。

  • 如果必须复制数据,则可以不使用数据卷名,而使用挂载点路径,比如用/mnt/acs_mnt/ossfs/XXXX:/data。但这种方式绕开了volume driver,在机器重启时,无法保证ossfs挂载成功之后再启动用户容器,导致容器挂载了一个本地数据卷。为了避免这种情况,需要同时使用数据卷名和挂载点。其中,数据卷名对应的数据卷,只起到和volume driver同步的功能,并不实际使用。
    volumes:
      - o1:/nouse
      - /mnt/acs_mnt/ossfs/XXXX:/data
      - /tmp:/bbb