不是技术也能看懂容器技术与容器平台
在云計算領域有一個新的技術,稱為容器。
傳統的云計算是基于虛擬機技術的,而容器技術解決了虛擬機原來解決不了的問題。
云計算主要解決的是資源彈性的問題,感興趣的可以看歷史文章《不懂技術也能看懂云計算,大數據,人工智能》。
所謂資源,主要是指計算,網絡,存儲。羅永浩在采訪中說過,他要做最大的計算平臺,當前是手機,其實大家買手機也是關心CPU,內存有多少,有多大的存儲空間,3G還是4G網絡的問題。
云計算所能解決的是計算,網絡,存儲這三種資源想什么時候要什么時候要,想要多少要多少的問題。
但是云計算解決不了的問題有兩個:
第一個問題是應用層的擴展性問題。
例如我開發一個電商應用,平時的時候10臺機器能扛的住,雙十一的時候需要100臺才能抗的住。那怎么辦?云計算平臺可以實現一點90臺新機器就出來了,但是機器是空的啊,上面什么應用都沒安裝,還需要人工登到每臺機器上去一臺一臺的部署,非常麻煩。
后來人們想了兩種方式解決這個問題,第一種方式是采用自動化腳本來安裝,不需要手動來,而是自動來,第二種方式是通過虛擬機的鏡像,在虛擬機上把應用都安裝好,然后像孫悟空一樣,說“定”,虛擬機里面的狀態就保存下來了,后面擴展的時候,通過這個鏡像來完成。
這兩種方式部分的解決了第一個問題,隨之而來的是第二個問題,遷移性問題。
軟件往往是需要不斷的在不同的環境里面安裝的,例如開發人員自己會安裝一套,測試人員會安裝一套,線上環境也會安裝一套。然而軟件的安裝是非常復雜的,牽扯到權限問題,配置問題,文件路徑問題等,一不小心就會出錯,出錯了軟件的行為就不對了,你上網買東西,用銀行支付都可能出錯,造成大麻煩。
一開始人們還是想通過上面兩種方式來解決這個問題的,但是都不太成功。一是通過自動化腳本,然而不同的環境千差萬別,一個腳本往往在一個環境上運行正確,到另一個環境就不正確了。二是通過虛擬機鏡像,然而虛擬機鏡像太大了,動不動就幾十個G,拷貝和下載都太費時間,而且大多數公有云平臺都不提供虛擬機鏡像的上傳和下載,亞馬遜上的虛擬機鏡像,就沒辦法下載到你的數據中心里面來,也沒法放到網易云上去。
于是為了解決這兩大問題,容器誕生了。
容器是 Container,Container另一個意思是集裝箱,其實容器的思想就是要變成軟件交付的集裝箱。集裝箱的特點,一是封裝,二是標準。
在沒有集裝箱的時代,假設將貨物從 A運到 B,中間要經過三個碼頭、換三次船。每次都要將貨物卸下船來,擺的七零八落,然后搬上船重新整齊擺好。因此在沒有集裝箱的時候,每次換船,船員們都要在岸上待幾天才能走。
有了集裝箱以后,所有的貨物都打包在一起了,并且集裝箱的尺寸全部一致,所以每次換船的時候,一個箱子整體搬過去就行了,小時級別就能完成,船員再也不用上岸長時間耽擱了。
這是集裝箱“封裝”、“標準”兩大特點在生活中的應用。
那么容器如何對應用打包呢?還是要學習集裝箱,首先要有個封閉的環境,將貨物封裝起來,讓貨物之間互不干擾,互相隔離,這樣裝貨卸貨才方便。好在 Ubuntu中的LXC技術早就能做到這一點。
封閉的環境主要使用了兩種技術,一種是看起來是隔離的技術,稱為 Namespace,也即每個 Namespace中的應用看到的是不同的 IP地址、用戶空間、程號等。另一種是用起來是隔離的技術,稱為 Cgroups,也即明明整臺機器有很多的 CPU、內存,而一個應用只能用其中的一部分。
有了這兩項技術,集裝箱的鐵盒子我們是焊好了,接下來就是決定往里面放什么。
最簡單粗暴的方法,就是將所有的都放到集裝箱里面,就像虛擬機鏡像一樣,但是這樣太大了!因為即使你安裝一個干干靜靜的操作系統,什么都不裝,就很大了。把操作系統裝進容器相當于把船也放到了集裝箱里面!傳統的虛擬機鏡像就是這樣的,動輒幾十G。答案當然是 NO!所以第一項操作系統不能裝進容器。
撇下第一項操作系統,剩下的所有的加起來,也就幾百 M,就輕便多了。因此一臺服務器上的容器是共享操作系統內核的,容器在不同機器之間的遷移不帶內核,這也是很多人聲稱容器是輕量級的虛擬機的原因。輕不白輕,自然隔離性就差了,一個容器讓操作系統崩潰了,其他容器也就跟著崩潰了,這相當于一個集裝箱把船壓漏水了,所有的集裝箱一起沉。
另一個需要撇下的就是隨著應用的運行而產生并保存在本地的數據。這些數據多以文件的形式存在,例如數據庫文件、文本文件。這些文件會隨著應用的運行,越來越大,如果這些數據也放在容器里面,會讓容器變得很大,影響容器在不同環境的遷移。而且這些數據在開發、測試、線上環境之間的遷移是沒有意義的,生產環境不可能用測試環境的文件,所以往往這些數據也是保存在容器外面的存儲設備上。這也是為什么人們稱容器是無狀態的。
至此集裝箱焊好了,貨物也裝進去了,接下來的問題就是如何將這個集裝箱標準化,從而在哪艘船上都能運輸。這里的標準一個是鏡像,一個是容器的運行環境。
所謂的鏡像,就是將你焊好集裝箱的那一刻,將集裝箱的狀態保存下來,就像孫悟空說:“定”,集裝箱里面就定在了那一刻,然后將這一刻的狀態保存成一系列文件。這些文件的格式是標準的,誰看到這些文件都能還原當時定住的那個時刻。將鏡像還原成運行時的過程(就是讀取鏡像文件,還原那個時刻的過程)就是容器運行的過程。除了大名鼎鼎的 Docker,還有其他的容器,例如 AppC、Mesos Container,都能運行容器鏡像。所以說容器不等于 Docker。
總而言之,容器是輕量級的、隔離差的、適用于無狀態的,可以基于鏡像標準實現跨主機、跨環境的隨意遷移。
有了容器,使得 PaaS層對于用戶自身應用的自動部署變得快速而優雅。容器快就快在兩方面:第一,虛擬機啟動的時候要先啟動操作系統,容器不用啟動操作系統,因為是共享內核的;第二,虛擬機啟動后使用腳本安裝應用,容器不用安裝應用,因為已經打包在鏡像里面了。所以最終虛擬機的啟動是分鐘級別,而容器的啟動是秒級。容器咋這么神奇?其實一點都不神奇,第一是偷懶少干活了,第二是提前把活干好了。
由于容器的粒度更加細,管理起來更難管,甚至是手動操作難以應對的。假設你有 100臺物理機,其實規模不是太大,用 Excel人工管理是沒問題的,但是一臺上面開 10臺虛擬機,虛擬機的個數就是 1000臺,人工管理已經很困難了,但是一臺虛擬機里面開 10個容器,就是 10000個容器,你是不是已經徹底放棄人工運維的想法了。
所以容器層面的管理平臺是一個新的挑戰,關鍵字就是自動化:
自發現:容器與容器之間的相互配置還能像虛擬機一樣,記住 IP地址然后互相配置嗎?這么多容器,一旦一臺虛擬機掛了重啟,IP改變,你怎么記得住應該改哪些配置,列表長度至少萬行級別的啊。所以容器之間的配置通過名稱來的,無論容器跑到哪臺機器上,名稱不變,就能訪問到。
自修復:容器掛了,或是進程宕機了,能像虛擬機那樣登陸上去查看一下進程狀態,如果不正常可以重啟一下么?那你要登陸萬臺 Docker了。所以容器的進程掛了,容器就自動掛掉了,然后自動重啟。
彈性自伸縮 Auto Scaling:當容器的性能不足的時候,需要手動伸縮、手動部署么?當然也要自動來。
當前火熱的容器管理平臺有三大流派:
一個是 Kubernetes,我們稱為段譽型。
段譽(Kubernetes)的父親(Borg)武功高強,出身皇族(Google),管理過偌大的一個大理國(Borg是 Google數據中心的容器管理平臺)。作為大理段式后裔,段譽的武功基因良好(Kubernetes的理念設計比較完善),周圍的高手云集,習武環境也好(Kubernetes生態活躍,熱度高),雖然剛剛出道的段譽武功不及其父親,但是只要跟著周圍的高手不斷切磋,武功即可飛速提升。
一個是 Mesos,我們稱為喬峰型。
喬峰(Mesos)的主要功夫降龍十八掌(Mesos的調度功能)獨步武林,為其他幫派所無。而且喬峰也管理過人數眾多的丐幫(Mesos管理過 Tweeter的容器集群)。后來喬峰從丐幫出來,在江湖中特例獨行(Mesos的創始人成立了公司 Mesosphere)。喬峰的優勢在于,喬峰的降龍十八掌(Mesos)就是在丐幫中使用的降龍十八掌,相比于段譽初學其父的武功來說,要成熟很多。但是缺點是,降龍十八掌只掌握在少數的幾個丐幫幫主手中(Mesos社區還是以 Mesosphere為主導),其他丐幫兄弟只能遠遠崇拜喬峰,而無法相互切磋(社區熱度不足)。
一個是 Swarm,我們稱為慕容型。
慕容家族(Swarm是 Docker家族的集群管理軟件)的個人功夫是非常棒的(Docker可以說稱為容器的事實標準),但是看到段譽和喬峰能夠管理的組織規模越來越大,有一統江湖的趨勢,著實眼紅了,于是開始想創建自己的慕容鮮卑帝國(推出 Swarm容器集群管理軟件)。但是個人功夫好,并不代表著組織能力強(Swarm的集群管理能力),好在慕容家族可以借鑒段譽和喬峰的組織管理經驗,學習各家公司,以彼之道,還施彼身,使得慕容公子的組織能力(Swarm借鑒了很多前面的集群管理思想)也在逐漸的成熟中。
三大容器門派,到底鹿死誰手,誰又能一統江湖,尚未可知。
總結
以上是生活随笔為你收集整理的不是技术也能看懂容器技术与容器平台的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上最容易懂的云计算的前世今生
- 下一篇: 我是如何指数级提升开发技术的?