談到云原生, 繞不開"容器化"
本文轉(zhuǎn)載自微信公眾號(hào)「全棧碼農(nóng)畫像」,作者小碼甲 。轉(zhuǎn)載本文請聯(lián)系全棧碼農(nóng)畫像公眾號(hào)。
Containers
現(xiàn)在談到云原生, 繞不開“容器”。
在《Cloud Native Patterns》一書中,作者Cornelia Davis指出:“容器是云原生應(yīng)用的基石”;
云原生基金會(huì)將微服務(wù)容器化作為云原生旅行的第一步。
很容易就想到將微服務(wù)容器化, 過程也很簡單。
將代碼、依賴項(xiàng)和運(yùn)行時(shí)打包到一個(gè)稱為容器鏡像的二進(jìn)制文件中。鏡像存儲(chǔ)在鏡像倉庫,Docker官方維護(hù)了Docker Hub鏡像倉庫。
需要時(shí),可以將鏡像轉(zhuǎn)換為可運(yùn)行的容器實(shí)例,該實(shí)例可在裝有容器運(yùn)行時(shí)引擎的任何計(jì)算機(jī)上運(yùn)行,你可以按需部署任意數(shù)量的容器實(shí)例。
下圖顯示了三個(gè)微服務(wù)在單主機(jī)以容器化運(yùn)行。
每個(gè)容器維護(hù)自己的依賴關(guān)系和運(yùn)行時(shí),這可能會(huì)有所不同,上圖我們看到在同一主機(jī)上運(yùn)行的Product微服務(wù)的不同版本。每個(gè)容器共享基礎(chǔ)主機(jī)操作系統(tǒng),內(nèi)存和處理器的一部分,但彼此隔離。
容器模型遵守“十二要素應(yīng)用”的Dependencies原則。
要素2指定“每個(gè)微服務(wù)隔離并打包其自己的依賴項(xiàng)、更改項(xiàng)(不影響整個(gè)系統(tǒng))”
容器同時(shí)支持Linux和Windows工作負(fù)載。
雖然存在多個(gè)容器供應(yīng)商,但Docker已經(jīng)成為打包、部署和運(yùn)行云原生應(yīng)用程序的事實(shí)標(biāo)準(zhǔn),Docker占據(jù)了最大的市場份額,該公司一直在推動(dòng)軟件容器的發(fā)展。
Why containers
- 容器提供了移植性,并保證在跨環(huán)境時(shí),能輸出一致。通過將所有內(nèi)容封裝進(jìn)單個(gè)程序包,可以將微服務(wù)+依賴項(xiàng)與基礎(chǔ)設(shè)施隔離。
- 你可以在安裝Docker運(yùn)行時(shí)引擎的 任何環(huán)境部署同一容器,容器化消除了預(yù)先配置環(huán)境的時(shí)間開銷 (for框架、程序庫文件、和運(yùn)行時(shí))。
- 通過共享底層操作系統(tǒng)和主機(jī)資源,容器的占用空間比完整的虛擬機(jī)小很多,小體積,高密度,在一臺(tái)主機(jī)上可以運(yùn)行多個(gè)微服務(wù)。
容器編排
Docker Api/工具創(chuàng)建鏡像和容器,你還需要工具管理容器。
管理容器的軟件稱為"容器編排器",大規(guī)模使用容器時(shí),容器編排器至關(guān)重要。
容器編排器做了什么 ?
任務(wù) | 描述 |
---|---|
Scheduling | 自動(dòng)配置、調(diào)度容器實(shí)例 |
Affinity/anti-affinity | 在附近或相距較遠(yuǎn)的位置調(diào)配容器,以提高可用性和性能 |
Health monitoring | 自動(dòng)探測并修復(fù)故障 |
Failover | 自動(dòng)將失敗的實(shí)例轉(zhuǎn)移到狀況良好的機(jī)器 |
Scaling | 自動(dòng)增減容器 去匹配預(yù)期狀態(tài) |
Networking | 給容器提供覆蓋網(wǎng)絡(luò) |
Service Discovery | 容器之間互相發(fā)現(xiàn) |
Rolling Upgrades | 零停機(jī)增量升級(jí),零停機(jī)自動(dòng)回滾 |
容器編排器遵循“十二要素應(yīng)用程序”中的disposability和concurrency原則。
要素9:強(qiáng)調(diào)“服務(wù)實(shí)例應(yīng)該是一次性的,這樣有利于快速啟動(dòng)(提供可伸縮能力),優(yōu)雅關(guān)閉讓系統(tǒng)保持正確狀態(tài)”,
要素8:強(qiáng)調(diào)“服務(wù)在大量小的相同進(jìn)程(副本)上擴(kuò)展,而不是在可用的功能最強(qiáng)大的計(jì)算機(jī)上擴(kuò)展單個(gè)大型實(shí)例”。
目前市面上存在多個(gè)容器編排器,但Kubernetes已成為云原生世界的事實(shí)標(biāo)準(zhǔn),這是一個(gè)可移植、可擴(kuò)展的、開源的、管理容器的平臺(tái)。
你可以自建k8s集群,自行調(diào)配和管理k8s資源,這可能很復(fù)雜。
Azure云將K8s作為托管服務(wù)(AKS),你只需要利用K8s功能,而不需要維護(hù)K8s集群。
Azure Kubernets Services在第2章“Scaling Cloud-Native Applications”中詳細(xì)介紹。
Ref
https://docs.microsoft.com/en-us/dotnet/architecture/cloud-native/definition