前言:
最近學(xué)到了用Docker、AWS(CloudFormation)、Bitbucket、Buildkite、Packer來(lái)創(chuàng)建EC2實(shí)例來(lái)跑代碼的一套流程,在這里主要對(duì)Packer進(jìn)行介紹,之后有機(jī)會(huì)再補(bǔ)上CloudFormation的內(nèi)容。
文章內(nèi)容如下
1.什么是CloudFormation?
2.什么是AMI?
3.什么是Packer?
4.了解了以上的一些信息之后,我們來(lái)看一下從代碼提交開(kāi)始是怎么一步步執(zhí)行的。
5.為什么是Packer?別的技術(shù)不行嗎?
6.我該怎么快速了解這個(gè)Packer并投入使用?
在介紹Packer之前,我們先來(lái)介紹一下前置知識(shí)。
1.什么是CloudFormation?
A CloudFormation template describes your desired resources and their dependencies so you can launch and configure them together as a stack. You can use a template to create, update, and delete an entire stack as a single unit, as often as you need to, instead of managing resources individually.
上文是摘自AWS官網(wǎng)的描述,CloudFormation stack 可以理解成要?jiǎng)?chuàng)建的AWS服務(wù)和一些參數(shù)的集合
2.什么是AMI?
AMI 全稱是 Amazon Machine Image,AWS 官方提供了很多現(xiàn)成的 AMI, 就跟 Docker Registry 提供了很多 Base Image 一樣, 為了一些定制的需求,就是啟動(dòng) EC2 節(jié)點(diǎn)時(shí)指定的操作系統(tǒng)的鏡像。截屏2020-11-29 上午1.46.15
3.什么是Packer?
自動(dòng)化打包鏡像的輕量級(jí)開(kāi)源工具,可憑借單一配置文件,高效并行的為多云平臺(tái)創(chuàng)建一致性的鏡像
同樣上文可能仍然會(huì)有一些疑惑,在這里我介紹一下我所了解到的AWS和Packer的整合方式:
1.Packer會(huì)從AWS提供的AMI中選擇一個(gè)來(lái)deploy,使其成為一個(gè)EC2實(shí)例(這里以EC2來(lái)舉例,它還可以包括其他實(shí)例的AMI,下同)
2.使用所有自定義配置來(lái)配置這個(gè)EC2實(shí)例,然后從這個(gè)EC2實(shí)例中創(chuàng)建一個(gè)AMI
3.一旦創(chuàng)建好了一個(gè)AMI,那么一開(kāi)始部署的這個(gè)EC2就會(huì)被銷毀。
一開(kāi)始我并不是很能區(qū)分Packer和CloudFormation之間的區(qū)別,事實(shí)上,Packer專注于對(duì)EC2的配置,而CloudFormation則更高一級(jí),他里面不僅有EC2、還包含著S3、LoadBalance、SNS、環(huán)境變量等一些配置。
4.了解了以上的一些信息之后,我們來(lái)看一下從代碼提交開(kāi)始是怎么一步步執(zhí)行的。

以下是對(duì)上圖的簡(jiǎn)單文字介紹:
1.首先本地push代碼到Bitbucket之后,由于Pipeline的配置會(huì)觸發(fā)Pileline的build流程,F(xiàn)etch在Bitbucket中新的代碼
2.在我們的Pipeline的配置文件中,第一步我們執(zhí)行一些對(duì)Template的驗(yàn)證、跑一下測(cè)試方法(在圖中并沒(méi)有畫出)
3.Create AMI
3.1驗(yàn)證Packer 和CloudFormation的Template沒(méi)有問(wèn)題后,就Packer出場(chǎng),通過(guò)Packer Template,在AWS商店中找到相應(yīng)的 AMI
3.2 將這個(gè)AMI部署成EC2后,在此EC2上根據(jù)Template配置SSH、添加一些文件(比如傳一些腳本上去),你可以在官網(wǎng)上找到這 配置的意義https://www.packer.io/docs/builders/amazon-ebs.html
3.3 將這個(gè)EC2變成我們自定義的AMI,會(huì)在下面的CloudFormation中用到4.Deploy(這里本來(lái)還應(yīng)該有部署到測(cè)試環(huán)境,此處省略了)
4.1 通過(guò)CloudFormation配置的AWS服務(wù)之間的關(guān)系、參數(shù)來(lái)創(chuàng)建我們的AWS堆棧(這里舉個(gè)例子:比如一個(gè)博客網(wǎng)站,他可能需要一個(gè)S3、ALB(一種LoadBalance)、EC2(當(dāng)然這里還要配置一下,使用我們剛才Packer創(chuàng)建的AMI來(lái)部署這個(gè)EC2)、SNS)
讀到此相信你對(duì)Packer和CloudFormation已經(jīng)有簡(jiǎn)單的了解了,那么我們?cè)賮?lái)回頭看這個(gè)Packer。
5.為什么是Packer?別的技術(shù)不行嗎?
在回答此問(wèn)題前,我們先來(lái)看看傳統(tǒng)的可變基礎(chǔ)架構(gòu):
在傳統(tǒng)的可變服務(wù)器基礎(chǔ)架構(gòu)中,服務(wù)器會(huì)不斷更新和修改。使用此類基礎(chǔ)架構(gòu)的工程師和管理員可以通過(guò)SSH連接到他們的服務(wù)器,手動(dòng)升級(jí)或降級(jí)軟件包,逐個(gè)服務(wù)器地調(diào)整配置文件,以及將新代碼直接部署到現(xiàn)有服務(wù)器上。
這樣會(huì)造成一個(gè)問(wèn)題: 配置漂移,即當(dāng)構(gòu)建好的服務(wù)被部署在服務(wù)器上后,由于有人登陸該服務(wù)器并修改了一個(gè)東西,導(dǎo)致該服務(wù)的配置被更改,從而使機(jī)器上的實(shí)際配置與源代碼管理的配置不一致
不可變基礎(chǔ)架構(gòu):
一個(gè)不變的基礎(chǔ)設(shè)施是另一個(gè)基礎(chǔ)設(shè)施范例,他們部署了服務(wù)器之后決不會(huì)被修改。如果需要以任何方式更新,修復(fù)或修改某些內(nèi)容,則會(huì)根據(jù)具有相應(yīng)更改的公共映像構(gòu)建新服務(wù)器以替換舊服務(wù)器。經(jīng)過(guò)驗(yàn)證后,它們就會(huì)投入使用,而舊的則會(huì)退役。
不可變基礎(chǔ)架構(gòu)的好處包括基礎(chǔ)架構(gòu)中更高的一致性和可靠性,以及更簡(jiǎn)單,更可預(yù)測(cè)的部署過(guò)程。
Packer正是一個(gè)不可變基礎(chǔ)架構(gòu)的解決方案(當(dāng)然還需要借助其他工具一起完成不可變服務(wù)器的搭建)。
他可以將Develop->Deploy->Configure的步驟變成Develop->Configure->Deploy
6.我該怎么快速了解這個(gè)Packer并投入使用?
1.首先推薦一個(gè)我在學(xué)習(xí)過(guò)程中看的介紹視頻:https://www.youtube.com/channel/UC2sYgV-NV6S5_-pqLGChoNQ
可以在下面的頻道上看到Packer的介紹和簡(jiǎn)單入門使用。
2.Packer官網(wǎng):https://www.packer.io/docs/builders/amazon/ebs
這個(gè)鏈接導(dǎo)向的是Packer與AWS整合部分。
