虛擬機(jī)已死 容器才是未來?
我也曾經(jīng)是容器技術(shù)尤其是Docker粉絲,但用了一年后覺得事情也沒那么美好,而頗有一些同學(xué)以及一些公司依然認(rèn)為容器就是銀彈,虛擬機(jī)已經(jīng)是昨兒黃花必須打倒,大家趕緊一切皆容器。這里我對(duì)這種觀點(diǎn)吐吐槽。僅代表作者個(gè)人看法
本文引用地址:http://cafeforensic.com/article/201605/290774.htm首先要明確的是,軟件開發(fā)和運(yùn)維活動(dòng)中,可維護(hù)性、正確性、性能的優(yōu)先級(jí)是依次降低的,不要跟我抬杠少數(shù)極端情況。關(guān)于可維護(hù)性和正確性的先后,著 名的 "worse is better" 文章就是很好的無奈的解釋,如果你猶豫這兩者,這還情有可原,畢竟真善美和糙快猛的斗爭(zhēng)從未停歇,而你如果第一反應(yīng)覺得性能是最重要的,那就不要繼續(xù)往下 看了,洗洗去睡吧——適合的才是最好的。
那么對(duì)于虛擬機(jī) vs 容器,自然我們也需要從這三方面考察。
回合一:可維護(hù)性之爭(zhēng)
虛擬機(jī)—維護(hù)性
從 hypervisor 講,Xen/KVM/vSphere/HyperV 都很成熟了,久經(jīng)考驗(yàn),BSD 也在湊熱鬧搞 bhyve(FreeBSD) 和 vmm(OpenBSD),最近 unikernel 也在試圖跑在 hypervisor 上,而 AWS/GCE/Azure 等等云計(jì)算巨頭以及 Intel/AMD 等在CPU、磁盤和網(wǎng)絡(luò)IO虛擬化技術(shù)上的投資顯然不會(huì)立馬推翻,Linux 上虛擬機(jī)的開源管理方案也已成熟定型:libvirt, OpenStack, 沒人吃飽了撐的去弄個(gè) “新的開源” 項(xiàng)目替換它們,雖然我很不喜歡 OpenStack 的亂糟和復(fù)雜。VM 的動(dòng)態(tài)遷移也是成熟技術(shù),出來好多年了,實(shí)現(xiàn)原理非常簡(jiǎn)單,反正整個(gè) OS 內(nèi)存一鍋端弄過去,不操心少個(gè)依賴進(jìn)程的內(nèi)存沒過去。想用不同版本內(nèi)核? 想要自定義內(nèi)核模塊?想調(diào)整內(nèi)核參數(shù)?期望更安全的隔離?期望如同物理機(jī)版幾乎一致的使用體驗(yàn)?VM 就是虛擬機(jī)的縮寫嘛,這些都是拿手戲。
容器— 維護(hù)性
Linux 容器,Linux 一貫的作風(fēng),慢慢演化,不求仔細(xì)設(shè)計(jì),然后就是 cgroup, pid/uts/ipc/net/uid namespace 一個(gè)個(gè)實(shí)現(xiàn)出來,湊出一個(gè)容器技術(shù),貌似 uid namespace 還是最近剛剛出來的特性。用戶空間則更是群雄并起,LXC,Docker,rkt,LXD,各有擁蹇,鹿死誰手,還真不好說,在這個(gè)局還沒明朗的時(shí) 候,Mesos、Swarm、Kubernetes、Nomad 又出來一堆攪局的,眼下看來最吸引眼球的 Kubernetes 儼然有 OpenStack 繼任者的感覺,但依然很嫩,沒幾個(gè)人敢在生產(chǎn)環(huán)境大規(guī)模使用。
Linux容器里進(jìn)程的跨機(jī)器動(dòng)態(tài)遷移我還沒聽說,不要說是個(gè)服務(wù)就得有集群有 HA 嘛,可還真有不少用戶一個(gè)服務(wù)就單機(jī)頂著呢,就算有熱備或者冷備,在線那臺(tái)機(jī)器內(nèi)存里的東西可寶貴了,輕易不能丟。用Linux容器就不能挑內(nèi)核,不能加 載內(nèi)核模塊,不能掛載文件系統(tǒng),不能調(diào)整內(nèi)核參數(shù),不能改網(wǎng)絡(luò)配置,等等,不要告訴我你能——你是不是開了 docker run --privileged 了? 你是不是沒 drop capability?你是不是沒有 remap uid?話說某大公司的容器還真就用 --privileged 選項(xiàng)跑的呢。 而 Linux 的隔離不徹底恐怕大部分人都沒意識(shí)到,/sys, /dev, /selinux 還有 /proc 下的某些關(guān)鍵文件比如 /proc/kcore 沒隔離呢。
Redhat 做的 project Atomic 意識(shí)到這些問題,正在積極的給 Docker 加 SELinux 支持,指定 SELinux policy,但 Docker 官方愛搭不理,而且 SELinux 這種高端技術(shù)是凡人玩的么? 結(jié)局大概依然是 "FAQ 1: 關(guān)掉 SELinux"。Linux 容器本來并不局限在一個(gè)容器里跑幾個(gè)進(jìn)程,但 Docker 官方為了加強(qiáng)“輕量級(jí)”這詞的洗腦效果,搞出個(gè)無比腦殘的 single process 理念,被無數(shù)人捧臭腳,所幸有些人慢慢意識(shí)到問題,Yelp 搞了個(gè) dumb-init 擦了一半屁股,還有無數(shù) docker image 用 runit、supervisor 之類的做 /sbin/init 替換,但問題在于這要自定義啟動(dòng)腳本,需要加 ssh/cron/syslog/logrotate 等等邊角料——這已然是解決了無數(shù)遍的問題,還要解決一遍,不覺得麻煩嗎?難道沒有人認(rèn)為這些包的作者或者打包者更善于處理服務(wù)啟動(dòng)腳本么?像 systemd 那種搞法還算正道,特意考慮容器環(huán)境,跳過一些步驟,但貌似還沒做完善,需要手動(dòng)刪除一些 .service 文件。
評(píng)論