運行和管理跨機器集群的大規模的容器微服務應用是一個極具挑戰的任務。Kubernetes 提供了一個強大的容器編排解決方案,從而幫助我們迎接這個挑戰。它包含了一些重要特性,比如容錯,自動伸縮,滾動升級,存儲,服務發現,以及負載均衡。
本文講解了如何使用開源 NGINX 軟件或者 NGINX Plus,以及 Ingress 這個 Kubernetes 自帶的負載均衡框架,對 HTTP 流量進行負載均衡。Ingress 能讓我們配置規則,從而控制外部流向 Kubernetes 集群內的服務的流量。你可以選擇任何能提供 Ingress controller 的負載均衡器,Ingress controller 指的是部署在集群內的軟件,它使得 Kubernetes 和負載均衡器融為一體。這里我們將展示如何利用 Ingress 以及我們之前介紹過的 NGINX Plus Ingress controller 和 NGINX Ingress controller,對一個微服務應用進行負載均衡。
本文只介紹使用 Ingress 對 Kubernetes 進行 HTTP 的負載均衡,要學習更多有關其它負載均衡的選項,請看另一片博文:《使用 NGINX Plus 對 Kubernetes 服務進行負載均衡》(http://dockone.io/article/957)。
注意:文中討論的程序的完整指令,可在我們的 GitHub 倉庫上找到。本文不會遍歷所有必要步驟,而是只提供那些步驟的鏈接。
NGINX 和 NGINX Plus 的 Ingress Controllers

在我們部署示例應用並為它配置負載均衡前,我們必須選擇一個負載均衡器並部署相應的 Ingress controller。
一個 Ingress controller 是能將一個特定的負載均衡器和 Kubernetes 整合在一起的軟件。我們已經為開源的 NGINX 和 NGINX Plus 開發了相應的 Ingress controller,它們可在我們的 GitHub 倉庫(https://github.com/nginxinc/kubernetes-ingress)取到。其它實現也有,你可以去 Kubernetes GitHub 倉庫上的 Ingress Controllers頁面了解。
關於集群內部署 NGINX Plus Ingress controller 的完整命令,可以去我們的 GitHub 倉庫查看。
微服務示例應用

我們的示例應用是一個典型的微服務 web 應用,它由多個獨立部署的服務組成。這個名叫 cafe 的應用,可通過 tea 服務訂購茶葉,或者通過 coffee 服務訂購咖啡。你可以通過 HTTP 請求的 URI 來表明你的飲料偏好:以 /tea 結尾的 URI 將提供茶葉,以 /coffee 結尾的 URI 將提供咖啡。這個應用必須通過 SSL/TLS 進行安全連接。
下圖從概念上描述了整個應用,圖中 NGINX Plus 這個負載均衡器扮演了一個重要角色,它路由客戶端請求到合適的服務,並保證了安全的客戶端連接。

集群內如何部署這個應用,請參考我們的 GitHub 倉庫上的命令。
通過 Ingress 配置 Kubernetes 的負載均衡

我們的 cafe 應用要求負載均衡器提供兩個功能:
-
基於請求的 URI 來路由(也叫基於路徑的路由)
-
SSL/TLS 終端
用 Ingress 來配置負載均衡,你得在 Ingress 資源里配置規則。這些規則指定如何路由外部流量到集群內的服務。
在資源內你可以定義多個虛擬服務器,每個服務器對應不同的域名。一個虛擬服務器通常對應集群內的一個單一微服務應用。對每個服務器,你可以:
-
指定多個基於路徑的規則。流量基於請求URI 發送到應用內的不同服務。
-
通過引用一個SSL/TLS證書和密鑰來建立SSL/TLS終端。
你可以在 Ingress 文檔頁面(https://kubernetes.io/docs/user-guide/ingress/)上查看更多詳細解釋的例子。
下面是 cafe 應用的 Ingress 資源文件(cafe-ingress.yaml):
1. apiVersion: extensions/v1beta1 2. kind: Ingress 3. metadata: 4. name: cafe-ingress 5. spec: 6. tls: 7. - hosts: 8. - cafe.example.com 9. secretName: cafe-secret 10. rules: 11. - host: cafe.example.com 12. http: 13. paths: 14. - path: /tea 15. backend: 16. serviceName: tea-svc 17. servicePort: 80 18. - path: /coffee 19. backend: 20. serviceName: coffee-svc 21. servicePort: 80
一行一行過,我們看到:
第 4 行我們命名該資源為 cafe-ingress。
第6-9行我們建立SSL/TLS終端:
-
第 9 行我們通過名字 cafe-secret 來引用一個 Secret 資源。這個資源包含SSL/TLS證書和密鑰,並且必須在Ingress 資源前部署。
-
第8 行我們把這個證書和密鑰用到我們的 cafe.example.com 這個虛擬服務器上。
第 11 行我們定義了一個虛擬服務器,域名為 cafe.example.com。
第 13-21 行我們定義了兩個基於路徑的規則:
-
第 14-17 行定義的規則要求負載均衡器分發帶 /tea URI 的請求到 tea 服務的容器內,這個服務以 tea-svc 名字部署在集群內。
-
第 18-21 行定義的規則要求負載均衡器分發帶 /coffee URI 的請求到 coffee 服務的容器內,這個服務以 coffee-svc 名字部署在集群內。
-
兩條規則都要求負載均衡器分發請求到對應服務的80端口上。
集群內部署 Ingress 和 Secret 資源的完整命令,請參考GitHub倉庫。
測試這個應用

一旦部署完NGINX Plus Ingress controller,我們自己的應用,Ingress 資源,以及 Secret 資源,我們可以測試這個應用。
當我們以 /tea URI 發送一個 tea 請求,我們可以在瀏覽器上看到由 tea 服務生成的頁面。

我們希望你沒有太失望,因為 tea 和 coffee 服務沒有真的給你對應的飲料,而僅僅是顯示了容器運行的信息,以及你的請求的細節。它們包含了容器的主機名和IP地址,請求的URI,以及客戶端的 IP 地址。每一次我們刷新頁面,我們會從不同的容器里得到響應。
我們也可以連接到 NGINX Plus 的實時活動監控頁面,看到 NGINX Plus 和我們應用的每個容器的實時監控維度。

Ingress Controller 的擴展

Ingress 提供了基本的 HTTP 負載均衡功能。但是通常你的應用的負載需求更復雜,Ingress 無法支持。為了滿足這些需求,我們為 ingress controller 添加了一系列擴展。通過這種方式你可以仍然充分利用Kubernetes的資源來配置負載均衡(反對直接配置負載均衡器),同時利用這些能力來使用高級負載均衡特性。
當前,我們為我們的Ingress controller 提供了以下擴展:
-
WebSocket,它允許我們負載均衡 WebSocket 應用。
-
會話保持(只有 NGINX Plus 支持),它確保來自給定客戶端的請求將總是被發送到相同的后端容器。
關於可用擴展的完整列表,請查看我們的 GitHub倉庫。
除此以外,我們提供了一個機制來定制 NGINX 配置,它依賴 Kubernetes 資源,要通過 Config Maps 資源或者注解(Annotations)實現。例如,你可以定制指令 proxy_connect_timeout 或者 proxy_read_timeout 的值。
當你的負載均衡需求超出了Ingress 和我們的擴展的支持范圍,我們推薦一種不同的方式來部署和配置NGINX Plus ,它不使用 Ingress controller。請參考博文《使用 NGINX Plus進行 Kubernetes 服務的負載均衡》(http://dockone.io/article/957)找到更多細節。
NGINX Plus Controller 的優點

NGINX Plus controller 除了擁有 NGINX controller 的優點外,還提供以下好處:
-
高動態環境中的穩定性 - 每當通過 Ingress 暴露的服務,它的一系列 pod 有一些變化時,Ingress controller 需要更新 NGINX 或者 NGINX Plus 的配置來反應這些變化。使用開源 NGINX,你必須手工修改這些配置文件並重新加載這些配置。使用 NGINX Plus,你可以使用立即重新配置(on-the-fly reconfiguration)API 來更新這些配置,而不用重新加載這些配置文件。這可以防止潛在的內存使用率的提升,以及當非常頻繁得重載配置的時候,整個系統超載的發生。
-
實時的統計數據 - NGINX Plus 提供了高級的實時統計數據,你可以通過 API 或者內嵌的頁面訪問。它可以使你深入了解 NGINX Plus 和你的應用是如何工作的。
-
會話保持 - 當你開啟會話保持功能,NGINX Plus 將使用粘性cookie(sticky cookie)方法確保所有來自同一客戶端的請求總是被發送到同一個后端容器。
-
技術支持 - NGINX 公司的專業服務團隊可以提供關於 NGINX 和 NGINX Plus 的 Ingress controller 的幫助。
總結

Kubernetes 提供了內建的 HTTP 負載均衡,使用 Ingress 將外部流量負載到集群內的服務。NGINX 和 NGINX Plus 整合了 Kubernetes 的負載均衡,完全支持了 Ingress 特性,並提供了擴展來支持額外的負載均衡需求。
本文為翻譯文章,且鏈接較多,為了不影響閱讀文章中沒有做過多說明,點擊閱讀原文鏈接即可查看原文。
