鏡像即代碼:使用 Packer 實現自動化構建鏡像

背景

雲主機是用戶使用最高頻的雲產品之一。隨着雲主機數量的增多,如何在雲主機中保證版本化部署的一致性,成爲用戶常見的難題。在現有情況下,用戶首先需要手動或使用腳本連接主機,然後再進行部署安裝,操作流程複雜且對環境要求苛刻,難以保證一致性和可用性。

爲了解決此類問題,UCloud 開發了相關代碼,並被自動化構建鏡像工具 Packer 的官方倉庫所採納。通過 Packer 創建自定義鏡像,可以減少部署時間並提高可靠性,提高了用戶自動化部署的能力。8月14日,Hashicorp 官方正式發佈了版本 1.4.3 ,其中包括了 UCloud Packer Builder。

Packer是什麼?

Packer 是 Hashicorp 公司推出的自動化打包鏡像的輕量級開源工具,雲廠商通過構建自己的 Builder 集成到 Packer 中去,即可憑藉單一配置文件,高效並行的爲多雲平臺創建一致性的鏡像。目前 Packer 已經形成完整生態,並與多家主流雲廠商建立合作。

UCloud Packer 可以運行在常用的主流操作系統上,它不是 Chef、Puppet 等軟件的替代品,而是集成並使用這些自動化配置工具在鏡像上預裝軟件等。再配合 UCloud Terraform、UCloud CLI 等工具,可以在多雲的 DevOps 場景下,實現基礎設施即代碼(IaC)、持續集成和快速交付。

如下圖所示,Packer 通過在 Provisioner 中集成 Chef、Shell、Puppet 等工具,製作包含各類軟件的不可變鏡像,供多雲平臺的雲主機、Docker 等使用。

Hashicorp 官方將 Packer 的優勢描述如下:

1. 基礎架構迅速部署:Packer 鏡像可以在幾秒鐘內啓動完全配置的雲主機,有利於生產和開發;

2. 多提供商可移植性:Packer 可以爲多雲平臺創建了相同的鏡像,每個環境都能運行相同的機器鏡像,提供最終的可移植性;

3. 穩定性高:Packer 在構建鏡像時會爲機器安裝和配置所有軟件。如果腳本中存在錯誤,可以被提前捕獲,而不是在啓動計算機幾分鐘後;

4. 可測試性高:Packer 在構建機器鏡像後,可以快速啓動該機器鏡像並進行冒煙測試,以驗證鏡像是否正常工作。如果是正常工作,則可以確信從該鏡像啓動的任何其他計算機都能正常運行;

5. 可擴展性高:Packer 的插件機制使得它能夠自如的根據需求集成工具和拓展功能。

Packer 與傳統控制檯創建鏡像的對比:

生命週期

利用 Packer 打包鏡像的完整週期如下:

1. 用戶通過構建 JSON 模版,執行 packer build 命令調用 UCloud Builder;

2. 參數提前校驗保證可用性;

3. 創建雲主機、EIP 等相關臨時資源(若配置爲內網環境則無需 EIP);

4. 通過 SSH 或 WinRM 等連接主機,執行 Provisioner 進程;

5. 關閉雲主機,並創建鏡像;

6. 複製鏡像;

7. 刪除主機、EIP 等臨時資源;

8. 執行後處理進程(如本地鏡像導入等)。

使用演示

下面通過一個視頻來形象地展示 Packer 的使用方式。目標是構建一個裝有 nginx 應用的鏡像,我們首先創建一個 test.json 文件,然後執行如下命令一鍵構建鏡像:

 

packer build test.json

Packer 對多雲管理的價值

在此次 Hashicorp 官方發佈前,UCloud 內部已經積累了一定的 Packer 使用經驗。從中發現,如果需要管理多雲環境,或者要在公有云與私有云間維護相同的系統,又或者構建的是虛擬機而不是容器,Packer 都是一個很好的選擇。

通過一個具體例子來說明。下面這段代碼定義了一個 UCloud 公有云上的虛擬機鏡像,Packer 利用 ucloud-uhost Builder 配置的參數,先創建一個乾淨的 CentOS 7 系統,再 ssh 執行 provisioner 定義中指定的三段 shell 腳本,最終成功創建鏡像並返回鏡像 ID。

{ "variables": { "ucloud_public_key": "{{env `UCLOUD_PUBKEY`}}", "ucloud_private_key": "{{env `UCLOUD_SECRET`}}", "ssh_user": "root", "ssh_password": "password", "ucloud_project_id": "org-projectid", "image_id": "uimage-dpdgyw", "consul_version": "1.5.1", "region": "cn-bj2", "az": "cn-bj2-02" }, "builders": [ { "type": "ucloud-uhost", "public_key": "{{user `ucloud_public_key`}}", "private_key": "{{user `ucloud_private_key`}}", "project_id": "{{user `ucloud_project_id`}}", "region": "{{user `region`}}", "availability_zone": "{{user `az`}}", "instance_type": "n-basic-2", "source_image_id": "{{user `image_id`}}", "ssh_username": "{{user `ssh_user`}}", "ssh_password": "{{user `ssh_password`}}", "image_name": "consul-server-{{user `consul_version`}}" } ], "provisioners": [ { "type": "shell", "scripts": [ "scripts/config-yum.sh", "scripts/consul-service.sh", "scripts/consul-server.sh" ], "environment_vars": [ "CONSUL_VERSION={{user `consul_version`}}" ] } ] }

此時若有額外需求,要求將其也部署到私有云的 Kubernetes 上,該怎麼辦?一種方法是把 shell 腳本改寫成對應的 Dockerfile,但若是構建過程非常複雜,那麼改寫的過程也會很複雜,並且可能引入錯誤。

但用 Packer,只需要修改一下 builder 配置的細節:

{ "variables": { "consul_version": "1.5.1" }, "builders": [ { "type": "docker", "image": "centos:7", "commit": true, "changes": [ "CMD [\"tail -f /dev/null\"]", "ENTRYPOINT [\"\"]" ] } ], "provisioners": [ { "type": "shell", "scripts": [ "scripts/config-yum.sh", "scripts/consul-service.sh", "scripts/consul-server.sh" ], "environment_vars": [ "CONSUL_VERSION={{user `consul_version`}}" ] } ], "post-processors": [ [ { "type": "docker-tag", "repository": "lonegunmanb/consulServer", "tag": "0.1" }, "docker-push" ] ] }

在公有云平臺上已經過測試的構建腳本,就可以直接用來構建 Docker 鏡像,並且在構建完成後,自動打上 tag,push 到 Docker Hub 倉庫去。並且,由於 Packer 是執行完 provisioner 後,通過 docker commit 的方式構建鏡像,所以 Packer 的構建只會增加額外的一個層,避免不恰當的 Dockerfile 增加多個層的問題。

Packer +Terraform,1+1>2

Packer 配合 Git、Terraform、UCloud CLI 等使用,可以實現 DevOps 下的基礎設施即代碼(IaC),達到持續集成和快速交付。

如下圖,Packer 配合 Git 對鏡像的配置文件做版本化控制,從而來實現服務的版本化,保證了實例的最終一致性,然後利用 Packer 和 Terraform 自動化構建服務的目的。

1. 在自動化流程中,首先變更鏡像配置倉庫,觸發執行 Terraform 命令;

2. Terraform 執行 packer build 命令構建鏡像;

3. 將製作成功的鏡像查詢給 Terraform 使用;

4. 最後由 Terraform 構建並啓動新實例替換原有的舊實例,完成服務自動化部署。

UCloud 此前已提供對 Terraform 的官方集成,可通過產品文檔瞭解更多詳情。文檔鏈接:https://docs.ucloud.cn/compute/terraform/index

總結

UCloud 通過對 Packer 的接入,提供了一種在雲主機中自動化配置環境的能力,而且它可以配合 cloud-init 及一些常用的自動化部署軟件使用,進一步拓展功能。另外,通過配合UCloud Terraform 、UCloud CLI 等工具,可以實現對基礎架構的版本化和代碼化管理,達到精準交付和快速部署以及最終一致性。

官方參考文檔地址:https://www.packer.io/docs/builders/ucloud-uhost.html

想了解更多有關基礎設施即代碼服務的技術,歡迎關注“UCloud技術”,查看Packer文章,加入交流羣,和我們一起探討關於產品使用的各種需求和疑問。

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