日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

kubernetes+Azure DevOps实现.Net Core项目的自动化部署均衡负载

發(fā)布時間:2023/12/4 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kubernetes+Azure DevOps实现.Net Core项目的自动化部署均衡负载 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 前言

前前后后學(xué)習(xí)kubernetes也有一個來月了,關(guān)于kubernetes的博客也寫了有十多篇。但是技術(shù)如果無法落地到實(shí)際的應(yīng)用場景終歸是紙上談兵,所以就有了這一出:通過結(jié)合kubernetes和azure devops實(shí)現(xiàn)項(xiàng)目的CI/CD以及均衡負(fù)載

寫完這篇后kubernetes的相關(guān)學(xué)習(xí)也暫時告一段落了,有種終于闖關(guān)成功了啊的感覺,當(dāng)然這是題外話了。

注1:以下只是以Net Core項(xiàng)目為例,實(shí)際運(yùn)用場景中,除了dockfile的編寫有差別,剩下整個自動化部署鏈條中的技術(shù)也好,工具也好,都可以復(fù)用,與語言和語言框架本身無關(guān)。
注2:本文演示的也只是其中一種簡便的方式,具體的自動化流程中,由于自由度非常高,所以實(shí)際的流程可能會更加復(fù)雜,這里就不做贅述了

以下場景需要用到的工具或者技術(shù):

  • .Net Core

部署的應(yīng)用本身

  • Github

作為代碼倉庫

  • kubernetes

    • docker

    • helm【kubernetes的包管理工具】

    • ingress【使用ingress綁定域名和https證書,實(shí)現(xiàn)域名訪問】

  • Azure DevOps

作為CI/CD的工具

注:以下所有的相關(guān)部署代碼,都在下面這個倉庫

  • 倉庫內(nèi)容只是我自己用的一個小工具,當(dāng)然具體是什么內(nèi)容不重要,這篇只是演示部署相關(guān)的

https://github.com/lzw5399/TocGenerator


2. Net Core項(xiàng)目本身的準(zhǔn)備

2.1 dockerfile

你需要一個dockerfile來構(gòu)建一個docker image, 如果是.Net Core項(xiàng)目,vs提供了傻瓜式生成dockerfile的功能,可以免去初學(xué)時編寫dockerfile的煩惱

  • 本示例dockerfile路徑和內(nèi)容

2.2 創(chuàng)建kubernetes用于helm的chart包

2.2.1 說明

這一部分需要有helm相關(guān)的知識,如果熟悉k8s但不熟悉helm,可以參照:

kubernetes系列(十六) - Helm安裝和入門

2.2.2 chart文件目錄和文件組成

自定義的chart包,位于以下路徑

https://github.com/lzw5399/TocGenerator/tree/master/kubernetes

如上圖可以看出是一個很經(jīng)典的自定義chart包的文件目錄,即:

Copy. ├── Chart.yaml 【chart的name和version等信息】 ├── templates 【k8s的資源清單模板,可以引用values.yaml的變量】 | ├── deployment.yaml | └── service.yaml ├── values.yaml 【定義變量,供template/下的yaml使用,實(shí)現(xiàn)動態(tài)替換yaml內(nèi)容】

3. Azure Devops創(chuàng)建倉庫的pipeline

3.1 前言

Azure DevOps是微軟出品的DevOps平臺,里面包含了Pipelines工具鏈,對個人免費(fèi),可以用于項(xiàng)目的CI/CD

https://dev.azure.com

3.2 使用azure devops準(zhǔn)備操作

  • 如果之前使用過azure devops,這幾步可以視情況跳過。

  • 進(jìn)入azure devops注冊賬號

  • 之后按照引導(dǎo)新建一個organization

  • 再新建一個project

  • 進(jìn)入project

  • 3.3 創(chuàng)建service connections

    這里要創(chuàng)建一個service connections,用于之后pipeline訪問k8s的master服務(wù)器

  • 點(diǎn)擊project setting

  • 這里點(diǎn)擊service connections來創(chuàng)建一個連接,用于訪問k8s的master服務(wù)器

  • 然后填寫具體的憑證,之后的pipeline上需要

  • 3.4 新建pipeline流水線

    新建pipeline流水線用于自定義部署流程

  • 點(diǎn)擊pipelines,然后點(diǎn)擊create pipelines,新建一條流水線來部署我們的應(yīng)用

  • 選擇代碼倉庫位置,選github

  • 然后會跳到github進(jìn)行授權(quán),授權(quán)完成后會顯示github的repo列表,選擇具體的倉庫

  • 選擇完倉庫后,會自動按照你當(dāng)前項(xiàng)目的語言,在github倉庫的根目錄生成一個默認(rèn)的azure-pipelines.yml文件,

  • 替換文件的內(nèi)容,我們最終使用的yaml文件步驟大概如下

    • 第一步:構(gòu)建docker鏡像

    • 第二步:將自定義的chart包拷貝到master服務(wù)器上

    • 第三步:執(zhí)行deploy.sh腳本,完成部署

    Copy# 哪條分支會觸發(fā)構(gòu)建 trigger: - masterresources: - repo: self# 定義變量 variables: - name: appNamevalue: tocgenerator- name: tagvalue: $(Build.BuildNumber)- name: imageNameWithoutTagvalue: $(dockerid)/$(appName)- name: imageNameWithTagvalue: $(imageNameWithoutTag):$(tag)- name: serverChartLocationvalue: /root/helm-chart-folder/tocstages: - stage: Buildjobs: - job: Buildpool:vmImage: 'ubuntu-latest'# 這下面是每個我們要具體執(zhí)行的任務(wù)steps:# build docker images并且push到倉庫- task: Docker@2displayName: docker build and pushinputs:containerRegistry: 'my_docker_hub'repository: '$(imageNameWithoutTag)'command: 'buildAndPush'Dockerfile: '**/Dockerfile'buildContext: '.'tags: $(tag)addPipelineData: false# 將kubernetes文件夾,即chart包拷貝到k8s的master服務(wù)器- task: CopyFilesOverSSH@0displayName: copy helm chart to serverinputs:# 這個endpoint就是我們剛剛創(chuàng)建的service connection的名字sshEndpoint: 'my_server'sourceFolder: 'kubernetes'contents: '**'targetFolder: $(serverChartLocation)readyTimeout: '20000'# 在k8s的master服務(wù)器上運(yùn)行我們github倉庫的根目錄的deploy.sh,進(jìn)行部署操作- task: SSH@0displayName: run deploy shell on serverinputs:# 這個endpoint就是我們剛剛創(chuàng)建的service connection的名字sshEndpoint: 'my_server'runOptions: 'script'scriptPath: 'deploy.sh'args: '$(tag) $(serverChartLocation)'readyTimeout: '20000'

    3.5 創(chuàng)建部署shell腳本

    部署腳本的位置

    https://github.com/lzw5399/TocGenerator/blob/master/deploy.sh

    幾點(diǎn)說明

  • echo純粹是為了記錄log使用的,下面的示例把echo部分刪除了

  • $1 and $2 代表外部傳入的參數(shù)

  • $1是image的tag,$2是k8s的master服務(wù)器上我們自定義的chart的目錄

  • 移除沒有tag的懸掛docker image,純粹為了節(jié)省服務(wù)器空間,為可選項(xiàng)

  • Copy#!/bin/bash# 出現(xiàn)錯誤退出腳本執(zhí)行 set -o errexit# $1 and $2 代表外部傳入的參數(shù) # $1是image的tag,$2是k8s的master服務(wù)器上我們自定義的chart的目錄 buildNumber=$1 serverChartLocation=$2 cd $serverChartLocation# 安裝或者升級我們的helm release # 即如果查詢到了有release存在就upgrade,沒有則install if test -z "$(helm ls | grep toc-release)"; thenhelm install -f values.yaml --set env.buildnumber=$buildNumber --set image.tag=$buildNumber toc-release . elsehelm upgrade -f values.yaml --set env.buildnumber=$buildNumber --set image.tag=$buildNumber toc-release . fi# 移除沒有tag的懸掛docker image(可選) danglings=$(sudo docker images -f "dangling=true" -q) if test -n "$danglings"; thensudo docker rmi $(sudo docker images -f "dangling=true" -q) >>/dev/null 2>&1if [[ $? != 0 ]]; thenexit $?fi fiexit 0

    4. 觸發(fā)pipeline部署流水線

    這里有兩種辦法,

  • 點(diǎn)擊我們剛剛創(chuàng)建的pipeline手動run一個

  • 通過push代碼到倉庫的指定分支(我們設(shè)置的master)觸發(fā)構(gòu)建

  • 顯示構(gòu)建成功之后就可以查看了!

    5. 關(guān)于均衡負(fù)載

    均衡負(fù)載是kubernetes自帶的基礎(chǔ)功能之一,這里只是做了一個試驗(yàn)可以更加直觀地感受到而已

    如下

  • 定義一個靜態(tài)的guid

  • 在/version 路由下輸出guid

  • 則如果有2個實(shí)例,且均衡負(fù)載成功的話,每次刷新這個界面,會隨機(jī)顯示這兩個guid

    • deployment的replicas實(shí)例數(shù)需要設(shè)置2以上

    最后均衡負(fù)載試驗(yàn)的地址,也是本次實(shí)例項(xiàng)目的線上地址

    https://toc.codepie.fun/version

    • 如下,會出現(xiàn)兩個不同的guid

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的kubernetes+Azure DevOps实现.Net Core项目的自动化部署均衡负载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。