Привет!
我叫 Sergey,是 Tinkoff.ru 平台 API 團隊的基礎架構工程師。
在這篇文章中我將討論我們團隊在準備基於的平衡器時遇到的問題
Nginx 是一個多功能且正在積極開發的代理伺服器。 它具有大量的模組,
我們希望看到一個包含所需模組集、在特定 Linux 發行版下運行的新版本。 在我們的例子中,這些是基於 deb 和 rpm 的系統。 本文不考慮容器選項。
我們希望快速改變平衡器的功能。 那麼問題就來了:如何在花費盡可能少的資源的情況下實現這一目標? 最好設定此流程,以便我們可以指定有限數量的輸入參數,並在輸出處接收所需作業系統的 deb/rpm 套件形式的工件。
因此,可以提出許多問題:
- 並不總是有包含最新版本 Nginx 的軟體包。
- 沒有包含所需模組的軟體包。
- 手動編譯和建置包非常耗時且乏味。
- 沒有描述這個或那個 Nginx 實例是如何組裝的。
為了解決這些問題,需要一種工具,它將人類可讀格式的規格作為輸入,並基於它組裝具有必要功能的 Nginx 套件。
在浩瀚的 Github 上沒有找到適合我們的選擇,我們決定創建自己的工具 -
產品規格
在我們的工具中,我們希望以程式碼的形式建立規範的描述,然後可以將其放入 Git 儲存庫中。 為此,我們選擇了熟悉此類內容的格式 - yaml。 規格範例:
nginx_version: 1.14.1
output_package: deb
modules:
- module:
name: nginx-auth-ldap
git_url: https://github.com/kvspb/nginx-auth-ldap.git
git_branch: master
dependencies:
- libldap2-dev
- module:
name: ngx_http_substitutions_filter_module
git_url: https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
- module:
name: headers-more-nginx-module
web_url: https://github.com/openresty/headers-more-nginx-module/archive/v0.261.zip
- module:
name: nginx-module-vts
git_url: https://github.com/vozlt/nginx-module-vts.git
git_tag: v0.1.18
- module:
name: ngx_devel_kit
git_url: https://github.com/simplresty/ngx_devel_kit.git
git_tag: v0.3.0
- module:
name: ngx_cache_purge
git_url: https://github.com/FRiCKLE/ngx_cache_purge.git
- module:
name: ngx_http_dyups_module
git_url: https://github.com/yzprofile/ngx_http_dyups_module.git
- module:
name: nginx-brotli
git_url: https://github.com/eustas/ngx_brotli.git
git_tag: v0.1.2
- module:
name: nginx_upstream_check_module
git_url: https://github.com/yaoweibin/nginx_upstream_check_module.git
- module:
name: njs
git_url: https://github.com/nginx/njs.git
git_tag: 0.2.5
config_folder_path: nginx
在這裡,我們表明我們希望看到 Nginx 版本 1.14.2 的 deb 套件以及所需的模組集。 包含模組的部分是可選的。 對於它們中的每一個,您都可以設定:
- 姓名。
- 取得地址:
- Git 儲存庫。 您也可以指定分支或標籤。
- 存檔網頁連結。
- 存檔的本地連結。
某些模組需要安裝額外的依賴項,例如 nginx-auth-ldap 需要安裝 libldap2-dev。 描述模組時也可以指定必要的依賴關係。
環境
在我們的工具中,您可以快速獲得一個已安裝實用程式的環境,用於編譯、套件組裝和其他輔助軟體。 包含您需要的一切的 Docker 容器在這裡是理想的選擇(儲存庫已經有幾個適用於 ubuntu 和 centos 的 Docker 檔案範例)。
制定規格並準備好環境後,我們啟動建構器,並預先安裝其依賴項:
pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]
此處的修訂號是可選的,用於對程序集進行版本控制。 它被寫入包的元資訊中,使得在伺服器上更新變得容易。
從日誌中您可以監控正在發生的情況。 以下是要點的範例:
builder - INFO - Parse yaml file: example.config.yaml
builder - INFO - Download scripts for build deb package
builder - INFO - Downloading nginx src...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Downloading 3d-party modules...
builder - INFO - Module nginx-auth-ldap will download by branch
builder - INFO - -- Done: nginx-auth-ldap
builder - INFO - -- Done: ngx_http_substitutions_filter_module
builder - INFO - Module headers-more-nginx-module will downloading
builder - INFO - Module nginx-module-vts will download by tag
builder - INFO - -- Done: nginx-module-vts
builder - INFO - Module ngx_devel_kit will download by tag
builder - INFO - -- Done: ngx_devel_kit
builder - INFO - -- Done: ngx_cache_purge
builder - INFO - -- Done: ngx_http_dyups_module
builder - INFO - Downloading dependencies
builder - INFO - Building .deb package
builder - INFO - Running 'dh_make'...
builder - INFO - Running 'dpkg-buildpackage'...
dpkg-deb: building package 'nginx' in '../nginx_1.14.1-1_amd64.deb'.
因此,只需幾個命令,我們就可以建立環境和所需的 Nginx 組件,並且該套件將出現在啟動腳本的目錄中。
嵌入
我們還可以將我們的工具整合到 CI/CD 流程中。 例如,當今現有的許多 CI 系統中的任何一個都可以幫助解決這個問題
因此,每次 Git 儲存庫中的規格發生變更時,都會自動啟動工件的建置。 修訂號連結到建置啟動計數器。
再多花一點時間,您就可以設定要傳送到本機套件儲存庫、Nexus、Artifactory 等的工件。
另一個優點是 yaml 設定檔可以連接到 Ansible 或其他自動設定係統,從那裡我們可以取得要部署的版本號和套件類型。
下一步是什麼
該項目尚未完成。 這是我們現在正在做的事情:
- 我們擴展了配置的可能性,但同時保持盡可能簡單。 如果您只需要兩個參數,那麼您就不想定義一千個參數,其餘的預設即可。 這包括編譯標誌(現在您可以在內部設定檔 src/config.py 中更改它們)、安裝路徑和啟動使用者。
- 我們正在新增用於自動將套件傳送到各種工件儲存庫的選項。
- 載入模組時執行自訂命令(例如,使用
github.com/nginx-modules/nginx_upstream_check_module 您必須先套用特定版本的補丁) - 新增測試:
- 該軟體包已正確安裝。
- Nginx 具有所需的版本,並且是使用所需的標誌和模組建構的。
- 必要的路徑、帳戶等已建立。
但您現在可以使用這個工具,並且也提出改進建議 -
來源: www.habr.com