容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
.cn 域名,1个 12个月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本文介绍如何在半小时内,通过阿里云容器ACK服务和CNFS容器网络文件系统服务搭建一个简单的弹性、高可用NGINX网站。在完成本文的所有操作后,您将获得一个单网页的网站,用户的请求将会被打散到多个容器节点上,并且根据业务负载自动扩缩容,即使某个容器节点宕机也不会影响用户访问。另外您还可以将本地编辑的网页快速更新到网站上。

本文介绍如何在半小时内,通过阿里云容器ACK服务和CNFS容器网络文件系统服务搭建一个简单的弹性、高可用NGINX网站。在完成本文的所有操作后,您将获得一个单网页的网站,用户的请求将会被打散到多个容器节点上,并且根据业务负载自动扩缩容,即使某个容器节点宕机也不会影响用户访问。另外您还可以将本地编辑的网页快速更新到网站上。

目录和架构

本文分为八个段落,完成前六个段落即可实现弹性高可用的NGINX网站,最后两个段落验证网站的弹性和高可用属性。一、创建NAS资源二、上传文件到NAS三、创建ACK集群四、配置NAS挂载信息五、创建NGINX应用六、访问测试网站七、验证服务高可用八、验证弹性扩缩容网站整体架构如下图:

CNFS 是什么:容器网络文件系统CNFS(Container Network File System),将阿里云的文件存储抽象为一个K8s对象(CRD)进行独立管理,包括创建、删除、描述、挂载,监控及扩容等运维操作。容器网络文件系统CNFS提升NAS文件系统的性能,QoS控制。解决文件系统存在的缺少容量配额的精确控制、无法恢复误删文件、缺失存储卷容量性能等监控指标、无安全加密及小文件读写延迟等问题。

一、创建NAS资源

1. 开通NAS服务

阿里云文件存储NAS是一个可共享访问,弹性扩展,高可靠,高性能的分布式文件系统。它可以为容器提供持久化的存储服务。在接下来的操作里,您的网页文件将会被保存在NAS文件系统中,当容器pod被创建后即可直接调用NAS里的文件,并且在pod被销毁后,NAS里的文件也会继续留存。如果您还没有开通NAS服务,请登录NAS开通页面,点击“立即开通”按钮,完成开通流程。

2. 创建通用型NAS

在您开通NAS服务之后,请登录NAS控制台,点击“创建通用型NAS文件系统”,选择您业务所在的地域,然后逐个查看可用区,存储规格选择性能型,最后点击“立即购买”,完成付款。注意查看所选区域内的服务是否可用。例如CNFS在中国内地截止2021年9月10日开通区域有北京/广州/香港。

image.pngimage.png

3. 创建专有网络VPC

为了使容器集群能够挂载使用刚刚创建的NAS文件系统,您需要配置相应的网络环境,包括一个专有网络VPC和一个NAS挂载点。将虚拟交换机和NAS文件系统放在同一个可用区,可以将时延降到最低。如果您在业务所在的地域还没有专有网络VPC,请登录VPC控制台,创建一个专有网络。在填写“交换机”信息时,请选择NAS所在的可用区。image.png

4. 创建NAS挂载点

NAS挂载点是计算平台挂载使用NAS所需的网络入口。如果把容器服务比喻成一台笔记本电脑,把NAS文件系统比喻成一个移动硬盘,那么NAS挂载点就相当于一条USB线,可以将二者连接起来。回到NAS控制台,点击左侧引导栏中的“文件系统列表”,然后在页面最上方选择业务所在的地域,最后点击刚创建的文件系统ID,进入文件系统详情页。进入文件系统详情页后,点击左侧引导栏中的“挂载使用”,点击“添加挂载点”,在对话框中选择“专有网络”、刚刚创建的专有网络VPC、刚刚创建的交换机、“VPC默认权限组”,点击确定,等待NAS挂载点创建完成。image.pngimage.png

二、上传文件到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协议直接访问。image.pngimage.pngimage.pngimage.png

3. 将本地文件上传到NAS

在办公电脑上下载并安装SFTP客户端(例如FileZilla),输入ECS公网地址、用户名root、密码、端口号22,然后点击“Quickconnect”连接到刚创建的ECS。在左侧目录树找到本地创建的index.html文件,在右侧目录树输入“/mnt”,进入NAS目录。最后将左侧区域的index.html拖拽到右侧区域,即可将本地文件上传到NAS。您可以远程连接到ECS,在/mnt目录中找到刚上传的index.html文件。

注意,/mnt下面是nas挂载的一串数字的文件夹,要将index.html放到这个文件夹中。

三、创建ACK集群

容器服务Kubernetes版(也称作ACK)提供托管的K8s容器服务,您可以使用图形化界面实现各种配置,例如挂载NAS、部署应用、配置应用弹性扩展等操作,比自建K8s使用起来方便许多。在接下来的操作里,ACK集群将作为网站的服务端运行NGINX框架,处理用户发来的HTTP请求。登录“容器服务Kubernetes版”控制台,如果需要则完成授权流程,点击“创建集群”。

1. 集群配置

在“集群配置”页面中,填写集群名称,选择NAS所在地域,选择NAS挂载点所在的专有网络VPC和交换机,其余选项保留默认,点击“下一步”继续。image.png

2. Worker配置

在“Worker配置”页面中,选择您业务需要的“实例规格”,配置“登录方式”,点击“下一步”继续。

image.png

3. 组件配置

在“组件配置”页面中,保留默认的“安装Ingress插件”、“公网”负载均衡类型和“CSI”存储插件,点击“下一步”继续。

4. 确认配置

在“确认配置”页面中,检查您的容器集群配置,如果“依赖检查”失败则处理相关问题,勾选同意服务条款,最后点击“创建集群”,等待大约10分钟后,集群创建成功。

四、使用CNFS托管NAS文件系统

传统的共享文件系统存在缺少容量配额的精确控制、无法恢复误删文件、缺失存储卷容量性能等监控指标、无安全加密及小文件读写延迟等问题。容器网络文件系统CNFS提升NAS文件系统的性能,QoS控制。

使用CNFS托管NAS文件系统分为几种类别:1.使用CNFS创建默认NAS文件系统。2.使用CNFS创建自定义的文件系统。3使用已有的NAS文件系统创建CNFS。为了更好的了解CNFS与NAS、容器之间关系,这里选择3,使用已有的文件系统创建CNFS。

1. 通过kubectl工具管理集群

操作步骤:

  • 在ACK集群管理控制台,点击集群名称,点击链接信息。复制集群凭证。

  • 在ECS控制台中,找到ACK的worker节点,点击远程连接。

  • 在创建$home/.kube目录,将集群凭证拷贝到新建config文件中。

  • 运行kubectl get pv 如无报错,则说明配置成功。具体

参考链接通过kubectl工具连接集群

2.使用已有的NAS文件系统创建CNFS

执行以下内容使用已有的NAS文件系统创建CNFS,其中nas-mount-target.nas.aliyuncs.com替换实际ID。nas-mount-target.nas.aliyuncs.com可以通过NAS控制台,选择文件系统列表,点击管理,选择挂载使用,点击通过命令行挂载,找到sudo mount的参数中可以看到。

 # 当NAS文件系统存在时,加载已创建的NAS文件系统
cat <<EOF | kubectl apply -f -
apiVersion: storage.alibabacloud.com/v1beta1
kind: ContainerNetworkFileSystem
metadata:
  name: cnfs-nas-filesystem
spec:
  description: "cnfs"
  type: nas
  reclaimPolicy: Retain
  parameters:
    server: nas-mount-target.nas.aliyuncs.com
EOF
image.png

通过命令kubectl get cnfs查看nas文件系统。

通过命令kubectl get cnfs/cnfs-nas-filesystem -o yaml 查看详细信息。

3.通过PV绑定NAS文件系统

通过创建动态PV绑定NAS文件系统

cat <<EOF | kubectl apply -f -
apiVersion: storage.K8s.io/v1
kind: StorageClass
metadata:
  name: alibabacloud-nas-cnfs
mountOptions:
  - nolock,tcp,noresvport
  - vers=3
parameters:
  volumeAs: subpath
  containerNetworkFileSystem: cnfs-nas-filesystem
  path: "/"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
allowVolumeExpansion: true
EOF

通过命令kubectl get pv查看是否创建成功。

4.创建PVC

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cnfs-nas-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: alibabacloud-nas-cnfs
  resources:
    requests:
      storage: 70Gi
EOF

在页面上验证已经创建PVC

回到ACK控制台,点击集群名称,选择左侧存储、存储卷,查看右侧已经创建成功。

image.png

此部分详细步骤可以参考链接使用CNFS托管NAS文件系统

五、创建NGINX应用

完成上述准备工作后,就可以部署NGINX应用了。在ACK集群详情页面中,点击左侧引导栏中的“工作负载”,在默认的“无状态”标签页中,点击“使用镜像创建”。

1. 应用基本信息

在“应用基本信息”页面中,填写应用名称。

2. 容器配置

在“容器配置”页面中,点击“选择镜像”,弹出对话框。如果需要的话点击开通镜像服务,点击“搜索”,选择“Docker镜像”,填写“nginx”,点击“搜索”,在搜索结果中点击“nginx”官方镜像一行,最后点击“确定”从对话框中退出。此时“镜像名称”一栏应该显示“nginx”。将“容器配置”页面拉到最下方,点击“增加云存储声明(PersistentVolumeClaim)”,选择刚创建的存储声明作为“挂载源”,在“容器路径”一项填写“/usr/share/nginx/html/”。这项配置会将NAS挂载到容器的“/usr/share/nginx/html/”路径,也就是NGINX默认存放index.html的目录。此页面其他配置保留默认值即可,点击页面右侧的“下一步”橘红色按钮继续。image.png

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负载下降。五分钟后查看“容器组水平伸缩器”,确认自动缩容成功。用浏览器打开网站,发现仍然可以正常访问。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
17天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
17天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
48 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
23天前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
11天前
|
Linux 调度 Docker
容器网络概述
【9月更文挑战第9天】容器技术利用如命名空间(namespace)和控制组(cgroup)等技术创建隔离环境,实现资源限制与独立运行。命名空间避免命名冲突,cgroup则能对CPU、内存等资源进行限制。容器状态可通过镜像保存并标准化,确保在任何环境中都能复现相同状态。
|
1月前
|
应用服务中间件 Linux nginx
Linux虚拟机磁盘扩容、Docker容器磁盘满的问题、Docker安装nginx
这篇文章讨论了Linux虚拟机磁盘扩容的方法,包括外部配置、具体扩容步骤和扩容后的效果验证。同时,文章还涉及了Docker容器磁盘满的问题及其解决方法,如删除不必要的镜像和容器,以及调整Docker的安装路径。此外,还提到了意外情况的处理,例如误删除停止的容器后的应对措施。最后,文章还提供了使用Docker安装nginx的步骤和成功访问的截图。
Linux虚拟机磁盘扩容、Docker容器磁盘满的问题、Docker安装nginx
|
1月前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
52 1
|
21天前
|
Kubernetes Cloud Native 网络安全
云原生入门指南:Kubernetes和容器化技术云计算与网络安全:技术融合的新篇章
【8月更文挑战第30天】在云计算的浪潮中,云原生技术如Kubernetes已成为现代软件部署的核心。本文将引导读者理解云原生的基本概念,探索Kubernetes如何管理容器化应用,并展示如何通过实践加深理解。
|
1月前
|
存储 Ubuntu Linux
NFS服务部署全攻略:从零到一,轻松驾驭网络文件系统,让你的文件共享像飞一样畅快无阻!
【8月更文挑战第5天】NFS(网络文件系统)能让网络中的电脑无缝共享文件与目录。基于客户端-服务器模式,用户可像访问本地文件般透明操作远程文件。部署前需准备至少两台Linux机器:一台服务器,其余作客户端;确保已装NFS相关软件包且网络通畅。服务器端安装NFS服务与rpcbind,客户端安装nfs-utils。
59 4
|
1月前
|
弹性计算 运维 负载均衡
基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
【8月更文挑战第3天】基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
|
26天前
|
网络协议 网络安全 网络架构
【Azure 容器应用】在中国区Azure上创建的容器服务默认应用域名不全
【Azure 容器应用】在中国区Azure上创建的容器服务默认应用域名不全