以下完整的對(duì)話記錄,U 為提問者,P為Paul Biggar(Founder of CircleCI)。
U:Hi,我老板讓我采訪你,我聽說你是個(gè)Web專家?
P:是啊,我現(xiàn)在專攻分布式系統(tǒng)。我剛從ContainerCamp和Gluecon回來,打算下周參加DockerCon。真的很興奮,整個(gè)行業(yè)正朝著 - 讓一切更簡(jiǎn)單,更可靠的方式前進(jìn)。這就是未來!
U:Cool,我現(xiàn)在構(gòu)建一個(gè)簡(jiǎn)單的Web應(yīng)用程序 ——一個(gè)使用Rails的普通CRUD應(yīng)用程序,將會(huì)部署到Heroku的。給我提些建議?
P:Oh,不。這是老方式。Heroku已死 ——沒有人會(huì)再使用它了。你現(xiàn)在需要使用Docker。這才是未來。
U:Oh,好的。Docker是什么?
P:Docker是一種新的容器化的方式。就像LXC,但Docker也是一種打包形式、分發(fā)平臺(tái)和工具,它可以讓分布式系統(tǒng)的構(gòu)建變得非常容易。
U:容器化 ——那是什么?什么是LXE?
P:是LXC。你可以把它想成chroot的升級(jí)版。
U:什么是 cher-oot?
P:好,看看。Docker。集裝箱。這就是未來。這就像虛擬化,但速度更快、更廉價(jià)。
U:Oh,就像Vagrant。
P:不,Vagrant已死。一切都將會(huì)被容器化,這就是未來。
U:好了,所以我不需要知道虛擬化什么嗎?
P:不,你仍然需要虛擬化,因?yàn)槿萜髂壳皼]有提供充分的安全保證。所以,如果你想在多租戶環(huán)境中運(yùn)行應(yīng)用,你仍然需要沙箱。
U:好吧,我開始有點(diǎn)糊涂了。讓我們一起回顧下。現(xiàn)在有一個(gè)像虛擬化一樣的東西,被稱為容器。我可以在Heroku上使用它嗎?
P:嗯,Heroku提供了對(duì)Docker的支持,但我告訴你:Heroku已經(jīng)死了。你需要在CoreOS上運(yùn)行你的容器。
U:擦,那CoreOS是什么?
P:它是一個(gè)可以運(yùn)行Docker的Host OS。該死的,你甚至都不需要Docker,可以直接使用rkt。
U:Rocket?
P:不,rkt。
U:沒錯(cuò),那就是Rocket。
P:不,現(xiàn)在已經(jīng)叫rkt了。與Docker完全不同。這是另一種集裝箱格式,不像Docker把東西都綁定在一起,所以它更可以隨意組合。
U:那樣很好?
P:當(dāng)然這是很好的。組合是未來的趨勢(shì)。
U:好,你如何使用它?
P:我不知道。估計(jì)還沒人能玩轉(zhuǎn)它。
U:好吧。那你接著剛才繼續(xù)說下CoreOS?
P:它是一個(gè)可以使用Docker的Host OS。
U:什么是Host OS?
P:一個(gè)運(yùn)行容器的主機(jī)操作系統(tǒng)。
U:運(yùn)行我的容器?
P:是啊,你總得有運(yùn)行東西的容器。就像你設(shè)置一個(gè)EC2實(shí)例,你把CoreOS放上去就可以了,隨后運(yùn)行Docker的守護(hù)進(jìn)程,然后你就可以將Docker鏡像部署上去。
[page]U:其中哪一部分是容器?
P:所有。你可以把應(yīng)用程序?qū)憺橐粋€(gè)Dockerfile,然后在本地把它變成一個(gè)鏡像,這樣,鏡像就可以被部署到任何Docker主機(jī)了。
U:啊,就像Heroku?
P:不,不是Heroku。我告訴過你了。Heroku死了。你現(xiàn)在使用的是Docker。
U:什么?
P:是啊,這真的很簡(jiǎn)單。查一查#gifee。
U:Gify?
P:“谷歌的基礎(chǔ)設(shè)施”。你可以基于一些現(xiàn)有的工具,并通過使用容器,就可以擁有和谷歌相同的基礎(chǔ)設(shè)施了。
U:我為什么不只使用谷歌的東西呢?
P:你認(rèn)為這將是大約6個(gè)月可以完成的?
U:OK,沒有云服務(wù)商提供類似的服務(wù)嗎?我真的不想自己搞一套
P:嗯,亞馬遜有ECS,但你得寫煩人的XML。
U:OpenStack又是什么東西?
P:Ew。
U:Ew?
P:Ew。
U:我真的不想自建。
P:不,它真的很容易。您只需設(shè)置一個(gè)Kubernetes集群。
U:我需要一個(gè)集群?
P:Kubernetes集群。它會(huì)管理所有服務(wù)的部署。
U:我只有一個(gè)服務(wù)。
P:什么意思?你確實(shí)有一個(gè)應(yīng)用程序,所以你必須至少有8-12個(gè)服務(wù)?
U:什么?沒有,我只是一個(gè)應(yīng)用程序。為什么有那么多服務(wù)?
P:不,看看微服務(wù)。這是未來。這就是現(xiàn)在我們所做的一切。你把你的整體應(yīng)用程序分解成12個(gè)服務(wù)。每一個(gè)服務(wù)只做一件事情。
U:這似乎代價(jià)過高。
P:這是確保應(yīng)用可靠的唯一途徑。你可以想象下如果你的驗(yàn)證服務(wù)宕機(jī)了...
U:認(rèn)證服務(wù)?我之前用的是Gem。
P:對(duì)的。使用gem。把它轉(zhuǎn)變?yōu)橐粋€(gè)項(xiàng)目,再封裝一個(gè)RESTful API就可以了。當(dāng)你的其它服務(wù)使用這個(gè)API的時(shí)候,它就會(huì)變得非常容器。最后你可以把這個(gè)項(xiàng)目放在容器中。
U:好了,現(xiàn)在我已經(jīng)得到了幾十個(gè)難以管理的服務(wù),現(xiàn)在該怎么辦?
P:Yeah,我提到的Kubernetes。它可以讓你協(xié)調(diào)所有的服務(wù)。
U:交給Kubernetes進(jìn)行調(diào)度?
P:是啊,你的這些服務(wù)并不是每時(shí)每刻都是可靠的,所以你需要有多個(gè)『副本』。Kubernetes就是讓這些服務(wù)分布在你的集群的多臺(tái)主機(jī)上,以保證服務(wù)的可靠性。
U:我需要一個(gè)集群呢?
P:是啊,為了可靠性。Kubernetes會(huì)幫你管理。Kubernetes是谷歌的一個(gè)開源項(xiàng)目,它有使用到etcd。
U:什么是etcd?
P:它是Raft的實(shí)現(xiàn)。
U:好了,什么是Raft?
P:它就像Paxos。
U:好,什么是Paxos?
P:Paxos就是沒有人理解或使用的上世紀(jì)70年代老的分布式共識(shí)協(xié)議。
U:太好了,謝謝你告訴我。Raft是什么?
P:由于沒有人理解Paxos,所以Diego....
U:哦,你認(rèn)識(shí)他嗎?
P:不,他在CoreOS工作。換句話說,因?yàn)镻axos太難了,Diego就在他的博士論文中發(fā)布了Raft。聰明的家伙。之后他寫了etcd作為實(shí)現(xiàn),Aphyr說,這不是狗屎。
[page]U:什么是Aphyr?
P:Aphyr是那家伙昵稱,“就叫我這個(gè)名字吧。” 你要知道,關(guān)于分布式系統(tǒng)和BDSM的人?
U:什么?你說BDSM?
P:是啊,BDSM。那在舊金山。每個(gè)人都向往分布式系統(tǒng)和BDSM。
U:嗯,OK。他寫過Katy Perry的歌曲?
P:不,他寫了一組博客文章有關(guān)如何在每個(gè)數(shù)據(jù)庫(kù)發(fā)生故障時(shí)CAP。
U:什么是CAP?
P:CAP定理。CAP 理論說在一個(gè)系統(tǒng)中對(duì)某個(gè)數(shù)據(jù)不存在一個(gè)算法同時(shí)滿足一致性,可用性和分區(qū)容忍性。
U:OK,所有數(shù)據(jù)庫(kù)發(fā)生故障時(shí)CAP?這是什么意思?
P:就像Mongo。
U:我以為Mongo was web scale?(此處有梗http://www.mongodb-is-web-scale.com/是個(gè)Mongo網(wǎng)站)
P:沒有其他人會(huì)這么做。
U:好了,那 etcd?
P:是啊, etcd是一個(gè)分布式key-value存儲(chǔ)。
U:哦,就像Redis。
P:不,一點(diǎn)都不像Redis。etcd是分布式的。
U:好的,這是一個(gè)分布式 key-value存儲(chǔ)。
P:Kubernetes設(shè)置一個(gè)使用etcd作為消息總線標(biāo)準(zhǔn)的5個(gè)節(jié)點(diǎn)集群。它結(jié)合了Kubernetes自己的服務(wù),并提供一個(gè)非常彈性的業(yè)務(wù)流程體系。
U:5個(gè)節(jié)點(diǎn)?我有一個(gè)應(yīng)用程序。我做這些該需要多少臺(tái)機(jī)器啊?
P: 嗯,你將有大約12個(gè)服務(wù),當(dāng)然,你需要冗余副本,幾個(gè)負(fù)載均衡的集群etcd,你的數(shù)據(jù)庫(kù)和kubernetes集群。因此,需要運(yùn)行50個(gè)容器。
U:擦!
P:沒什么大不了!容器是非常高效的,所以你應(yīng)該能夠分發(fā)這些跨越在8臺(tái)服務(wù)器上!是不是很神奇呢?
U:這就是把它的一種方式。而完成這一切,我就可以簡(jiǎn)單地部署我的應(yīng)用程序?
P:當(dāng)然。我的意思是,存儲(chǔ)仍然是Docker和Kubernetes一個(gè)未解決的問題,并且網(wǎng)絡(luò)也會(huì)有不少問題,但你基本上還沒到那步!
U:我明白。好吧,我想我會(huì)努力得到他。
P:非常好!
U:感謝解釋它。
P:沒問題。
U:請(qǐng)?jiān)试S讓我再說復(fù)述一遍,看看是否我的理解是否正確的。
P:當(dāng)然可以。
U:我只需要將我簡(jiǎn)單的CRUD應(yīng)用程序分割成12個(gè)微服務(wù),每個(gè)都有自己的API,每個(gè)微服務(wù)調(diào)用其中其他的API,而且彈性處理失敗,并把它們放到Docker容器中。Docker容器又運(yùn)行于CoreOS之上,并分布在集群的8臺(tái)機(jī)器上,同時(shí)使用運(yùn)行etcd的Kubernetes集群來調(diào)度他們,再解決『網(wǎng)絡(luò)和存儲(chǔ)』難題,然后我不斷地提供每個(gè)微服務(wù)的多個(gè)冗余副本到我的集群。是不是這樣?
P:是!是不是很炫酷?
U:我要用回Heroku。