k8s雲集群混搭模式落地分享
- 2019 年 10 月 3 日
- 筆記
在 《k8s雲集群混搭模式,可能幫你節省50%以上的服務成本》一文中,介紹了使用k8s + 虛擬節點混合集群的方式,為負載具有時間段波峰、波谷交替規律的業務節約成本,提高服務伸縮效率的部署方案。本文對該方案的具體落地步驟與基本運行維護進行分享,為有此需求者提供參考。
部署要求
- 應能24小時不間斷提供服務
- 在業務高峰期到來前能自動擴展指定數量的容器(提前對業務負載進行評估與壓測,確定容器數)
- 在業務高峰期過後能自動收縮到指定數量的容器
- 能根據服務負載情況自動彈性伸縮,避免業務突發情況下服務能力跟不上
基本概念
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”獲取下載方式。
推薦閱讀
作者:空山新雨
歡迎關注,一起交流企業技術實戰與IT領域的點滴