設計一個簡單的devops系統

提伯斯發表於2022-03-31

前言


公司設計的RDMS挺好用的,我也照貓畫虎簡單的設計一個DevOps系統,與大家分享,不足之處歡迎拍磚,以免誤人子弟

前置條件

gitlab
gitlab-runner
k8s

1. gitlab建立群組

建立群組的好處是,對專案進行分組,群組內的資源可以共享,這裡建立了一個tibos的群組

2. 在群組建立一個專案

這裡建立一個空白專案,專案名為Gourd.Test,將專案克隆到本地,然後在該目錄下建立一個.net core3.1的webapi專案,並推送到gitlab

3.編寫dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/wmowm/dotnet.core.aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80

LABEL applabel=tibos

FROM registry.cn-hangzhou.aliyuncs.com/wmowm/dotnet.core.sdk:3.1 AS build
WORKDIR ../Gourd.Test
COPY . .
WORKDIR "/Gourd.Test"
RUN dotnet publish "Gourd.Test.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=build /app .
RUN rm -rf appsettings.Development.json
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT ["dotnet", "Gourd.Test.dll","-b","0.0.0.0"]

這裡給映象加了一個標籤(LABEL applabel=tibos),方便清理

4.編寫 gitlab-ci.yml

variables:
  PROJECT_NAME: gourd.test
  WEBAPI_DOCKERFILE_PATH: ./Gourd.Test/dockerfile
stages:
- build
- deploy
build:
  stage: build
  script:
	- echo "登入私有倉庫"
	- docker login --username=${DOCKER_REPOSTORY_USERNAME} -p ${DOCKER_REPOSTORY_PASSPORD} ${DOCKER_REPOSTORY_ADDRESSURL}
	- imageversion=$CI_PIPELINE_ID
	- echo "開始構建映象:${PROJECT_NAME}.${imageversion}"
	- docker build -t ${PROJECT_NAME}.${imageversion} .
	- echo "打標籤:${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}"
	- docker tag ${PROJECT_NAME}.${imageversion} ${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}
	- echo "推送到中央倉庫"
	- docker push ${DOCKER_REPOSTORY_ADDRESSURL}/${DOCKER_REPOSTORY_NAME}/${PROJECT_NAME}:${imageversion}
	- echo "清理未使用的映象"
	- docker image prune -a -f --filter="label=applabel=tibos"
	- docker rmi $(docker images | grep "none" | awk '{print $3}')
  only:
   - main

白話文翻譯ci配置
定義了兩個變數,專案名稱與dockerfile相對地址,然後執行構建步驟,構建指令碼如下

  1. 登入docker私有倉庫,這裡是bp的阿里雲的docker倉庫,後文會講如何bp
  2. 定義映象版本號,這裡直接取gitlab-ci內建的流水線編號作為版本號,gitlab-ci內建了很多環境變數,可以查閱文件
  3. 構建映象
  4. 映象打標籤
  5. 推送到阿里雲docker倉庫
  6. 清理未使用且包含tibos標籤的映象

5.敏感資訊,使用ci的變數進行保護

6.bp阿里雲映象倉庫

先建立一個名稱空間,然後根據自己的專案名稱建立對應的倉庫即可,也可以把外網的一些映象打個標籤,推送到自己的映象倉庫,這樣從自己的映象倉庫拉取,速度會快很多

在映象版本里檢視自己推送的映象,這些都是gitlab-ci 構建成功,推送過來的

7.註冊runner

我這裡是建立的團隊runner,這樣團隊專案可以共享該runner,註冊好後編輯runner,勾選執行未標記的作業,怎麼註冊gitlab-runner網上有很詳細的教程,這裡就不多贅述了

gitlab-runner job如下,可以看到.net core 構建還是挺快的
image

  • 做到這裡ci部分就完成了,當我們提交程式碼的時候,會自動觸發gitlab-ci,然後docker構建,並推送到映象倉庫,接下來是cd 部分

8.開啟gitlab webhooks功能,將事件訊息推送給指定的服務

這裡寫一個服務,用來接收gitlb webhooks 通過post傳送的http請求,下面有它的傳送記錄,方便我們查詢問題,我們根據請求詳情,通過vs輔助功能把json一鍵轉換成實體,作為vo,並把資料持久化到資料庫,它的狀態變化為 created->pending->running->success,可以根據自己的業務進行定製

9.釋出到k8s

釋出到k8s有兩種途徑,1.通過k8s代理,直接呼叫k8s api, 2.通過shell直接執行k8s命令, 這個根據自己的業務來定製,我這裡採用了shell的方式,因為簡單方便

  • k8s api如下

10. netcore 使用supversior託管後,無法執行shell的問題

去官網轉了一圈,沒找到有用資訊,大概意思是子程式下無法獲取宿主全部環境,僅僅是拷貝幾個環境到子流程環境,所以導致shell無法執行........ 換成pm2來託管程式,可以正常執行shell
能執行shell那就好辦了,基本上可以通過shell完成所有k8s功能, 比如 釋出,回滾,擴容,修改配置,查詢容器日誌.......

11. 設定部署環境

我們可以根據專案分支或者tag來對應不同的環境,如develop,test,pre,prod..... 比如pre環境只能釋出master分支的構建記錄

12. 通過網頁顯示容器日誌

通過k8s api 或者shell 都可以查詢日誌, linux服務端日誌一般採用ANSI編碼,部分內容展示會出現亂碼,這裡我們用ansi_up.js這個庫,可以解決該問題

image

相關文章