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

背景html

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

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

Packer是什麼?shell

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

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

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

Hashicorp 官方將 Packer 的優點描述以下:ssh

**1. 基礎架構迅速部署:**Packer 鏡像能夠在幾秒鐘內啓動徹底配置的雲主機,有利於生產和開發;工具

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

**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 的官方集成,可經過產品文檔瞭解更多詳情。文檔連接:docs.ucloud.cn/compute/ter…

總結

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

官方參考文檔地址:www.packer.io/docs/builde…

相關文章
相關標籤/搜索