本文來源 | 雲+社區專欄文章node
做者 | 楊澤華,騰訊雲高級解決方案架構師。8年大型互聯網公司從業經驗,5年雲計算行業工做經驗。對雲計算平臺基礎架構、網絡架構等有深刻的理解。專一於互聯網行業高可用方案、多活方案、遷移方案設計。git
本文描述如何使用騰訊雲容器服務(TKE)實現跨可用區的應用高可用部署,包含以下內容:github
1.高可用部署架構web
2.使用容器服務(TKE)進行高可用部署docker
3.關於親和性和反親和性說明api
4.總結服務器
01高可用部署架構網絡
IDC在全球範圍內,針對多個行業的中小型企業(員工數小於1000名)的調研顯示,近80%的公司預計,雲服務器每小時的停機成本至少在2萬美圓以上,而超過20%的企業估算其雲服務器每小時的停機成本至少爲10萬美圓。架構
因而可知,雲服務器停機對於雲上企業的損失不容小覷,雲服務商高可用方案愈來愈成爲企業上雲最重要的選擇標準之一。在「上雲」已經成爲共識以後,如何進行高可用部署呢?負載均衡
傳統模式下,使用雲主機實現高可用部署的架構圖以下:
雲主機實現高可用部署
將雲主機分散在不一樣的可用區,利用負載均衡(CLB)支持跨可用區分發的特性,實現業務流量跨可用區分發。當一個可用區(AZ)出現故障時,流量切換到另外一個可用區(AZ),由此實現高可用部署。
使用雲主機搭建業務環境,須要在雲主機上部署web服務器(Nginx,Tomcat等),而後再部署業務代碼,隨着業務規模的增大,發佈、部署的時間會變長。
隨着容器的盛行,愈來愈多的企業採用DevOps, 使用容器部署業務。本文描述瞭如何使用騰訊雲容器服務(TKE)進行業務高可用部署。部署架構以下:
兩個Node節點分佈位於同一個地域的兩個可用區,兩個業務的Pod分佈部署在2個Node上,使用CLB實現流量負載均衡。
下面咱們看看如何使用騰訊雲容器快速的實現應用高可用部署。
02使用容器服務(TKE)進行高可用部署
在本文中咱們使用一個簡單的swagger應用做爲示例,實現高可用部署。swagger-ui的下載地址:https://github.com/swagger-ap...。
在docker的鏡像倉庫裏已經有了製做好的swaggerui鏡像,能夠直接使用。 也能夠本身下載源碼製做成鏡像。 咱們使用docker鏡像倉庫裏的鏡像。
登錄騰訊雲容器控制檯,
https://console.cloud.tencent... 建立一個容器集羣。
容器集羣建立成功以後,建立新的節點:
這裏添加2個節點,分別分佈到2個可用區:北京二區、北京三區:
添加成功後以下圖:
集羣建立成功後下面製做鏡像。
製做鏡像
首先咱們建立一個鏡像倉庫,設置爲公有:
騰訊雲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,以下圖:
本示例將swagger部署到zehua-ns這個namespace下:
選擇剛剛建立的swaggerui鏡像:
注意這裏的端口號是8080。
這裏爲了演示,Pod數量建立2個,將這2個pod分發到不一樣的可用區中。你能夠根據實際狀況選擇合適的pod數量。
節點調度策略這裏有2個選擇: 按節點調度,自定義調度規則。能夠選擇任意一種方式進行調度。
按節點調度,能夠選擇當前容器集羣的節點, TKE會將Pod均勻調度到這些節點上。 本示例中建立2個Pod,TKE會將2個Pod分別調度到這2個節點上。
若是選擇按自定義規則調度,須要指定節點的標籤。
咱們給2個節點打了AZ的標籤,分別是bj2,bj3. 打標籤方式以下:
分別給2個節點新增標籤:
也可使用命令行的方式打標籤。 使用kubectl進行添加。傳統模式下,使用雲主機實現高可用部署的架構圖以下:
kubectl get nodes --show-labels
kubectl label nodes 10.0.2.12 az=bj2
kubectl label nodes 10.0.5.17 az=bj3
設置完高可用部署後,進行訪問設置。開啓公網訪問, 注意端口映射的設置:
完成後點擊建立workload。
建立完成後,能夠在service裏面看到建立的服務:
在Pod管理裏能夠看到2個Pod被調度到了2個節點上:
訪問Service裏的負載均衡IP,能夠看到部署成功:
至此咱們完成了業務高可用部署。
03關於親和性和反親和性
經過騰訊雲控制檯查看swagger應用的YAML文件,能夠看到,經過控制檯實現Pod調度是經過節點親和性(nodeAffinity:)來實現的。
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
matchExpressions:
operator: In
values:
節點親和性經過指定 preferredDuringSchedulingIgnoredDuringExecution和
requiredDuringSchedulingIgnoredDuringExecution 來實現親和性的軟限制和硬限制。節點親和性的語法支持:In, NotIn, Exists, DoesNotExist, Gt, Lt。 經過這些語法,能夠靈活的控制檯節點親和性。本例中使用了kubernetes.io/hostname這個默認標籤做爲調度,調度到hostname爲 10.0.2.12和10.0.5.17的兩個節點上。
若是在節點調度策略裏選擇了「自定義調度規則」, 親和性的實現大概以下:
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
preference:
matchExpressions:
operator: In
values:
weight: 1
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
matchExpressions:
operator: In
values:
這裏的調度策略使用了節點的AZ標籤,2個pod會被調度到標籤值爲bj2,bj3的節點上。 若是有3個pod,某一個節點上會部署2個pod,另外一個節點上部署一個pod。
若是但願使用pod affinity的特性,能夠經過本身編寫YAML的方式實現。 下一篇文章中將會給出Pod Affinity的示例。
04總結
至此,咱們完成了經過騰訊雲容器平臺實現業務跨可用區的高可用部署。經過騰訊雲TKE控制檯,使用K8S節點親和性的功能,能夠快速實現業務跨可用區的高可用部署。經過節點親和性的語法規則,能夠實現複雜的部署邏輯。騰訊雲TKE控制檯大大簡化了跨可用區部署的複雜性,幫助用戶快速實現業務的高可用。