作者: Colin Jao 饒康立 – VMware資深技術顧問,主要負責VMware NSX產品線,目前致力於網路虛擬化暨分散式安全防護技術方案的介紹與推廣。

最近與不同的客戶及夥伴在進行交流時,很明顯的趨勢是大家對於微服務 (microservice)、雲原生應用(Cloud Native Application)、Software as a Service這類應用產生興趣,甚至都已經在思考後續要如何在私有雲環境內進行規劃與部署。這個趨勢的推動並不僅僅只是在Infrastructure架構的更動,真正驅動的來源在於上層應用的開發方式逐漸改變。在雲原生架構裡,與傳統的Client / Server、Web-AP-DB三層式架構的開發方式不同,強調的是

  • 應用應該是可攜帶的 (Portable):打包的程式能夠獨立於不同的底層環境與作業系統執行,並且通過簡易的宣告檔 (Declarative) 來進行自動化建置
  • 應用應該是易於部署的 (Continuously Deployable):這個應用在開發後可以很容易地部署在私有雲或各個公有雲環境,並且將開發環境與生產環境間的差異性降到最小。在生產環境內,這個應用應該要非常容易進行擴充、換版
  • 應用應該是易於擴張的 (Scalable):用戶不需要變更架構、使用特別的工具,只要在底層有足夠的資源下,能夠很輕易地把應用或新功能快速地擴充規模給大量的用戶使用

如果大家對相關的概念有興趣,可以參看如http://12factor.net 這些關於SaaS App的介紹,以及網路上對於Microservice概念的討論。我的code寫得很爛,就不繼續班門弄斧啦。

而當應用團隊決定要開發SaaS App時,要達成上列的目的,主流的方式會逐步採用container來乘載應用單元,並非以前傳統的建一台實體機或虛擬機裝作業系統。此時在大型生產環境內,要如何能夠輕易地進行容器應用部署、擴張、更新的機制就越來越重要了。我們用下面這張圖和大家說明常見的SaaS Web生產架構內的構件,與常見的對應eco-system方案:

容器 (Container):

在一個作業系統(虛機或實體機)內,跑多個雖然共用Kernel,但彼此隔離的用戶實例 (User-Space Instance)。每個容器通常運作一個大方案內的特定微服務,具備自己的獨立library,可以由不同的團隊以不同的機制開發,可以各自運作。容器可以很簡單地匯出或存放於雲端,也能夠放到另一個支援容器的異質環境上執行。常見的Container像是大家所熟悉的docker,以及其他如LXC, Rocket (rkt)等。

執行容器的作業系統 (Container Host)

絕大大大部份,是一個精簡的Linux。標準的Linux Distribution當然OK,但生產環境內會希望用一個小型、僅具備乘載Container功能的作業系統,像是VMware的Photon OS、Red Hat的Atomic、Ubuntu的Snappy、CoreOS這些。

而Container Host會是虛機還是實體機?我們可以很明確很有信心地告訴大家,絕大部分生產環境以及公有雲上,Container Host當然還是虛擬機。沒有開發團隊會想要在擴充container底層環境時,還要去處理怎麼接儲存、怎麼上驅動程式、實體線路怎麼接這些問題的。

容器即服務 (CAAS, Container as a Service):

如上,生產環境內,我們肯定會有多台的container host。此時,管理者或開發團隊要如何將一個微服務的多個容器部署在多台container host上?在不同container host上的容器要怎麼互通?同一個微服務內的容器要怎麼擴充與升級?這些都是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, Infrastructure as a Service)

那這些Container Host要怎樣快速產出,而且在產出時自動加入現有的CaaS如K8S的環境內?在同一個資源池內,Container與原本的虛擬機要如何共存?因此,上面的Container架構通常都會建置在一個現有的IaaS生產環境內,或許是私有雲內的vRA / vCenter / vSphere,或許是Openstack,當然也或許是一個公有雲IaaS方案如AWS / GCP內。

嗯,寫到這邊,這個系列網誌是關於網路與安全的不是嗎,那上面我們講這些幹嘛勒?啊這些和NSX到底有什麼鬼關係勒?

在一個支援容器的大型環境內,企業要不要考慮在不同container host上的容器,彼此之間怎麼聯通(網路)?不同的應用與微服務之間,要怎麼樣進行需求的阻隔及安全防護(安全)?如果兩個容器彼此之間連不起來,我們要怎麼樣去進行troubleshooting(網路與安全)?如果上面的這些問題沒有解決,這個應用上得了生產環境嗎?

而這邊就是NSX能夠提供解答的地方了。在接下來的網誌,我們會逐步與大家介紹下列課題,希望最終能讓各位感受到以NSX來支援container方案的威力。包括了

  • Docker內的網路機制簡述
  • Kubernetes預設的網路機制簡述
  • NSX搭配Kubernetes的架構說明與展示,含邏輯網路、微分段、troubleshooting工具等等