数据卷
Docker的特性,决定了容器本身是非持久化的,容器被删除后其中的数据也一并被删除了。Docker提供数据卷(Volume),通过挂载宿主机上的目录来实现持久存储。
但在集群环境中,宿主机上的数据卷有很大的局限性
- 容器在机器间迁移时,数据无法迁移
- 不同机器之间不能共享数据卷
为了解决这些问题,阿里云容器服务提供第三方数据卷,将各种云存储包装成数据卷,可以直接挂载在容器上,并在容器重启、迁移时自动重新挂载。目前支持ossfs和云盘两种存储。
开通数据卷功能
点击容器服务控制台左侧数据卷,展开数据卷功能。
开通数据卷需要满足两个条件:集群agen版本>=0.6;及集群里部署了acsvolumedriver应用。如果您的集群不满足条件,请按提示升级。
数据卷管理
该页面列出当前集群中所有的数据卷,包括本地和第三方数据卷,如下图所示。
对于本地卷,其卷名是node_name/volume_name。
对于第三方数据卷,点击“查看”会返回创建参数。
同一个第三方卷在每个节点上都会创建,便于容器在不同节点间迁移。可以通过“删除所有同名卷”按钮删除。
创建ossfs数据卷
ossfs是阿里云官方提供的基于FUSE的文件系统,项目主页见https://github.com/aliyun/ossfs。
ossfs数据卷将oss的bucket包装成数据卷,创建界面如下。
- 数据卷名:数据卷的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