1. 程式人生 > >k8s雲集群混搭模式落地分享

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

  在 《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領域的點滴

&n