本文將說明Container生產環境內的網路與安全架構及需求,先說明SaaS Web生產架構內有那些重要的構件,分別加以介紹,然後剖析Docker網路架構的運作方式,最後說明Kubernetes(K8S)內的PoD、網路以及服務。
最近與不同的客戶及夥伴在進行交流時,很明顯的趨勢是大家對於微服務(Microservice)、雲原生應用(Cloud Native Application)、軟體即服務(Software as a Service,SaaS)這類應用產生興趣,甚至都已經在思考後續要如何在私有雲環境內進行規劃與部署。這個趨勢的推動並不僅僅只是在Infrastructure架構的更動,真正驅動的來源在於上層應用的開發方式逐漸改變。
在雲原生架構裡,與傳統的Client/Server、Web-AP-DB三層式架構的開發方式不同,強調的是:
‧應用應該是可攜帶的(Portable):打包的程式能夠獨立於不同的底層環境與作業系統執行,並且透過簡易的宣告檔(Declarative)進行自動化建置。
‧應用應該是易於部署的(Continuously Deployable):這個應用在開發後可以很容易地部署在私有雲或各個公有雲環境,並且將開發環境與生產環境間的差異性降到最小。在生產環境內,這個應用應該要非常容易進行擴充和換版。
‧應用應該是易於擴張的(Scalable):用戶不需要變更架構、使用特別的工具,只要在底層有足夠的資源下,能夠很輕易地把應用或新功能快速地擴充規模給大量的用戶使用。
如果對於相關的概念有興趣,可以參考如「http://12factor.net」這些關於SaaS App的介紹,以及網路上對於Microservice概念的討論,這裡就不繼續班門弄斧了。
SaaS Web生產架構說明
當應用團隊決定要開發SaaS App時,要達成上述的目的,主流的方式會逐步採用Container來承載應用單元,並非以前傳統地建立一台實體機或虛擬機安裝作業系統。此時在大型生產環境內,要如何能夠輕易地進行容器(Container)應用部署、擴張、更新的機制就越來越重要了。
這裡用圖1來說明常見的SaaS Web生產架構內的構件,與常見的對應eco-system方案。
|
▲圖1 常見的SaaS Web生產架構內的構件及對應eco-system方案。 |
容器(Container)
在一個作業系統(虛機或實體機)內,跑多個雖然共用Kernel但彼此隔離的用戶實例(User-Space Instance)。每個容器通常運作一個大方案內的特定微服務,具備自己的獨立Library,可以由不同的團隊以不同的機制開發,可以各自運作。容器可以很簡單地匯出或存放於雲端,也能夠放到另一個支援容器的異質環境上執行。常見的Container包括了大家所熟悉的Docker,以及其他如LXC、Rocket(rkt)等。
執行容器的作業系統(Container Host)
執行容器的作業系統(Container Host)絕大部分是一個精簡的Linux。標準的Linux Distribution當然沒問題,但生產環境內會希望用一個小型、僅具備承載Container功能的作業系統,像是VMware的Photon OS、Red Hat的Atomic、Ubuntu的Snappy、CoreOS等等作業系統。
而Container Host會是虛機還是實體機?可以很明確地告訴大家,在絕大部分生產環境以及公有雲上,Container Host當然還是虛擬機。沒有開發團隊會想要在擴充Container底層環境時,還要去處理怎麼接儲存、怎麼上驅動程式、實體線路怎麼接等等的這些問題。
容器即服務(CaaS)
生產環境內肯定會有多台的Container Host,此時管理者或開發團隊要如何將一個微服務的多個容器部署在多台Container Host上?在不同Container Host上的容器要怎麼互通?同一個微服務內的容器要怎麼擴充與升級?這些都是容器即服務(Container as a Service,CaaS)方案主要處理的問題。最常見的CaaS方案當然就是Kubernetes(K8S),而其他大家可能聽過的包含了Docker Swarm、Apache Mesos、CoreOS Fleet等等。
一些大型企業常用的PaaS服務也會在底層應用到這些CaaS方案來進行Container的派送及管理。例如Red Hat Openshift在v3之後,底層便全面改用Kubernetes,Pivotal Cloud Foundry也會逐步利用基於Kubernetes的PKS(Pivotal Container Service)來進行容器管理。
架構即服務(IaaS)
那這些Container Host要怎樣快速產出,而且在產出時自動加入現有的CaaS如K8S的環境內?在同一個資源池內,Container與原本的虛擬機要如何共存?因此,上面的Container架構通常都會建置在一個現有的架構即服務(Infrastructure as a Service,IaaS)生產環境內,或許是私有雲內的vRA/vCenter/vSphere,或許是Openstack,當然也或許是一個公有雲IaaS方案如AWS/GCP內。