介紹如何在半小時內,通過阿里雲容器ACK服務和容器網絡文件系統CNFS服務搭建一個簡單的彈性、高可用NGINX網站。,11 月 9 日至 11 月 23 日期間,完成部署即可獲得“TOMY 多美卡合金車模一輛”。

地址:https://developer.aliyun.com/adc/series/activity/1111
體驗目標
本文介紹如何在半小時內,通過阿里雲容器ACK服務和容器網絡文件系統CNFS服務搭建一個簡單的彈性、高可用NGINX網站。在完成本文的所有操作后,您將獲得一個單網頁的網站,用戶的請求將會被打散到多個容器節點上,並且根據業務負載自動擴縮容,即使某個容器節點宕機也不會影響用戶訪問。另外您還可以將本地編輯的網頁快速更新到網站上。
背景知識
本教程使用到的雲產品如下:
雲服務器ECS
雲服務器(Elastic Compute Service,簡稱ECS)是阿里雲提供的性能卓越、穩定可靠、彈性擴展的IaaS(Infrastructure as a Service)級別雲計算服務。雲服務器ECS免去了您采購IT硬件的前期准備,讓您像使用水、電、天然氣等公共資源一樣便捷、高效地使用服務器,實現計算資源的即開即用和彈性伸縮。阿里雲ECS持續提供創新型服務器,解決多種業務需求,助力您的業務發展。
文件存儲NAS
阿里雲文件存儲(Network Attached Storage,簡稱 NAS)是面向阿里雲 ECS 實例、E-HPC 和容器服務等計算節點的文件存儲服務。NAS 提供了簡單的可擴展文件存儲以供與 ECS 配合使用,多個ECS實例可以同時訪問 NAS 文件系統,並且存儲容量會隨着您添加和刪除文件而自動彈性增長和收縮,為在多個實例或服務器上運行的工作負載和應用程序提供通用數據源。
容器服務Kubernetes版
阿里雲容器服務Kubernetes版ACK(Alibaba Cloud Container Service for Kubernetes)是全球首批通過Kubernetes一致性認證的服務平台,提供高性能的容器應用管理服務,支持企業級Kubernetes容器化應用的生命周期管理,讓您輕松高效地在雲端運行Kubernetes容器化應用。
容器網絡文件系統CNFS
傳統的共享文件系統存在缺少容量配額的精確控制、無法恢復誤刪文件、缺失存儲卷容量性能等監控指標、無安全加密及小文件讀寫延遲等問題。阿里雲容器服務ACK推出了容器網絡文件系統CNFS提升NAS文件系統的性能,QoS控制。阿里雲容器服務使用容器網絡文件系統CNFS(Container Network File System),將阿里雲的文件存儲抽象為一個K8s對象(CRD)進行獨立管理,包括創建、刪除、描述、掛載,監控及擴容等運維操作。
本教程七個步驟,完成前六個步驟即可實現彈性高可用的NGINX網站,最后兩個步驟驗證網站的彈性和高可用屬性。
步驟一:創建資源
步驟二:掛載文件系統NAS到ECS服務器
步驟三:上傳文件到NAS
步驟四:使用CNFS托管NAS文件系統
步驟五:創建NGINX應用
步驟六:訪問測試網站
步驟七:驗證服務高可用
步驟八:驗證彈性擴縮容
網站整體架構如下圖:

體驗准備
體驗需使用自己的賬戶開通以上服務
ECS資源地址
掛載文件系統NAS到ECS服務器
阿里雲文件存儲NAS是一個可共享訪問,彈性擴展,高可靠,高性能的分布式文件系統。它可以為容器提供持久化的存儲服務。在接下來的操作里,您的網頁文件將會被保存在NAS文件系統中,當容器pod被創建后即可直接調用NAS里的文件,並且在pod被銷毀后,NAS里的文件也會繼續留存。
1.雙擊打開虛擬桌面的Firefox ESR瀏覽器,在RAM用戶登錄框中點擊“下一步”,復制雲產品資源列表中子用戶密碼,粘按CTRL+V把密碼粘貼到密碼輸區,登陸子賬戶(后續在遠程桌面里的粘貼操作均使用CTRL + V快捷鍵)。
2.復制以下NAS文件系統控制台地址,在FireFox瀏覽器打開新頁簽,粘貼並訪問NAS文件系統控制台。
https://nasnext.console.aliyun.com/
3.在概覽頁面中,單擊文件系統>文件系統列表。

4.在文件系統列表頁面,切換到資源所在地域。
說明 :
參考如下圖片切換地域到華北2(北京)。

5.在文件系統列表頁面,單擊目標NAS實例文件系統ID。

6.在文件系統詳情頁,單擊掛載使用。

7.在掛載使用頁簽, 單擊目標掛載點操作列的掛載。

8.在掛載到ECS對話框,ECS實例選擇雲產品資源列表中的ECS實例,掛載路徑設置為/mnt,單擊掛載。

返回如下頁面,待掛載狀態為已掛載,表示NAS已成功掛載到ECS上。

上傳文件到NAS
使用ACK集群搭建NGINX服務后,在您打開網站首頁時,容器就會從NAS文件系統中讀取這一步上傳的網頁文件,返回給瀏覽器。在網站搭建完成后,您可以通過同樣的方法更新NAS里的文件。
1、點擊瀏覽器右側 ,切換至Web Terminal。
2、輸入以下命令,創建並上傳index.html文件至Nas。
echo "test index page for nginx-nas-demo" > /mnt/index.html
3、 輸入以下命令,在/mnt目錄中查看剛上傳的index.html文件。
ls /mnt
cat /mnt/index.html

使用CNFS托管NAS文件系統
傳統的共享文件系統存在缺少容量配額的精確控制、無法恢復誤刪文件、缺失存儲卷容量性能等監控指標、無安全加密及小文件讀寫延遲等問題。容器網絡文件系統CNFS提升NAS文件系統的性能,QoS控制。
要使用ACK服務掛載使用NAS,需要先配置容器存儲卷PV和存儲聲明PVC信息,這些信息將會在您部署NGINX應用的時候用到。
使用已有的NAS文件系統創建CNFS。
1)點擊體驗實驗室右側圖標,切換到遠程桌面操作界面。
2)復制容器服務ACK控制台地址,在FireFox瀏覽器打開新頁簽,粘貼並訪問容器服務ACK控制台。
https://cs.console.aliyun.com/
3)在集群列表頁面中,單擊目標集群名稱。

4)在集群信息頁面中,單擊通過CloudShell管理集群。

返回如下頁面,代表你已打開CloudShell。

5)在在虛擬桌面左下角,單擊 圖標。

6)在菜單欄中,單擊附件>Mousepad。

返回如下頁面,表示你已成功打開Mousepad。

7)復制如下命令,粘貼到Mousepad。在Mousepad中將命令的parameters.server參數替換成您的NAS的掛載點URL地址,然后復制Mousepad中的所有命令。
注意:
parameters.server參數需要替換成您的NAS的掛載點URL地址。NAS的掛載點URL地址可以通過NAS文件系統控制台>文件系統列表>目標NAS>掛載使用>通過命令行掛載到ECS>掛載NFS文件系統中的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: 17f7e4****-hlm35.cn-beijing.nas.aliyuncs.com
EOF
8)在CloudShell中,右鍵粘貼,將Mousepad中的命令粘貼到CloudShell,然后執行。

9)復制如下命令,在CloudShell中,右鍵粘貼並執行,查看詳細信息。
kubectl get cnfs/cnfs-nas-filesystem -o yaml

2.復制如下命令,在CloudShell中,右鍵粘貼並執行,通過創建動態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
3.復制如下命令,在CloudShell中,右鍵粘貼並執行,創建存儲聲明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
4.在CloudShell上方菜單欄中,單擊 圖標,關閉CloudShell。

5.在切換回容器服務ACK控制台頁面。在左側導航欄中,單擊存儲>存儲卷。

返回如下頁面,表示PV創建成功。

6.在存儲卷頁面左側控制台,單擊存儲>存儲類。

返回如下頁面,表示PVC創建成功。

7.點擊瀏覽器右側,切換至Web Terminal。
8.執行如下命令,進入mnt目錄。
cd /mnt

9.執行如下命令,查看mnt目錄。
ls

10.將如下命令中的/nas-xxxxx替換成您的mnt目錄下的存儲卷名稱,然后執行,將index.html移動到此目錄下。
mv index.html nas-xxxxx

創建NGINX應用
1點擊體驗實驗室右側圖標,切換到遠程桌面操作界面。
2在存儲類頁面左側控制台,單擊工作負載>無狀態。

3在無狀態頁面,單擊使用鏡像創建。

4在應用基本信息頁簽,設置應用名稱為nginx-nas,單擊下一步。

5在容器配置頁簽,完成以下配置。
1)在基本配置區域,單擊選擇鏡像。

2)在鏡像選擇對話框中,單擊搜索,選擇Docker鏡像,在搜索框中輸入nginx,單擊搜索。

3)在鏡像選擇對話框中,單擊nginx鏡像,然后單擊確定。

4)在數據卷區域,單擊增加雲存儲聲明(PersistentVolumeClaim),掛載源選擇為步驟二中創建的存儲聲明(即cnfs-nas-pvc),容器路徑設置為/usr/share/nginx/html/。在配置概述區域,單擊下一步。
說明 :
數據卷配置會將NAS掛載到容器的/usr/share/nginx/html/路徑,也就是NGINX默認存放index.html的目錄。


6在高級配置頁簽,完成以下配置。
1)在訪問設置區域,單擊服務(Service)右側的創建。

2)在創建服務對話框的端口映射配置中,名稱設置為http,服務端口設置為80,容器端口設置為80,其他選項保持默認值,單擊創建。
注意 :
名稱http必須全部小寫,否則會創建失敗。

3)在訪問設置區域,單擊路由(Ingress)右側的創建。

4)在創建對話框的規則配置中,設置域名和名稱,其他選項保持默認值,單擊創建。
參數說明:
域名:您的網站域名,例如:foo.bar.com。
說明 :
如果您沒有域名,可以先隨意填寫一個測試域名即可。
名稱:選擇上一步創建的nginx-nas-svc服務。

路由創建完成后,您可以看到路由一欄應該顯示域名與對應服務的信息。路由功能會將用戶請求通過簡單扇出的方法,打散到多個容器節點上進行處理。

5)在伸縮配置區域,單擊指標伸縮的開啟,最小副本數設置為2,最后單擊最下方的創建。

7在高級配置頁簽下方,單擊創建。

返回如下頁面,等待所有應用任務創建狀態為成功,表示您的應用已經創建完成。

訪問測試網站
等待NAS和容器的配置完成后,您就可以使用本地電腦訪問測試網站了。
配置辦公電腦的hosts文件。
說明:
如果您在NGINX應用配置中,使用的是正式網站域名,並且已經通過備案,您就可以跳過這個步驟,直接通過瀏覽器打開網站。如果您使用的是測試域名(例如foo.bar.com),那么就需要在本地電腦上配置hosts文件,讓瀏覽器把對域名的請求轉到ACK集群的IP地址上。
1.在創建完成頁簽中,單擊查看應用詳情。

2)在應用詳情頁面,單擊訪問方式。

3)復制路由的端點IP地址到粘貼板,這個IP地址就是公網訪問網站使用的IP地址。
4)使用管理員權限打開您本地的C:\Windows\System32\drivers\etc\hosts文件,將端點IP和步驟五中設置的域名(例如foo.bar.com)加入hosts文件,然后保存退出,如下圖所示。
說明 :
如果您本地機器是Linux和Mac系統,請修改/etc/hosts文件。

- 使用瀏覽器打開網站。
說明 :
如果您不能正常訪問,您可以嘗試清空瀏覽器緩存,或者使用無痕瀏覽模式訪問。

驗證服務高可用
因為部署NGINX應用的時候,選擇了容器組最小副本數為2,所以在一台容器宿主節點宕機的情況下,網站仍然可以由另一台容器宿主節點提供服務,保證了服務的高可用特性。
1、模擬節點故障。
1)切換回容器服務ACK控制台頁面。在左側導航欄中,單擊節點管理>節點。

2)節點頁面,選擇任意2個節點,然后單擊下面操作欄排水/設置不可調度。

3)在水/設置不可調度對話框中,勾選排空節點,然后單擊確定。

此時,可以看到節點狀態為不可調度。

4)使用本機瀏覽器打開網站,發現仍然可以正常訪問。

2、 恢復節點。
1)單擊下面操作欄節點上線在彈出的對話框單擊確定。
2)使用瀏覽器打開網站,發現仍然可以正常訪問。

驗證彈性擴容
- 查看容器組初始狀態。
1)在節點頁面左側導航欄中,單擊無狀態。

2)在無狀態頁面,單擊應用名稱。

3)在應用詳情頁面,單擊容器伸縮。

返回如下頁面,您可以查看當前副本數和容器組當前當前CPU使用率。

- 模擬容器高負載。
1)在容器伸縮頁簽的左側導航欄中,單擊集群信息

2)在集群詳情頁面,單擊通過CloudShell管理集群。

3)復制如下命令,在CloudShell中,右鍵粘貼並執行,執行以下命令查看節點。
kubectl get pod

4)復制如下命令,在CloudShell中,右鍵粘貼並執行,進入容器。
kubectl exec -it lalala-***pod-name****-kxjbg bash
5)復制如下命令,在CloudShell中,右鍵粘貼並執行,模擬容器高負載。
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
- 確認自動擴容。
1)在集群詳情頁面左側導航欄中,單擊無狀態。

2)在無狀態頁面,單擊應用名稱。

3)在應用詳情頁面,單擊容器伸縮。

4)稍等一點時間,您可以看到當前CPU使用率明顯升高。

等待幾分鍾后再次查看,發現當前副本數已經變為10。

c. 此時,使用瀏覽器打開網站,發現仍然可以正常訪問。

- 解除容器高負載。
a. 進入CloudShell命令行。
b. 在命令行中執行以下命令。
# 退出容器
exit
# 刪除
kubectl delete pod lalala-***pod-name****-kxjbg
- 確認自動縮容。
單擊容器組水平伸縮器查看當前副本數和容器組當前當前CPU使用率。
可以看到CPU使用率和副本數明顯下降。

