一千萬個為什麽

搜索


我正在研究一個項目,我們正在嘗試在容器上烘焙不可變的圖像作為IaC。這些圖像可以包含J2EE,.NET或Phyton應用程序。所有操作系統補丁應該經常應用於此圖像,應用程序更新也應該在此準備好運行圖像上更新。 話雖如此,我們討論的一個選項包括用於配置的Terraform,用於構建圖像的Packer。許多互聯網資源還將Ansible,Chef或Puppet加入到這個組合中。我的問題為什麽Packer不足以覆蓋烘焙圖像,為什麽我還需要考慮Ansible/Chef/Puppet? Packer不能做什麽以及其他人可以滿足這些要求? 感謝您的時間和幫助...

轉載註明原文: 烘焙不變的圖像

一共有 3 個回答:

您的問題的一個主要關鍵是不可變的基礎架構,這是圖像構建一次,部署多次並且在運行時永遠不會更改的想法。如果圖像的內容需要更改,則全新的圖像將從頭開始構建,而新的實例會替換運行舊圖像的圖像。

這與您現在稱之為_mutable基礎結構的情況正好相反,在這種情況下,機器(或容器)通常從通用操作系統映像引導,然後由配置管理工具持續管理其內容。在這個模型中,實例通常壽命更長,並在原地進行更改以響應新的需求。

打包器的目的是作為不可變基礎結構的構建塊。它旨在協調創建可立即引導到所需狀態的定制圖像。如果不可變的基礎架構適合您的用例(不一定是這種情況!),那麽Ansible,Chef和Puppet等工具可能是不必要的。

然而,使用Packer以“一次性”模式(例如, Chef Solo )運行這些工具通常可以用於非平凡的圖像:這些工具通常提供比Packer單獨提供的更強大的抽象,使得配置init系統運行某些服務或創建用戶帳戶等事情更容易。在這種情況下,配置管理工具將在Packer中作為 provisioner 運行,在映像中創建必要的配置,但不涉及正在從映像引導的實例的維護。

大多數實際系統包括可變和不可變基礎設施的混合體,例如,不可變的基礎架構不適合有狀態的集中式系統。在這種情況下,使用傳統的配置管理系統可以在您的不可變和可變系統之間創建一個共同的功能基礎,以一次性的方式為不可變的映像應用配置,並以持續的,有狀態的方式運行,可變機器。

圖像生成和分發迅速上升到O(n ^ 2)或更高,並且由於terraform明確地集中在實例化上,它依賴於外部提供者的內部狀態。

它將以較小的規模工作,但會使混合雲模型復雜化很多,如果系統壽命長久,將會出現問題。

它也往往會導致叠代重構的困難,但這些將取決於你的用例。

例如,假設你想部署一個新版本的python模塊。如果你有一個輪子或一個requirements.txt文件,你可以在OS版本c和d上將它部署到雲提供商a,b,c。但對於完全烘焙的圖像,您必須生成並測試圖像a_c,b_c,c_c,a_d,b_d,c_d。如果每次叠代必須執行此操作,開發人員生產力的成本將迅速增長。

請註意,您可能會認為圖像完全不可變,但如果沒有配置管理工具,則無法確保它們。

由於現在一般的容器現在都在可信模型下工作,對於任何可以在docker之類的框架下啟動機器的進程或人員來對系統上的任何內容進行任意更改(每個API用戶都是root用戶,甚至是任何人在碼頭上的主機上),這是你想要解決的偶然事件。

如果您保持雲提供商,應用程序和基本操作系統之間的松散耦合,隨著時間的推移叠代要容易得多,並且供應商緩解要容易得多。

如果您為GCE,AWS和Azure維護terraform配置(分別為每個操作系統配置打包程序,然後單獨配置應用程序部署方法),則可能會增加初始復雜性,但這些成本會在項目的整個生命周期內快速攤銷。

我個人發現了一個類似於ansible的工具,它可以在沒有集中式基礎架構的情況下運行,並且可以在純粹的部署模型中使基於狀態的協調變更更加靈活,但是我總是不得不在某些時候以某種形式進行配置管理。

這可能不會直接映射到您的具體用例,但這是一個很好的理由,這是一種常見的做法。

我沒有看到包裝工和肛門/廚師/傀儡之間的關系。 Packer可能會給你一種方式來聲明你正在構建一個圖像,但是如果你不打算使用像ansible/chef/etc這樣的東西來加載你想要的圖像,那麽你如何提出將這些圖像放入圖片?

通常默認的答案是“我們會編寫腳本”,但她的腳本只是粘在一起的粘合劑,它們並不是專門為處理基礎設施和配置而設計的。

我一直在一個項目上工作了一段時間,我們已經做出了明智的決定,試圖寫出沒有shell腳本,即使它不太方便,我們仍然使用明確的,最好是聲明性的語言來編寫所有的東西。其他人正在維護標準(也就是說,我們不需要確保ansible可以做我們需要做的事情,我們讓開發人員這樣做,而不是編寫所有腳本,並且需要編寫所有的詳細操作)。

如果你認為你的配置管理工具只是一種很好的方式來聲明基本映像中的實際內容,那麽如果你希望開發人員信任他們的代碼將運行在其上的映像,那麽你就可以開始一個非常好的開始。