採用rancher2+kubernetes+skywalking部署springcloud項目(二[helm版本])

距離上一篇記錄
採用rancher2+kubernetes+skywalking部署springcloud項目(一[k8s yaml版本])發佈已經2個多月了,之前寫那篇文章時專門在標題右邊寫了一個序號,是因我想通過spring-boot-cloud項目來對k8s的發佈進行一個整體的學習(儘管我同學告訴我對於項目發佈的東西在他們公司都是專門的運維或devops工程師去處理的,作爲開發小弟的我們不需要去掌握,但我個人感覺對這些內容還是挺有意思的,我決定還是堅持自己原本的想法先掌握了再說

最近由於我的個人原因(主要是太懶了)這些天來沒有將文章寫出來,看着又到月底了啥動靜也沒有感覺還是有點愧疚的,今天趁着週二我就來繼續記錄一下吧!

本系列文章目錄(計劃中)

  • 基礎k8s yaml腳本發佈
  • helm+shell腳本優化大量冗餘配置發佈
  • jenkins用戶審覈的流水化方式部署
  • service mesh(istio)服務網格化發佈

前言

通過一篇博文採用rancher2+kubernetes+skywalking部署springcloud項目(一[k8s yaml版本])我們可以發現通過yaml文件去發佈springcloud的項目還是挺複雜的,因爲有太多重複而冗餘的配置。
我們意識到了通過原生的yaml文件發佈k8s項目具有一定的複雜性。

除了我們意識到了這一點外,谷歌的大佬們同樣意識到了這一點。爲了解決這一問題,helm便橫空出世。

正如helm官網所說的那樣:

Helm is the best way to find, share, and use software built for Kubernetes.
https://helm.sh/

helm下載與安裝

對於新版(v3)的helm安裝相對與以前版本安裝過程已經簡化了許多,直接安裝下載helm客戶端就行了,直接參考官方文檔即可快速安成helm的安裝。
helm的官網爲:https://helm.sh/

helm下載

參考:https://helm.sh/docs/intro/quickstart/

在官網中找到下載鏈接,直接進行下載:https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz

當然,如果電腦網絡比較可以的話,直接用腳本在線下載也可以

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

helm安裝

參考: https://helm.sh/docs/intro/install/

tar -zxvf helm-v3.0.0-linux-amd64.tar.gz

將helm壓縮包解壓後將它copy到/usr/local/bin目錄下

mv linux-amd64/helm /usr/local/bin/helm

測試一下,隨便輸入一個helm命令,查看下helm能否正常運行,如helm list

[root@k8s-node1 ~]# helm list
NAME	NAMESPACE	REVISION	UPDATED	STATUS	CHART	APP VERSION

生成通用helm的chart

正常情況下,一個服務就需要編寫一個對應的chart。但是對於spring cloud這樣的微服務其實大多數配置都是一樣的,如果每個服務都單獨編寫一個chart的話對於管理的chart配置的話就有點不方便了。

綜合考慮分析後,爲了方便對chart管理,這裏打算只寫一個chart,讓它作爲springcloud的通用chart,每個服務部署時再通過通用chart來生成自己項目的chart,對於每個微服務不同的地方通過values.xml來傳遞不同的參數即可

生成chart模板

直接用idea下的newFile生成一個chart模板

idea生成chart

修改chart配置

官方文檔:https://helm.sh/docs/topics/charts/

主要是修改deployment.yaml,修改後的可參考github上的文件

編寫部署shell腳本

shell腳本中主要分爲以下幾個步驟:

  1. 拉取最新的項目代碼
  2. 選擇要發佈的項目
  3. 將項目進行打包,生成jar包
  4. 將jar包打成docker鏡像並推送到鏡像倉庫
  5. 通過通用chart生成對應項目的chart文件
  6. 執行helm命令,更新或安裝relase

根據上面的思路,那麼最終的腳本如下:

#!/usr/bin/env bash
################### 配置信息begin ###################
project_git_url=https://github.com/puhaiyang/spring-boot-cloud.git
#docker鏡像倉庫地址
image_domain=ccr.ccs.tencentyun.com/spring-boot-cloud
#項目名稱
project_name=spring-boot-cloud
#所有項目的git根目錄
git_root_path=~/git
#項目的根目錄
project_root_path=~/git/$project_name
#通用chart目錄
chart_root_path=$project_root_path/helms
#版本號,docker的tag
version=`date +%Y%m%d%H%M`
#部署的namespace
deploy_namespace="default"
#釘釘機器人的token
ding_robot_token="xxxxxxxxxxx"
################### 配置信息end ###################
########################初始化 begin###########################
#不存在項目目錄的話,則先進行初始化
if [ ! -d $git_root_path ];then
    echo '不存項目目錄,先進行初始化'
	mkdir $git_root_path
	cd $git_root_path
	git clone $project_git_url
fi
########################初始化 end###########################
source /etc/profile
#自定義分支名
if [ -z "$1" ]; then
    #默認分支名稱
    branch=master
else
    branch=$1
fi

echo '----------------------------------------------'
echo ':-D hi,boy!welcome to automatic depoly sh! :-D'
echo '----------------------------------------------'

echo -e "branch:$branch, 系統服務列表:"
################################列目錄 begin############################
pom_files=$(dirname $(find git/spring-boot-cloud/ -name pom.xml))
igrone_pro="spring-boot-cloud"
index=0
projects[0]="unknown"
for i in ${pom_files[@]};do
  pro_name=$(basename $i)
  if [ "$pro_name" = "$igrone_pro" ]; then
     continue
  fi
  ((index++))
  echo $index')'$pro_name
  projects[${#projects[*]}]="$pro_name"
done
echo -e "請輸入模塊對應的序號:"
read project_index
echo ${projects[$project_index]}
#要發佈的項目名
pname=${projects[$project_index]}
################################列目錄 end############################
echo "更新的模塊:$pname"
#模塊的目錄
git=$project_root_path/$pname
#切換到項目的目錄
cd $git
#獲取到新的代碼
git fetch --all
git reset --hard origin/$branch
#獲取到最後一次提交的內容
git_last_commit=$(git show -s --format=%s)
#獲取到最後一次提交者
git_last_commit_author=$(git show -s --format=%an)
#如果項目是maven聚合項目,需要在git的根目錄進打包,-pl --projects <arg> 構建制定的模塊,模塊間用逗號分隔
#-am --also-make 同時構建所列模塊的依賴模塊;
cd $project_root_path
echo '下面開始打包(package)...'
mvn clean  package -Dmaven.test.skip=true -pl $pname -am
#mvn clean  package -Dmaven.test.skip=true
echo '好,包打好了!接下來準備打鏡像!(docker image package)...'
cd $git
#docker鏡像名
docker_image=$image_domain/$pname
#docker鏡像名
image=$docker_image:$version
echo '現在開始打鏡像...'
docker build -f  Dockerfile -t $image .
echo '打好了,把鏡像推到docker鏡像倉庫裏去(push...)'
docker push $image

echo '好!現在準備發佈更新了(pre deploy...)'
echo '現在準備chart文件,通過通用chart文件來生成'
path_common_chart=$chart_root_path/common-modle-springbootcloud
echo $path_common_chart
#在項目的target目錄下創建chart目錄
mkdir chart
echo '複製到target下的chart目錄下'
cp -r $path_common_chart chart
#重命名
mv chart/common-modle-springbootcloud chart/$pname
echo '替換chart'
sed -i "s/common-modle-springbootcloud/$pname/g" chart/$pname/Chart.yaml
echo '替換values'
sed -i "s/common-modle-springbootcloud/$pname/g" chart/$pname/values.yaml

#install or upgrade
###############判斷是否已發佈對應的項目 begin#####################
helm_ops='install'
helm list -A |grep $pname
if [ $? -ne 0 ];then
  echo "不存在"$pname"模塊,將先進行install"
  helm_ops="install"
else
  echo "已存在"$pname"模塊,將先進行upgrade"
  helm_ops="upgrade"
fi
###############判斷是否已發佈對應的項目 end#####################

echo '進行發佈(deploy...)'
if [ -f "$chart_root_path/values/$pname/values.yaml" ];then
    echo '已經有配置文件了,採用配置文件進行發佈'
	helm $helm_ops $pname chart/$pname -n $deploy_namespace -f $chart_root_path/values/$pname/values.yaml --set image.tag=$version --set image.repository=$docker_image
else
    echo '直接進行發佈'
    helm $helm_ops $pname chart/$pname -n $deploy_namespace --set image.tag=$version --set image.repository=$docker_image
fi

Message="發佈通知: \n模塊:${pname} \ngit提交者:$git_last_commit_author \ngit提交內容:$git_last_commit \n------have a nice day------"

curl "https://oapi.dingtalk.com/robot/send?access_token=$ding_robot_token" \
           -H 'Content-Type: application/json' \
           -d "  {\"msgtype\": \"text\",
              \"text\": {\"content\": \"$Message\"}}"

要讓上面的shell腳本能正常執行,需要確保對應的機器上已安裝了git和maven

測試自動部署helm版腳本

將上面寫好的shell放到安裝好了helm的linux中,並添加執行權限執行一下
部署腳演示
搞定
部署腳本詳見:https://github.com/puhaiyang/spring-boot-cloud/blob/master/helms/helm-install.sh

最後想說

一邊實驗着k8s部署,一邊聽到呼呼呼的聲音。

再低頭一看,原來是公司的電腦主機,嚇得我趕緊把服務給刪了。

cpu溫度90多度了
k8s果然名不虛傳,16G的主機也HOLD不住呀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章