Cloud Native Application Software as a Service Microservice Kubernetes Docker 雲原生應用 軟體即服務 微服務 SaaS K8S 容器 網路

為SaaS微服務補強網路 NSX確保雲應用連通安全

2018-04-25
本文將說明Container生產環境內的網路與安全架構及需求,先說明SaaS Web生產架構內有那些重要的構件,分別加以介紹,然後剖析Docker網路架構的運作方式,最後說明Kubernetes(K8S)內的PoD、網路以及服務。

Docker網路架構剖析

寫到這邊好像都和網路與安全的管理無關,這些與NSX到底有什麼關係呢?

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

而這邊就是NSX-T能夠提供解答的地方了。但在詳述NSX-T於Container環境的功能前,必須要先逐步解釋基礎Docker的網路與安全運作如何進行?K8S的基礎網路與安全架構又是怎麼運作?而在生產環境上可能有大型客戶注重的點,是現有機制不容易做到的。首先,用圖2來說明Docker的網路架構。

如果在一個Linux Docker Host上面跑容器的時候沒有做任何的特別網路設定,此時這個Linux上會產出一個橋接器docker 0。可以想像在這個Linux Host上有一個虛擬的小交換器,每一個容器都會連接到這個docker 0橋接器上,進行容器間以及容器與Docker Host間的網路傳輸。在預設狀況下,每一個容器都會拿到一個172.17.0.0/16內的IP地址。每個容器本身的虛擬網卡在Linux內會以veth這個介面開頭為代表。

Linux Kernel本身與這個橋接器的接點則是Interface docker 0介面,預設狀況下,這個介面的IP地址會設定為172.17.42.1 /16(在Docker 1.9後的設定就不是這樣了,但為了討論方便還是用這個IP來說明)。

圖2中的int eth0是這個Linux Host對外的IP地址(此IP地址當然是隨實際環境而不同的,介面也不見得叫eth0,在某些Linux Distribution中可能是像ens160之類的)。而在內部的橋接器與外部的實體網路間,是由Linux Kernel來進行路由與NAT的配置。


▲圖2 Docker網路架構示意圖。

當內部的Docker Container已經部署,要連出去與外部的世界相互溝通時(Outbound Traffic),這些連線會透過SNAT(Source Network Address Translation)機制,將來源IP由原本的172.17網段轉換成int eth0上的實體IP再連出。因此,Docker Host內的Container IP在外部實體網路內是看不到的。

同樣地,如果這些容器提供各項微服務如網頁、認證、UI、轉碼功能給外部的用戶使用(Inbound Traffic)的時候,外部的用戶因為看不到內部172.17的IP,此時同樣需要利用DNAT(Destination Network Address Translation)的機制。

舉例來說,當執行「docker run -p 8080:80」時,就能把一個內部跑網頁80 Port服務的容器,在外部能夠以eth0 IP上的8080 Port來進行連接。而如果內部有多個Docker容器都提供80 Port的服務,在這個Docker Host上就必須以不同的服務埠來分別,比如說8080是對應第一個容器,8081是對應第二個容器,以此類推。

每一個容器前都有iptable防火牆進行保護。而整個docker 0上的網路封包要進出Docker Host時,也有iptable防火牆來防護。

所以,其實在Docker Host上,先不管好不好維運,對應到東西向的封包(container ? container)或是南北向的封包(container ? physical)都是有辦法進行防護的。

如果大家一下子看不懂上面寫什麼,但是對VMware很了解的話,想像一下!把Docker Host比擬成自己筆電上的VMware Workstation,Container比擬成Workstation內的虛機。docker0橋接器就像是Workstation內的VMnet8虛擬交換器。當管理者選擇虛機要採用NAT模式時,Workstation會建立一個192.168.x.0/24的內部網路(對比172.17.0.0/16)讓虛機接上。虛機會以SNAT的方式透過Workstation連到外面環境,而反過來,如果虛機要提供服務,管理者會設定Port Forwarding(DNAT)來透過特定Port讓外部機器可連到內部虛機。

接著,考慮一個問題:在一台Workstation上大家玩得很開心,但如果有兩台VMware Workstation,虛機都採用NAT模式,要怎麼讓兩台不同Workstation上的兩台虛機互連?同理,在Docker的預設網路設定內,在單一Docker Host內沒有太多問題,但當環境一大,有兩個以上的Docker Host時,該如何呢?

此時,想像自己的某個Web微服務有十個容器,五個在Host 1,另外五個在Host 2。外面的用戶或是Load Balancer要怎麼連到這十個容器?Host 1的8080~8084 Port再加上Host 2的8080~8084 Port嗎?有沒有覺得很難維護?如果這個服務有一百個容器呢?

想像自己的SaaS應用內,負責UI的微服務容器在Host 1上,AP-Logic的微服務容器在Host 2上,請問UI Container要如何連到AP-Logic Container?

回答這個問題前請想清楚,這是兩組都躲在NAT後面,而且本地IP網段一模一樣(172.17.0.0/16),位址也有機會一模一樣的容器喔!

你的資安Team因為合規與稽核需求,要求UI的容器與AP-logic的容器間要有防火牆防護。那打算怎麼做,成為iptables高手嗎?而且請把上面的情境連帶想像一下,iptables內除了防火牆也會有NAT,那麼防火牆規則內的來源與目的地IP地址會是哪一個?

業務Team要求進行應用的Scale-out/Scale-in,如前篇所講,這本來就是SaaS App該做的事。但在要擴充新的Container或移除現有的Container時,上面的網路連接、NAT、防火牆怎麼辦?

大家可能會想說,可以這樣做或那樣改,像是配置--net=host,或是改成libnetwork等等。但事實上,生產環境內沒有人希望用這種單機版的做法。就像在機房內,不會把虛機放在Workstation或是單台vSphere ESXi上提供服務,而是建立一個vCenter/多台vSphere的環境來集中管理。

同樣地,Docker具備強大的容器功能,但會需要一個能管理、維護、配置大型環境的機制,這就是CaaS(Container as a Service)相關方案,如Kubernetes、Docker Swarm、Fleet、Mesos等等要出場的原因了。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!