玩转容器持久化存储,点我进入活动页面
目录和架构
本文分为八个段落,完成前六个段落即可实现弹性高可用的NGINX网站,最后两个段落验证网站的弹性和高可用属性。
一、创建NAS资源
二、上传文件到NAS
三、创建ACK集群
四、配置NAS挂载信息
五、创建NGINX应用
六、访问测试网站
七、验证服务高可用
八、验证弹性扩缩容
网站整体架构如下图:
一、创建NAS资源
1. 开通NAS服务
阿里云文件存储NAS是一个可共享访问,弹性扩展,高可靠,高性能的分布式文件系统。它可以为容器提供持久化的存储服务。在接下来的操作里,您的网页文件将会被保存在NAS文件系统中,当容器pod被创建后即可直接调用NAS里的文件,并且在pod被销毁后,NAS里的文件也会继续留存。
如果您还没有开通NAS服务,请登录NAS开通页面,点击“立即开通”按钮,完成开通流程。
2. 创建极速型NAS
网站服务需要存储系统提供低时延性能,所以极速型文件系统(时延0.3毫秒)最适合这种场景。其他NAS类型,如通用容量型主要适用于大容量文件存储类应用,通用性能型主要适用于高带宽文件访问类应用。
在您开通NAS服务之后,请登录NAS控制台,点击“创建极速型NAS文件系统”,选择您业务所在的地域,然后逐个查看可用区,直到“类型”一项显示“高级型”,最后点击“立即购买”,完成付款。
3. 创建专有网络VPC
为了使容器集群能够挂载使用刚刚创建的NAS文件系统,您需要配置相应的网络环境,包括一个专有网络VPC和一个NAS挂载点。将虚拟交换机和NAS文件系统放在同一个可用区,可以将时延降到最低。
如果您在业务所在的地域还没有专有网络VPC,请登录VPC控制台,创建一个专有网络。在填写“交换机”信息时,请选择NAS所在的可用区。
4. 创建NAS挂载点
NAS挂载点是计算平台挂载使用NAS所需的网络入口。如果把容器服务比喻成一台笔记本电脑,把NAS文件系统比喻成一个移动硬盘,那么NAS挂载点就相当于一条USB线,可以将二者连接起来。
回到NAS控制台,点击左侧引导栏中的“文件系统列表”,然后在页面最上方选择业务所在的地域,最后点击刚创建的文件系统ID,进入文件系统详情页。
进入文件系统详情页后,点击左侧引导栏中的“挂载使用”,点击“添加挂载点”,在对话框中选择“专有网络”、刚刚创建的专有网络VPC、刚刚创建的交换机、“VPC默认权限组”,点击确定,等待NAS挂载点创建完成。
二、上传文件到NAS
完成NAS的创建和配置后,您就可以将网页文件上传到NAS文件系统了。详细信息可以参考这篇文档。
在下文使用ACK集群搭建NGINX服务后,在用户请求打开网站首页时,容器就会从NAS文件系统中读取这一步上传的网页文件,返回给用户的浏览器。在网站搭建完成后,您可以通过同样的方法更新NAS里的文件。
1. 本地创建index.html
打开办公电脑上的纯文本编辑器(比如Windows的记事本),输入“test index page for nginx-nas-demo”,保存为index.html,请注意文件扩展名必须是html。
如果您使用的是MacOS或Linux系统,可以复制粘贴以下命令,创建并保存index.html文件到Documents/nginx-nas-demo目录下。
mkdir -p ~/Documents/nginx-nas-demo
echo "test index page for nginx-nas-demo" > ~/Documents/nginx-nas-demo/index.html
2. 配置SFTP服务器
在index.html创建完毕后,可以购买一台ECS搭建SFTP服务,将文件上传到NAS。
登录ECS控制台,点击“创建实例”,选择与NAS相同的地域及可用区,然后选择一台小规格实例即可。在“镜像”部分,选择Alibaba Cloud Linux的LTS版本。然后在“存储”部分,点击“共享盘NAS”,“增加文件存储”,选择刚创建的NAS文件系统和挂载点,填写“/mnt”作为挂载路径,选择“NFSv3协议”。
点击“下一步”,进入“网络和安全组”配置页面。点击“分配公网IPv4地址”,带宽峰值选择最高的“100Mbps”,选择合适的安全组,保留其他默认选项即可。
点击“下一步”,进入“系统配置”配置页面。选择“自定义密码”,配置密码,填写实例名称。
一直点击“下一步”,点击“创建实例”,最后点击“管理控制台”,找到ECS的公网地址。
这台ECS创建成功后,即会自动挂载刚创建的NAS文件系统,并且可以使用SFTP协议直接访问。
3. 将本地文件上传到NAS
在办公电脑上下载并安装SFTP客户端(例如FileZilla),输入ECS公网地址、用户名root、密码、端口号22,然后点击“Quickconnect”连接到刚创建的ECS。
在左侧目录树找到本地创建的index.html文件,在右侧目录树输入“/mnt”,进入NAS目录。
最后将左侧区域的index.html拖拽到右侧区域,即可将本地文件上传到NAS。
您可以远程连接到ECS,在/mnt目录中找到刚上传的index.html文件。
三、创建ACK集群
容器服务Kubernetes版(也称作ACK)提供托管的K8S容器服务,您可以使用图形化界面实现各种配置,例如挂载NAS、部署应用、配置应用弹性扩展等操作,比自建K8S使用起来方便许多。在接下来的操作里,ACK集群将作为网站的服务端运行NGINX框架,处理用户发来的HTTP请求。
登录“容器服务Kubernetes版”控制台,如果需要则完成授权流程,点击“创建集群”、“标准型集群”。
1. 集群配置
在“集群配置”页面中,填写集群名称,选择NAS所在地域,选择NAS挂载点所在的专有网络VPC和交换机,其余选项保留默认,点击“下一步”继续。
2. Worker配置
在“Worker配置”页面中,选择您业务需要的“实例规格”,配置“登录方式”,点击“下一步”继续。
3. 组件配置
在“组件配置”页面中,保留默认的“安装Ingress插件”、“公网”负载均衡类型和“CSI”存储插件,点击“下一步”继续。
4. 确认配置
在“确认配置”页面中,检查您的容器集群配置,如果“依赖检查”失败则处理相关问题,勾选同意服务条款,最后点击“创建集群”,等待大约10分钟后,集群创建成功。
四、配置NAS挂载信息
要使用ACK服务挂载使用NAS,需要先配置容器存储卷PV和存储声明PVC信息,这些信息将会在您部署NGINX应用的时候用到。
1. 配置存储卷
回到ACK集群列表,点击刚刚创建的ACK集群名称,进入集群详情页。
进入集群详情页后,点击左侧引导栏中的“存储卷”,点击“存储卷”标签页,点击“创建”,选择“NAS”存储卷类型,填写存储卷名称,选择NAS挂载点,最后点击“创建”。其他内容保留默认值即可。
2. 配置存储声明
完成存储卷配置后,请点击“存储声明”标签页,点击“创建”,选择“NAS”存储声明类型,填写存储声明名称,选择刚刚创建的存储卷,最后点击“创建”。其他内容保留默认值即可。
五、创建NGINX应用
完成上述准备工作后,就可以部署NGINX应用了。
在ACK集群详情页面中,点击左侧引导栏中的“工作负载”,在默认的“无状态”标签页中,点击“使用镜像创建”。
1. 应用基本信息
在“应用基本信息”页面中,填写应用名称。
2. 容器配置
在“容器配置”页面中,点击“选择镜像”,弹出对话框。如果需要的话点击开通镜像服务,点击“搜索”,选择“Docker镜像”,填写“nginx”,点击“搜索”,在搜索结果中点击“nginx”官方镜像一行,最后点击“确定”从对话框中退出。此时“镜像名称”一栏应该显示“nginx”。
将“容器配置”页面拉到最下方,点击“增加云存储声明(PersistentVolumeClaim)”,选择刚创建的存储声明作为“挂载源”,在“容器路径”一项填写“/usr/share/nginx/html/”。这项配置会将NAS挂载到容器的“/usr/share/nginx/html/”路径,也就是NGINX默认存放index.html的目录。
此页面其他配置保留默认值即可,点击页面右侧的“下一步”橘红色按钮继续。
3. 高级配置
在“高级配置”页面中,点击“服务(Service)”右侧的“创建”,弹出对话框。在“端口映射”一栏,填写名称“http”(必须全部小写,不然会创建失败),服务端口“80”,容器端口“80”,其他选项保持默认值,点击“创建”从对话框中退出。此时“服务”一栏应该显示端口映射信息。
点击“路由(Ingress)”右侧的“创建”,弹出对话框。在“域名”一项填写您的网站域名(例如测试域名“foo.bar.com”),然后在“服务”一项选择刚创建的服务,其他选项保持默认值,点击“创建”从对话框中退出。此时“路由”一栏应该显示域名与对应服务的信息。路由功能会将用户请求通过简单扇出的方法,打散到多个容器节点上进行处理。
点击“开启”容器组水平扩容,“最小副本数”填写“2”(保证一台容器节点宕机后网站仍可访问)。
此页面其他配置保留默认值即可,点击最下方的“创建”,等待完成。
六、访问测试网站
以上NAS和容器的配置完成后,您就可以从办公电脑访问测试网站了。
1. 配置办公电脑的hosts文件
如果您在NGINX应用配置中,使用的是正式网站域名,并且已经通过备案,就可以跳过这个步骤,直接通过浏览器打开网站。如果您使用的是测试域名(例如foo.bar.com),那么就需要在办公电脑上配置hosts文件,让浏览器把对域名的请求转到ACK集群的IP地址上。
进入ACK控制台的工作负载页面,点击刚创建的NGINX服务名称,点击“访问方式”标签页,将路由的“端点”IP地址复制到粘贴板,这个IP地址就是公网访问网站使用的IP地址。
最后用root身份打开办公电脑上的hosts文件(MacOS和Linux系统的/etc/hosts文件),将域名和IP地址添加到最后一行,保存退出。
2. 使用浏览器打开网站
打开浏览器,清空浏览器缓存,或者打开隐秘浏览模式,输入域名,即可打开网站。
七、验证服务高可用
因为部署NGINX应用的时候,选择了容器组最小副本数为2,所以在一台容器宿主节点宕机的情况下,网站仍然可以由另一台容器宿主节点提供服务,保证了服务的高可用特性。
1. 模拟宿主节点故障
在NGINX服务页面中,找到容器组所在的一台宿主节点IP地址。
登录ECS控制台,按照IP地址找到这台ECS,强制停止。
回到NGINX服务页面中,大约一分钟后即可看到这台宿主节点停止工作。
用浏览器打开网站,发现仍然可以正常访问。
2. 恢复宿主节点
在ECS控制台上启动容器宿主节点后,容器组状态即恢复正常。网站仍可正常访问。
八、验证弹性扩缩容
为了方便演示,以下示例中将保持一台容器宿主节点关机,以便模拟另一台节点高负载的场景。
1. 检查初始状态
查看宿主节点情况,确认CPU使用率低。
查看“容器组水平伸缩器”,确认“当前副本数”为2。
2. 模拟容器高负载
通过ECS控制台的“远程连接”功能,登录以上宿主节点,进入容器实例,执行以下命令模拟容器高负载。
fulload() { dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null & }; fulload; read
3. 确认自动扩容
从ACK控制台上观察到宿主节点的CPU负载升高。
五分钟后查看“容器组水平伸缩器”,确认自动扩容成功。
用浏览器打开网站,发现仍然可以正常访问。
4. 解除容器高负载
在ECS控制台强制重启宿主节点,解除高负载。
5. 确认自动缩容
从ACK控制台上观察到宿主节点的CPU负载下降。
五分钟后查看“容器组水平伸缩器”,确认自动缩容成功。
用浏览器打开网站,发现仍然可以正常访问。
更多资料
•阿里云容器存储解决方案 https://www.aliyun.com/solution/datatest/containernas
•阿里云文件存储 NAS https://www.aliyun.com/product/nas
•阿里云文件存储 CPFS https://www.aliyun.com/product/nas_cpfs
•阿里云容器服务 ACK https://www.aliyun.com/product/kubernetes
•阿里云 Serverless 容器服务 ASK https://www.aliyun.com/product/cs/ask
•阿里云开发者社区-阿里云存储服务 https://developer.aliyun.com/group/storage