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