使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

本文來源 | 雲+社區專欄文章

作者 | 楊澤華,騰訊雲高級解決方案架構師。8年大型互聯網公司從業經驗,5年雲計算行業工作經驗。對雲計算平臺基礎架構、網絡架構等有深入的理解。專注於互聯網行業高可用方案、多活方案、遷移方案設計。

本文描述如何使用騰訊雲容器服務(TKE)實現跨可用區的應用高可用部署,包含如下內容:

1.高可用部署架構

2.使用容器服務(TKE)進行高可用部署

3.關於親和性和反親和性說明

4.總結

01高可用部署架構

IDC在全球範圍內,針對多個行業的中小型企業(員工數小於1000名)的調研顯示,近80%的公司預計,雲服務器每小時的停機成本至少在2萬美元以上,而超過20%的企業估算其雲服務器每小時的停機成本至少為10萬美元。

由此可見,雲服務器停機對於雲上企業的損失不容小覷,雲服務商高可用方案越來越成為企業上雲最重要的選擇標準之一。在“上雲”已經成為共識之後,如何進行高可用部署呢?

傳統模式下,使用雲主機實現高可用部署的架構圖如下:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

雲主機實現高可用部署

將雲主機分散在不同的可用區,利用負載均衡(CLB)支持跨可用區分發的特性,實現業務流量跨可用區分發。當一個可用區(AZ)出現故障時,流量切換到另一個可用區(AZ),由此實現高可用部署。

使用雲主機搭建業務環境,需要在雲主機上部署web服務器(Nginx,Tomcat等),然後再部署業務代碼,隨著業務規模的增大,發佈、部署的時間會變長。

隨著容器的盛行,越來越多的企業採用DevOps, 使用容器部署業務。本文描述瞭如何使用騰訊雲容器服務(TKE)進行業務高可用部署。部署架構如下:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

兩個Node節點分佈位於同一個地域的兩個可用區,兩個業務的Pod分佈部署在2個Node上,使用CLB實現流量負載均衡。

下面我們看看如何使用騰訊雲容器快速的實現應用高可用部署。

02使用容器服務(TKE)進行高可用部署

在本文中我們使用一個簡單的swagger應用作為示例,實現高可用部署。swagger-ui的下載地址:https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/installation.md。

在docker的鏡像倉庫裡已經有了製作好的swaggerui鏡像,可以直接使用。 也可以自己下載源碼製作成鏡像。 我們使用docker鏡像倉庫裡的鏡像。

登陸騰訊雲容器控制檯,

https://console.cloud.tencent.com/tke2/cluster?rid=8 創建一個容器集群。

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

容器集群創建成功之後,創建新的節點:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

這裡添加2個節點,分別分佈到2個可用區:北京二區、北京三區:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

添加成功後如下圖:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

集群創建成功後下面製作鏡像。

製作鏡像

首先我們創建一個鏡像倉庫,設置為公有:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

騰訊雲registry使用指引方法如下:

登錄騰訊雲docker registry

sudo docker login --username=100002678805 ccr.ccs.tencentyun.com

從registry拉取鏡像

sudo docker pull ccr.ccs.tencentyun.com/zehua/swaggerui:[tag]

將鏡像推送到registry

sudo docker login --username=100002678805 ccr.ccs.tencentyun.com
sudo docker tag [ImageId] ccr.ccs.tencentyun.com/zehua/swaggerui:[tag]
sudo docker push ccr.ccs.tencentyun.com/zehua/swaggerui:[tag]

下面我們按照上面的方法將swagger的鏡像推送到剛剛創建的鏡像倉庫。

SSH登陸到其中一臺容器節點,拉取swaggerui鏡像,執行命令:

docker pull swaggerapi/swagger-ui

登陸到騰訊雲鏡像倉庫:

docker login --username=100002678805 ccr.ccs.tencentyun.com

給剛剛拉取的swaggerui鏡像打標籤:

docker tag swaggerapi/swagger-ui ccr.ccs.tencentyun.com/zehua/swaggerui:1.2

將swaggerui鏡像推送到騰訊雲鏡像倉庫:

docker push ccr.ccs.tencentyun.com/zehua/swaggerui:1.2

高可用部署

下面進行高可用部署。首先創建deployment,創建deployment時,選擇合適的namespace,如下圖:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

本示例將swagger部署到zehua-ns這個namespace下:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

選擇剛剛創建的swaggerui鏡像:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

注意這裡的端口號是8080。

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

這裡為了演示,Pod數量創建2個,將這2個pod分發到不同的可用區中。你可以根據實際情況選擇合適的pod數量。

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

節點調度策略這裡有2個選擇: 按節點調度,自定義調度規則。可以選擇任意一種方式進行調度。

按節點調度,可以選擇當前容器集群的節點, TKE會將Pod均勻調度到這些節點上。 本示例中創建2個Pod,TKE會將2個Pod分別調度到這2個節點上。

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

如果選擇按自定義規則調度,需要指定節點的標籤。

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

我們給2個節點打了AZ的標籤,分別是bj2,bj3. 打標籤方式如下:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

分別給2個節點新增標籤:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

也可以使用命令行的方式打標籤。 使用kubectl進行添加。傳統模式下,使用雲主機實現高可用部署的架構圖如下:

kubectl get nodes --show-labels
使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

kubectl label nodes 10.0.2.12 az=bj2
kubectl label nodes 10.0.5.17 az=bj3

設置完高可用部署後,進行訪問設置。開啟公網訪問, 注意端口映射的設置:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

完成後點擊創建workload。

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

創建完成後,可以在service裡面看到創建的服務:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

在Pod管理裡可以看到2個Pod被調度到了2個節點上:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

訪問Service裡的負載均衡IP,可以看到部署成功:

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

至此我們完成了業務高可用部署。

03關於親和性和反親和性

通過騰訊雲控制檯查看swagger應用的YAML文件,可以看到,通過控制檯實現Pod調度是通過節點親和性(nodeAffinity:)來實現的。

使用騰訊雲容器服務(TKE)是如何實現應用跨可用區高可用部署的

spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 10.0.2.12
- 10.0.5.17

節點親和性通過指定 preferredDuringSchedulingIgnoredDuringExecution和

requiredDuringSchedulingIgnoredDuringExecution 來實現親和性的軟限制和硬限制。節點親和性的語法支持:In, NotIn, Exists, DoesNotExist, Gt, Lt。 通過這些語法,可以靈活的控制檯節點親和性。本例中使用了http://kubernetes.io/hostname這個默認標籤作為調度,調度到hostname為 10.0.2.12和10.0.5.17的兩個節點上。

如果在節點調度策略裡選擇了“自定義調度規則”, 親和性的實現大概如下:

spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: failure-domain.beta.kubernetes.io/zone
operator: In
values:
- "800002"
- "800003"
weight: 1
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: az
operator: In
values:
- bj2
- bj3

這裡的調度策略使用了節點的AZ標籤,2個pod會被調度到標籤值為bj2,bj3的節點上。 如果有3個pod,某一個節點上會部署2個pod,另一個節點上部署一個pod。

如果希望使用pod affinity的特性,可以通過自己編寫YAML的方式實現。 下一篇文章中將會給出Pod Affinity的示例。

04總結

至此,我們完成了通過騰訊雲容器平臺實現業務跨可用區的高可用部署。通過騰訊雲TKE控制檯,使用K8S節點親和性的功能,可以快速實現業務跨可用區的高可用部署。通過節點親和性的語法規則,可以實現複雜的部署邏輯。騰訊雲TKE控制檯大大簡化了跨可用區部署的複雜性,幫助用戶快速實現業務的高可用。


分享到:


相關文章: