上一篇我們簡單的做了一個部署,但將Kubernetes服務暴露到外部網路有兩個方式,本篇將說明以下幾種訪問服務的情境
- 內部網路
- 外部網路:使用Load Balancer
- 外部網路:使用Ingress
1. 內部網路
Pod為K8s的最小單位,其中會有一個或多個Container,但不同服務的Pod該如何互相訪問,Container的名稱與IP都是不固定的,這時候就需要Service,可以把Service想像成是一個Load balance,底層使用iptable或ipvs來分配流量,並將流量分配到Pod的container上。
如下圖所示,有兩個服務A與B,如果A的其中一個Pod想訪問B服務,就要連線到Service B,由Service B分配流量到Pod B,此時我們用到的Service type為ClusterIP。

上一篇講到GKE部署的功能,其中的服務類型中的叢集IP就是指ClusterIP,選擇叢集IP就會將服務公開於叢集中的內部IP。

2. 外部網路:使用Load Balancer
使用ClusterIP就只能限Kubernetes內部訪問,若是要暴露到外網,其中一個方法就是用Load Balancer,當我們將Service type設為[LoadBalancer](https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer),K8s就會去自動跟雲端Load Balancer請求一個Public IP,上一篇文部署就是使用Load Balancer,可以在kubectl看到相關資訊。

架構會如下圖,使用者會先訪問Cloud Load Balancer,他會將流量導入Kubernetes Cluster。

3. 外部網路:使用Ingress
Ingress與Load Balancer差別在於,Load Balancer是將Layer4的網路流量都往K8s丟;而Ingress可以解析Layer 7的https,可以在ingress設定SSL憑證與route。
開始來建立一個Ingress,同1.內部網路的步驟,先建立一個叢集IP的工作負載,到Service與Ingress勾選筆服務,選擇「建立Ingress」。

近來之後長這樣,選擇下一步

第二步可以設定不同了path到不同的Service,我們先用測試網域nginx.twcanhelp.me連線到nginx Service。

第三步可以上傳SSL憑證,這邊也可以選擇由Google幫忙簽憑證,類似Let’s Encrypt的服務,不過簽憑證需要點時間才會生效。

建立完成後,就看到一筆Ingress設定,點進去找到IP位址,接著就到DNS上把nginx.twcanhelp.me的A Record設到該IP就完成了。要注意的是,如果要用Google簽的憑證,CDN(如cloudflare)的DNS就不能開proxy;要開CDN proxy,則應設定CDN提供的SSL憑證到ingress。

一樣也可以透過kubectl指令找到Ingress設定。

Ingress的架構如下圖,在Kubernetes內通常會有Ingress Controller來做負載平衡與反向代理,通常可以選擇用NGINX或HAProxy來做,而GKE則是Google實作的Ingress。

結語
Load Balancer與Ingress兩種方法,我會更建議使用Ingress,原因如下:使用Load Balancer無法判斷網域為何,可能導致網站被其他網域挾持,透過Ingress檢查L7的virtual host可以避免這問題;此外SSL憑證在ingress統一管理也比較方便。我們學會了如何在GCP後台部署應用,下一篇將學習如何透過kubectl來部署應用。