阿里云容器存储解决方案
1 介绍
容器技术是这两年热门的话题,因为容器技术给我们带来了很多方便的地方,节约了不少成本,不管是在运维还是开发上。而如今最热门的开源容器工具就是docker和Kubernets。
1.1 Docker
Docker是PaaS提供商dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
1.2 Kubernetes
Kubernetes是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。它支持自动化部署、大规模可伸缩、应用容器化管理。
在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。我们可以使用kubernets创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
2 容器存储的需求
Docker里的数据不做持久化的话数据是不保留的。所有的数据都是临时的,关了或者重启都会让数据丢失。如何持久化保存容器的数据,这是自Docker诞生之日起就一直存在的问题。在Docker的初始设计中,数据与容器共生共灭,人们很难把容器从一台机器迁移到另一台机器。时至今日,存储的发展和变革给了容器持久化存储以多种多样的解决之道。
2.1 容器存储类型
容器架构使用到三种类型的存储:
第一类是镜像存储数据。这可以利用现有的共享存储进行交付,要求类似于服务器虚拟化环境中虚拟机镜像分发保护的平台架构。容器镜像的一项好处在于其存储容量相较于完整的虚拟机镜像小了许多,因为它们不会复制操作系统代码。此外,容器镜像的运行在设计之初便是固定的,因此可以更高效地存储、共享。但也因此,容器镜像无法存储动态应用程序的数据。
第二类是容器的管理配置数据。不论使用Docker、Kubernetes、Swarm、Mesos还是其它类型的容器管理工具,都需要存储配置数据、日志记录等管理数据。这类数据容量不大,ETCD集群等分布式系统存储,没有共享需求,可以直接使用节点的本地硬盘。
第三类是容器应用的存储,相比虚拟机,容器的设计寿命更短,一旦容器销毁,所有的临时存储都会随之消散。因此,应用真正需要保存的数据,可以写入持久化的Volume数据卷。由于以微服务架构为主的容器应用多为分布式系统,容器可能在多个节点中动态地启动、停止、伸缩或迁移,因此,当容器应用具有持久化的数据时,必须确保数据能被不同的节点所访问。另一方面,容器是面向应用的运行环境,数据通常要保存到文件系统中,即存储接口以文件形式更适合应用访问。
2.2 容器存储管理
Kubernetes是开源的容器集群管理平台,可以自动化部署、扩展和运维容器应用。Kubernetes的调度单位称作Pod,每个Pod包含一个或多个容器。Pod可部署在集群的任意节点中,存储设备可以通过数据卷(Volume)提供给Pod的容器使用。为了不绑定特定的容器技术,Kubernetes没有使用Docker的Volume机制,而是制定了自己的通用数据卷插件规范,以配合不同的容器运行时来使用(如Docker和rkt)。数据卷分为共享和非共享两种类型,其中非共享型只能被某个节点挂载使用,共享型则可以让不同节点上的多个Pod同时使用。对有状态的应用来说,共享型的卷存储能够很方便地支持容器在集群各节点之间的迁移。
为了给容器提供更细粒度的卷管理,Kubernetes增加了持久化卷PV(Persistent Volume)的功能,把外置存储作为资源池,由平台管理并提供给整个集群使用。Kubernetes的卷管理架构使得存储可用标准的接入方式,并且通过接口暴露存储设备所支持的能力,从而在容器任务调度等方面实现了自动化管理。
2.3 阿里云容器存储管理架构
容器存储控制平面(Container Storage Control Plane),控制平面通常由软件实现,主要是接收北向API收到的存储请求,如创建、删除、加载、卸载和迁移数据卷(volume)等,并传递给底层数据平面去完成实际的存储操作。控制平面一般需要满足调用层规范的API,既可以是Docker容器引擎卷插件(Volume Plugin) 的API,也可以是Kubernetes等编排调度平台的Volume API。
存储数据平面(Storage Data Plane)提供数据实际的持久化能力,不仅需要实现容器数据卷的读写、快照、数据保护和复制等存储操作,而且通常还需具备多节点共享数据的能力。数据平面可以基于文件NAS实现,也可以基于云盘来实现数据存储功能。从部署架构上看,文件存储从易用性,扩展性和共享上更优于云盘。
NAS文件存储挂载流程:
1) API接口调用Kubelet准备启动POD,并挂载NAS。
2) Kubelet读取配置文件发现需要挂载的NAS,并通知Volume组件挂载。
3) FlexVolume调用挂载命令挂载NAS。
4) NAS挂载到ECS主机的/var/lib/kubernet/pods/**/volumes/alicloud-nas/pv-nas目录下。
5) Kubelet创建POD,并将挂载了NAS的/var/lib/kubernet/pods/**/volumes/alicloud-nas/pv-nas目录映射到POD的/data目录。
3 阿里云NAS文件存储
阿里云文件存储NAS是一个弹性扩展,高可靠,高可用,高性能的分布式文件系统。它基于 POXIS 文件接口,天然适配原生操作系统,共享访问,同时保证一致性和锁互斥,并且性能随容量线性扩展。
阿里云文件存储NAS架构:
第一层是计算层,使用标准文件协议NFS/SMB或兼容posix的定制化客户端来访问文件存储。第二层是阿里云网络负载均衡ALB,把客户端请求轮转发送到前端机。第三层是负责协议处理的前端机,协议尽量做到无状态,涉及状态部分下沉到元数据管理层。第四层是元数据管理,把目录树结构转变成key-value对,通过基于log structure merge tree的分布式key-value来实现。第五层是元数据和数据持久化在盘古,使用盘古的分布式存储量提供高达10PB,和99.999999999%的数据可靠性,容量可弹性扩展,按需使用。
元数据和数据分离,NAS Protocol前端机IO直连盘古,把数据位置信息和元数据一起更新,前端机通过元数据更新盘古文件的信息。盘古文件是会散在整个集群的,所以前端机读写可充分利用整个集群的IO能力,最高可提供50K的IOPS和20GB/s的带宽吞吐量。
安全隔离,基于VPC安全组提供网络隔离和ACL访问控制,保证海量容器使用共享存储时的数据安全隔离。同时提供容器到文件存储的传输加密,保障数据传输过程在不被窃取和篡改。
数据备份,阿里云文件存储提供文件系统级的数据备份功能,可以基于灵活的备份策略提供多副本的数据保护,在发生数据误删除,错误修改的情景时,可以使用历史副本恢复容器数据。
4 阿里云容器服务解决方案
4.1 解决方案架构
4.2 阿里云容器解决方案设计关注点
易用性:
- 一键创建容器集群。
- 基于容器的一站式应用生命周期管理。
- 整合阿里云NAS文件存储,容量按需弹性扩展。
- 支持图形化界面和 OpenAPI。
安全可控:
- 在阿里云容器服务中,容器运行在用户自己的 ECS 节点上,不会和其他用户共享,容器之间安全隔离。
- 网络上,用户可以通过安全组定义容器集群内 ECS 节点和容器的访问策略,允许或者拒绝某些来源的地址访问容器。
- 容器集群的管理 API 使用双向证书校验,避免接口被非法用户访问。
- 专门的容器安全解决方案,如 neuvector,可以很方便地集成到阿里云容器服务上,提供更高层次的安全防护。
高效可靠,高性能:
- 支持海量容器秒级启动。
- 共享文件存储,支持容器的异常恢复和自动伸缩,数据不丢失。
- 支持跨可用区的容器调度。
5 阿里云容器和存储业务部署配置
5.1 Kubernets集群部署
1.创建Kubernets集群
2.确认集群配置
3.集群开始自动创建部署
4.集群创建成功
5.2 阿里云NAS文件存储部署
1.创建NAS文件系统
2. 添加挂载点
3.成功添加挂载点,挂载地址用于后续对接容器使用
5.3 Kubernets集群对接NAS存储
1.为集群创建存储卷
2. 成功创建NAS存储卷
5.4 发布一个Nginx容器应用
1.创建应用容器
2.配置容器镜像、存储和网络
镜像选择:
存储配置,选择NAS文件存储作为数据存储:
集群网络服务配置:
集群网络路由配置:
3.Nginx容器应用部署成功:
4.在主机测试Nginx,打开浏览器输出www.test.com域名,服务正常: