主機基礎設施如何使用 Zadig 做持續交付

語言: CN / TW / HK

Zadig 提供了面向容器執行時環境、大規模微服務的雲原生持續交付方案,被企業廣泛採用,但在企業實際運用過程中,還存在部分服務無法接入的情況,對運維統一化管理造成不便。 常見的無法接入的情況:一部分服務暫時不便於遷移容器或不打算遷移虛擬機器/主機部署;或基礎設施本身是可網路互通的裝置,比如 IoT 物聯網場景下自動駕駛車輛主機端,工廠可連線裝置等。

下面我們以 vm-microservice-demo 專案的後端服務 + 基礎設施為主機場景為例,來闡述以上場景如何在 Zadig 中實現持續交付。下文會介紹兩種常見的接入方式:

  • 方式一:目標部署主機和 Zadig 連通,直接將服務部署到目標主機
  • 方式二:通過堡壘機(一般也稱為跳板機)和 Zadig 連通,在堡壘機上將服務部署到目標主機

專案基本配置

配置主機

系統管理員訪問 系統設定 -> 主機管理 -> 新建,填寫主機資訊後儲存即可。主機資源可以是目標部署主機或堡壘機。

建立專案和服務

以 vm-microservice-demo 專案為例,該專案包含 Vue.js 前端服務 frontend 和 Golang端服務 backend,共包括 devqa 2 個環境。案例原始碼位於:[koderover/zadig/microservice-demo],相關檔案說明如下:

zadig/examples/microservice-demo
├── backend # 後端服務原始碼
├── frontend # 前端服務原始碼
└── vm # 部署相關配置
    ├── ansible # 使用 ansible 工具部署的相關配置
    │   ├── ansible.Dockerfile # 包含 ansible 工具的映象 Dockerfile
    │   └── hosts-dev # 部署 dev 環境的主機資訊,埠 22 已開放,可使用 ansible 批量操作
    │   └── hosts-qa # 部署 qa 環境的主機資訊,埠 22 已開放,可使用 ansible 批量操作
    └── restart.sh # backend 服務部署指令碼

系統管理員新建主機專案 vm-microservice-demo 在專案初始化嚮導第二步中,點選+按鈕新增服務,填寫服務名稱 backend 接下來為 backend 服務配置構建和部署以便後續使用工作流對其進行交付。對於不同的接入方式配置有所不同,下面分開介紹。

方式一:直接部署服務至目標主機

適用:目標主機和 Zadig 連通,使用自動化運維工具快速實現部署相關操作。

部署架構

準備工作

  1. 在 Zadig 中支援部署工具:以 ansible 為例,Dockerfile 位於案例原始碼的 vm/ansible/ansible.Dockerfile 檔案中,參考 構建映象 | Zadig 文件 新增自定義映象 ansible:amd64

構建配置

構建配置說明:

  • 作業系統:ansible:amd64
  • 依賴的軟體包:go 1.12.9
  • 程式碼資訊:案例原始碼庫 koderover/zadig
  • 新增二進位制包儲存步驟,儲存路徑為 $WORKSPACE/backend/$PKG_FILE
  • 通用構建指令碼:見如下程式碼段
#!/bin/bash
set -ex

if [ -e $WORKSPACE/backend ]; then
    rm -rf $WORKSPACE/backend
fi

cp -r $WORKSPACE/zadig/examples/microservice-demo/backend $WORKSPACE/backend
cp -rf $WORKSPACE/zadig/examples/microservice-demo/vm/ansible $WORKSPACE/backend
cp $WORKSPACE/zadig/examples/microservice-demo/vm/restart.sh $WORKSPACE/backend/restart.sh

cd $WORKSPACE/backend
chmod +x restart.sh
make build-backend
tar cvf $PKG_FILE backend restart.sh

部署配置

選擇本地直連部署,部署指令碼如下:

#!/bin/bash
set -ex

cd $WORKSPACE/backend
ansible-playbook main.yaml --extra-vars PKG_FILE=$ARTIFACT -i hosts-${ENV_NAME} -v

方式二:通過堡壘機部署服務至目標主機

適用:對主機伺服器有更高的安全審計要求(比如主機在內網),在堡壘機上完成服務部署相關操作,堡壘機和 Zadig 連通。結合一些自動化運維工具將服務部署到目標主機上。

部署架構

構建配置

構建配置說明:

  • 作業系統:ubuntu 20.04
  • 依賴的軟體包:go 1.12.9
  • 程式碼資訊:案例原始碼庫 koderover/zadig
  • 新增二進位制包儲存步驟,儲存路徑為 $WORKSPACE/backend/$PKG_FILE
  • 通用構建指令碼:見如下程式碼段
#!/bin/bash
set -ex

if [ -e $WORKSPACE/backend ]; then
    rm -rf $WORKSPACE/backend
fi

cp -r $WORKSPACE/zadig/examples/microservice-demo/backend $WORKSPACE/backend
cp $WORKSPACE/zadig/examples/microservice-demo/vm/restart.sh $WORKSPACE/backend/restart.sh
cd $WORKSPACE/backend
chmod +x restart.sh
make build-backend
tar cvf $PKG_FILE backend

部署配置

使用 SSH Agent 遠端部署並選擇堡壘機,部署指令碼如下:

本例中用於 ansible 部署的相關配置檔案位於堡壘機 ~/ansible 目錄下,請根據實際情況調整。

#!/bin/bash
set -ex

# 將構建產物複製到堡壘機上
scp -P $kr_jumpbox_server_PORT -i $kr_jumpbox_server_PK $ARTIFACT  [email protected]$kr_jumpbox_server_IP:/home/ubuntu/microservice-demo/$ARTIFACT

# SSH 登入到堡壘機上,在堡壘機上做服務部署
if [ $ENV_NAME = "dev" ]; then
    ssh -i $kr_jumpbox_server_PK [email protected]$kr_jumpbox_server_IP 'cd ~/ansible; ansible-playbook main.yml -i hosts/evm/hosts-dev'
elif [ $ENV_NAME = "qa" ]; then
    ssh -i $kr_jumpbox_server_PK [email protected]$kr_jumpbox_server_IP 'cd ~/ansible; ansible-playbook main.yml -i hosts/evm/hosts-qa'
fi

工程師如何使用

  • 配置完畢後,系統會自動建立 2 套環境和 3 條工作流,日常使用中,可以執行工作流部署服務:
  • 編輯工作流,配置 Webhook 觸發器,當觸發事件發生時會自動執行工作流部署服務:

更多最佳實踐

  1. 對於更復雜的服務構建配置,可參考 構建映象 | Zadig 文件 將依賴的工具放進自定義映象中,縮短構建所需時間。
  2. 參考 構建快取 | Zadig 文件 配置構建快取,提高構建執行效率,加速服務更新。

Zadig,讓工程師更專注創造!歡迎加入 開源吐槽群🔥

Zadig on Github
Zadig on Gitee