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

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

部署要求

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

 

 


基本概念

   Dockernode

  • 容器:應用運行的形式git

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

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

   

   k8s雲混合集羣redis

  • 集羣 —— 託管版、專有版、Serverless版docker

  • 節點 —— Master Node、Worker Node數據庫

  • 命名空間(Namespace) tomcat

  • Podbash

  • 副本控制器 (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領域的點滴

相關文章
相關標籤/搜索