k8s雲集群混搭模式落地分享

  • 2019 年 10 月 3 日
  • 筆記

  在 《k8s雲集群混搭模式,可能幫你節省50%以上的服務成本》一文中,介紹了使用k8s + 虛擬節點混合集群的方式,為負載具有時間段波峰、波谷交替規律的業務節約成本,提高服務伸縮效率的部署方案。本文對該方案的具體落地步驟與基本運行維護進行分享,為有此需求者提供參考。

部署要求

  1. 應能24小時不間斷提供服務
  2. 在業務高峰期到來前能自動擴展指定數量的容器(提前對業務負載進行評估與壓測,確定容器數)
  3. 在業務高峰期過後能自動收縮到指定數量的容器
  4. 能根據服務負載情況自動彈性伸縮,避免業務突發情況下服務能力跟不上

 

 

基本概念

   Docker

  • 容器:應用運行的形式

  • 鏡像:容器的定義,或打包形式

  • 容器鏡像服務:鏡像倉庫

   

   k8s雲混合集群

  • 集群 —— 託管版、專有版、Serverless版

  • 節點 —— Master Node、Worker Node

  • 命名空間(Namespace) 

  • Pod

  • 副本控制器 (Replication Controller)

  • 副本集(Replica Set)

  • 部署(Deployment)

  • 服務(Service)

  • 標籤(Labels)

  • 存儲卷(Volume)—— PV、PVC

  • Ingress

 

 鏡像準備

    Dockerfile定義,這裡因為涉及到分散式session的支援(參考[redission-tomcat:快速實現從單機部署到多機部署]),所以加了一些相應的jar依賴與替換配置,根據自身實際情況編寫Dockerfile。

FROM tomcat:8.5.43-jdk8-openjdk
# 清除無用或需替換的文件,修改容器時區為上海時區
RUN rm -rf /usr/local/tomcat/webapps/* &&
rm -f /usr/local/tomcat/conf/context.xml &&
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 複製配置文件
COPY ./target/classes/redisson-tomcat/* /usr/local/tomcat/conf/
# 複製需要依賴的jar包
COPY ./dockerimage-depends/*.jar /usr/local/tomcat/lib/
# 替換catalina.sh 解決時區問題
COPY ./dockerimage-depends/catalina.sh /usr/local/tomcat/bin/
# 複製部署war包
COPY ./target/biz-server.war /usr/local/tomcat/webapps/EXPOSE 8080
# 啟動時運行tomcat,覆蓋默認的啟動指令
# 使用catalina.sh run 則catalina.out中日誌列印不充分, 使用startup.sh 因為是後台運行,執行就退出了,docker容器也退出了,所以添加tail -F 讓其保持前台運行
#CMD ["catalina.sh", "run"]
CMD /usr/local/tomcat/bin/startup.sh && tail -F /usr/local/tomcat/logs/catalina.out

 

創建集群(託管版)

參考:https://help.aliyun.com/document_detail/85903.html

專有網路VPC:同一個專有網路中的節點之間,Pod之間可互聯

虛擬交換機:多選擇幾個不同可用區的虛擬交換機

SNAT:如果VPC 不具備公網訪問能力,選中配置SNAT會創建 NAT 網關並自動配置 SNAT 規則。如果使用雲資料庫需要配置IP白名單,或微信公眾號配置IP白名單,則服務需要公網IP,有些ECS節點具有公網IP會優先使用,對於沒有公網IP的節點或虛擬節點,需要配置SNAT獲取公網IP。

 

添加節點

參考:https://help.aliyun.com/document_detail/86919.html

只能添加同一個地域的ECS節點

自動添加:會替換系統盤,原系統盤會被釋放(謹慎!)

手動添加:需在ECS上執行指定命令安裝必要的軟體依賴

 

下圖所示在集群中添加了三個ECS節點與一個虛擬節點(virtual-kubelet)

 

添加虛擬節點

參考:https://help.aliyun.com/document_detail/118970.html

添加虛擬節點時指定虛擬交換機,則只能使用指定虛擬交換機所在的可用區資源(如虛擬交換機在杭州G區,則在虛擬節點上調度Pod時只能調度到G區的服務資源,不能調度到H區或其它區的資源)

虛擬節點配置資訊可隨時更新(如更換虛擬交換機)

 

虛擬節點是通過在應用目錄中添加ack-virtual-node實現

 

創建應用(Deployment)

 鏡像創建:參考 https://help.aliyun.com/document_detail/90406.html

根據模板創建(yaml模板):參考 https://help.aliyun.com/document_detail/86512.html

如下圖所示創建了部署要求中的業務服務,及視覺服務的兩層服務

 

負載均衡

有三種方式可實現某一層服務集群的負載均衡

  • 虛擬集群IP:集群中Pod或Node上可訪問,集群外不能訪問

  • 內網負載均衡:分配內網IP,VPC中可訪問,不一定在集群中

  • 外網負載均衡:分配外網IP,外部可訪問

對於業務服務,需要外網訪問,所以創建外網負載均衡,將域名解析到外網IP;對於兩層視覺服務,只需要在集群中提供訪問,可以使用虛擬集群IP(比內網負載均衡效率高)

 

存儲管理

 目前虛擬節點只支援掛載emptyDir(臨時), NFS(NAS), ConfigFile

 

NAS參考:https://help.aliyun.com/document_detail/27518.html

NAS可掛載到ECS上,通過ssh到ECS來訪問

 

下圖示例了如何將NAS目錄掛載到容器下的某個目錄

手動伸縮

手動對Deployment的Pod進行橫向擴展或縮放

 

 自動伸縮

 根據CPU與記憶體的負載自動進行伸縮

因為一般檢測到負載超過閾值及啟動容器都需要時間,延遲可能對業務造成影響,所以一方面可對負載閾值設置低一點,另一方面如果規律性較高,使用定時伸縮。

 

 定時伸縮

通過cronhpa-controller實現

參考:https://github.com/AliyunContainerService/kubernetes-cronhpa-controller

 

通過模板創建一個定時伸縮應用(注意默認是GMT時間,配置時需要減8小時)

 

目前沒有提供控制台管理,更新指令參考:

#查看  kubectl describe cronhpa cronhpa-herpes-slave  #編輯  kubectl edit cronhpa/cronhpa-herpes-slave -n default  #刪除  kubectl delete cronhpa/cronhpa-herpes-slave -n default    

 

快速構建

首先需要在deployment上創建一個重新部署的觸發器,創建完後會生成一個url,只需要get請求這個url就可以觸發deployment重新拉取鏡像完成部署。

藉助jenkins,實現服務的快速構建。

部署腳本參考

#!/bin/bash

work_dir=/var/lib/jenkins/workspace/$1
depends_dir=/home/jenkins/dockerimage-depends/
# 將額外的依賴jar包複製到docker build的上下文中,便於複製到鏡像里的tomcat目錄下
cp -R $depends_dir $work_dir
# 在本地打鏡像
cd $work_dir
docker build -t biz-server:latest .
# 將鏡像push到阿里雲鏡像倉庫服務
sudo docker tag biz-server:latest registry.cn-hangzhou.aliyuncs.com/biz/biz-server:latest
sudo docker push registry.cn-hangzhou.aliyuncs.com/biz/biz-server:latest
# 通過觸發器觸發重新部署完成上線
curl https://cs.console.aliyun.com/hook/trigger?token=xxxxxxxxxxxxxxxx

 

容器訪問

1. 獲取容器名稱(見下圖)

 

2. 在配置有Kubernetes訪問許可權的ECS上執行如下命令即可進入容器

kubectl exec -it herpes-master-6447d58c4b-cqznf bash

 

數據訪問

1. ssh連接到掛載NAS雲盤的ECS上

2. 進入對應掛載目錄查看,目前有業務服務的日誌,視覺服務的圖片與日誌

 

部署結構

應用相應組件最終搭建符合開頭部署要求的集群結構如下

 

總結

該部署方案對於不具備一定容器基礎的人來說門檻相對較高,並且可能服務推出時間不長,文檔方面還不是太完善,筆者在實踐過程中也踩了不少坑,目前集群服務運行穩定,節約成本在2/3以上,並且伸縮非常方便。如果你剛好也有這樣的業務場景與需求,可以關注公眾號“空山新雨的技術空間”交流。本文也有ppt版本,如有需要可以在公眾號主頁發送“k8s”獲取下載方式。

 

 

推薦閱讀

k8s雲集群混搭模式,可能幫你節省50%以上的服務成本

IT技術人員的自我修養
IT技術管理者的自我修養

 

作者:空山新雨

歡迎關注,一起交流企業技術實戰與IT領域的點滴