滴滴田志偉:關(guān)于自動(dòng)擴(kuò)容,我們線下的時(shí)候遇到一個(gè)問(wèn)題,我們最早的時(shí)候是用騰訊的公有云,它限制了 NET 的模塊,導(dǎo)致我們最初用 Cgroup 的方案去做,綁定端口。內(nèi)部使用所有應(yīng)用,端口是要做分配的,要不然出現(xiàn)端口沖突。然后遇到問(wèn)題是,在這種情況下,如果要做動(dòng)態(tài)擴(kuò)容的話,它每次先創(chuàng)建一個(gè),再殺掉一個(gè),導(dǎo)致每次起來(lái)的時(shí)候就起不來(lái)了,因?yàn)槎丝诘膯?wèn)題。服務(wù)啟動(dòng)的時(shí)候端口是隨機(jī),會(huì)出現(xiàn)沖突問(wèn)題,因?yàn)橛玫氖?Host 的模式。
主持人:關(guān)于自動(dòng)伸縮為什么沒(méi)有考慮到請(qǐng)求數(shù)?因?yàn)槿绻麅?nèi)存占用率如果超過(guò)一定預(yù)支,那么請(qǐng)求數(shù)也可能超過(guò)一定預(yù)支了。把單個(gè)容器所處理的請(qǐng)求數(shù)給限定了,那么它內(nèi)存自然不會(huì)超,然后也不會(huì)被干掉。
滬江黃凱:我個(gè)人認(rèn)為,第一,請(qǐng)求數(shù)很難測(cè),你不知道請(qǐng)求數(shù)到多少時(shí)要擴(kuò)容,還不如根據(jù) CPU 到 80%,或者 90% 來(lái)的直觀。我們的 API 也是根據(jù) CPU 來(lái)算的。你真正是高并發(fā)的 API 的話,我也測(cè)過(guò),最后我們能夠監(jiān)測(cè)到的,其實(shí)還是 CPU 和內(nèi)存。
扇貝丁彥:我們擴(kuò)容是根據(jù)響應(yīng)時(shí)間,跟請(qǐng)求數(shù)類似,請(qǐng)求數(shù)定指標(biāo)不太好定,我們是根據(jù)響應(yīng)時(shí)間,比如平時(shí)的響應(yīng)時(shí)間是 50 毫秒,當(dāng)響應(yīng)時(shí)間是 300 毫秒的時(shí)候就要擴(kuò)容了。
主持人:大家對(duì)于容器有狀態(tài)無(wú)狀態(tài)有沒(méi)有遇到什么問(wèn)題?大家一般用容器的本地磁盤還是共享磁盤呢?
滬江黃凱:關(guān)于存儲(chǔ),我們是有一些研究的。現(xiàn)在容器存儲(chǔ)問(wèn)題分為兩種,Kubernetes 官方支持一種理念,任何一種存儲(chǔ)都是一個(gè) Volume。Volume 先于 Docker 存在的,而不是 Docker 啟動(dòng)之后再掛載 Volume。不管是網(wǎng)絡(luò)存儲(chǔ)還是本地存儲(chǔ),全部以卷的形式,掛載在 Pod 里面或者是宿主機(jī)上,以 Driver mapper 來(lái)驅(qū)動(dòng)這個(gè) Volume,來(lái)讀到你所要的內(nèi)容。
還有一種情況,就是 Docker 公司主導(dǎo)的存儲(chǔ)模型,任何的存儲(chǔ)都是一種驅(qū)動(dòng)。如果你想用 NFS 或者如 Ceph 這樣分布式存儲(chǔ)的話,讓 Ceph 開(kāi)發(fā) Docker 的驅(qū)動(dòng),Docker run 的時(shí)候指定存儲(chǔ)的驅(qū)動(dòng),Docker storage driver這種方式,外部的存儲(chǔ)在容器內(nèi)部它展現(xiàn)形式可以是目錄,也可以是掛載卷、塊的形式。如果用塊掛載到容器中,這個(gè)容器自己格式化它,或直接讀取它都是可以的。它只不過(guò)它是相當(dāng)于用了一個(gè) Driver 的形式,把你的容器和分布式存儲(chǔ)建立一個(gè)連接而已。對(duì)于容器,如果原本綁定塊或 Volume,容器出現(xiàn)故障的話,直接把容器殺掉,再啟動(dòng)掛在同樣一個(gè) 塊或Volume就解決了。優(yōu)點(diǎn)是直接讀取,而不是通過(guò)再轉(zhuǎn)一層,效率比較高一點(diǎn)。所有存儲(chǔ)都是Volume 的形式理解度比較高一點(diǎn),所以我們還是贊同于用 Volume 的形式。
有狀態(tài)的容器。我知道k8s的新的計(jì)劃,如果你沒(méi)有用 Kubernetes 最新版本的話,一般來(lái)說(shuō)我們都是容器啟動(dòng)在固定Host 上,下次啟動(dòng)還是在這臺(tái) Host 上,它的存儲(chǔ)它的內(nèi)存,包括一些 log,全部是在這臺(tái) Host 上。還有一種是用最新的版本,有個(gè) PetSet的新kind,Kubernetes 它自己會(huì)記錄 Pod 在什么 Host 上啟動(dòng)過(guò),不用自己去指定一定要在某一臺(tái) Host 上啟動(dòng),這種方法比較智能化,但是不是特別穩(wěn)定的一種方法,因?yàn)樗莿倓傞_(kāi)發(fā)出來(lái)的新功能。
主持人:數(shù)據(jù)多副本,假設(shè)有一個(gè)節(jié)點(diǎn)故障的話,是建議它直接把原來(lái)的副本重新綁定還是重新起一個(gè)新的實(shí)例,通過(guò)分布式數(shù)據(jù)的遷移呢?
滬江黃凱:我個(gè)人認(rèn)為還是在同一臺(tái)機(jī)器上起一個(gè)新的實(shí)例,不要讓它做數(shù)據(jù)遷移,因?yàn)閿?shù)據(jù)遷移會(huì)占用很多資源。而且如果你的想法是說(shuō),所有的分布式的存儲(chǔ)只是以 Volume 的形式掛載在宿主同上,這也就沒(méi)什么問(wèn)題了。因?yàn)榇鎯?chǔ)和 Docker 是完全分開(kāi)來(lái)的。如果只有一個(gè) Volume,存儲(chǔ)的可靠性會(huì)得不到保障,所以在 Kubernetes 新版本當(dāng)中,它會(huì)建立一個(gè)Volume的kind,也相當(dāng)于建立 RC kind一樣,是一個(gè) Pod,那這樣由 Kubernetes 來(lái)保障這個(gè) Volume 的高可用。