無縫融入 Kubernetes 生態 | 雲原生閘道器支援 Ingress 資源
Kubernetes Ingress 介紹
通常情況下,Kubernetes 叢集內的網路環境與外部是隔離的,也就是說 Kubernetes 叢集外部的客戶端無法直接訪問到叢集內部的服務,這屬於不同網路域如何連線的問題。解決跨網路域訪問的常規做法是為目標叢集引入一個入口點,所有外部請求目標叢集的流量必須訪問這個入口點,然後由入口點將外部請求轉發至目標節點。
同樣,Kubernetes 社群也是通過增設入口點的方案來解決叢集內部服務如何對外暴露的問題。Kubernetes 一貫的作風是通過定義標準來解決同一類問題,在解決叢集對外流量管理的問題也不例外。Kubernetes 對叢集入口點進行了進一步的統一抽象,提出了 3 種解決方案:NodePort、LoadBalancer 和 Ingress。下圖是這三種方案的對比:
通過以上對比,我們可以發現,NodePort 和 LoadBalancer 主要工作在四層流量上,只能用於暴露叢集中一個服務。當叢集中對外暴露的服務數量增多時,NodePort 方案最終會因埠耗盡而無法暴露更多的服務,而 LoadBalancer 方案則會引入同等數量的 SLB,在增加成本的同時也給運維帶來一定的負擔。定位在七層流量上的 Ingress 方案可以通過定義基於虛擬主機域和路徑的路由規則來完成對叢集中服務的代理,Ingress 與後端服務是一對多的關係,有效的降低了機器成本。
此外,因為外部訪問叢集中服務的所有入口流量都先經過共享的 Ingress Provider 節點,所以叢集管理者可以在 Ingress Provider 中額外實施訪問控制策略來保證叢集中服務的安全性和穩定性,並且可以通過採集監控指標、記錄訪問日誌以及開啟鏈路追蹤來增強可觀測建設。因此,目前 Ingress 方案是主流的選擇。
Kubernetes Ingress Provider 介紹
上文提到,Ingress 是 Kubernetes 應對叢集管理外部訪問流量的場景抽象出來一個資源物件,用來描述叢集外部如何訪問叢集內部服務的方式。通過 Ingress 資源來配置不同的轉發規則,從而達到根據不同的規則設定外部訪問叢集內不同的 Service 所對應的後端 Pod。Ingress Provider 是真實存在的 Workload 節點,是真正意義上 Ingress 規則的實現者與執行者。Kubernetes 提出 Ingress 的規範,將 Ingress 具體實現方式交給各種 Provider 以及雲提供商,有效保證了 Ingress 不會被具體的 Provider 或者雲廠商繫結,符合 Kubernetes 一直秉承的開放、標準的思想。
在雲原生技術浪潮下,Ingress Provider 產品種類如雨後春筍般湧現,其中使用者知名度最高當屬 Kubernetes Nginx Ingress。接下來會簡單介紹一下 Nginx Ingress Controller 和阿里雲推出的下一代閘道器——MSE Ingress Controller(MSE 雲原生閘道器)。
Nginx Ingress Controller
Nginx Ingress Controller 是由 Kubernetes 官方維護的,內部由 Controller 和資料面 Nginx 組成。Nginx Ingress Controller 由使用者部署在 Kubernetes 叢集中,通過訪問叢集的 API Server 來實時監聽使用者應用到叢集中的 Ingress 資源,經 Controller 解析並轉化為 Nginx 配置檔案(nginx.conf),然後通過 reload 資料面 Nginx 的方式使得配置生效。
當外部請求訪問叢集入口點 Nginx Ingress Controller 時,匹配 Nginx Ingress 轉發規則的流量轉發到後端 Service 所對應的 Pod,由 Pod 處理外部請求,其流程圖如下:
MSE Ingress Controller(MSE 雲原生閘道器)
隨著雲原生技術持續演進,雲原生應用微服務化不斷深入,Nginx Ingress 在面對複雜路由規則配置、支援多種應用層協議(Dubbo 和 QUIC 等)、服務訪問的安全性以及流量的可觀測性等問題上略顯疲憊。
為了解決使用者對大規模流量治理的強烈訴求,MSE 雲原生閘道器應運而生,這是阿里雲推出的相容標準 Ingress 規範的下一代閘道器,具備低成本、安全、高整合和高可用的產品優勢。將傳統的流量閘道器和微服務網關合並,在降低 50%資源成本的同時為使用者提供了精細化的流量治理能力,支援 ACK 容器服務、Nacos、Eureka、固定地址、FaaS 等多種服務發現方式,支援多種認證登入方式快速構建安全防線,提供全方面、多視角的監控體系,如指標監控、日誌分析以及鏈路追蹤,並且支援解析單、多 Kubernetes 叢集模式下的標準 Ingress 資源,滿足雲原生應用場景下以宣告式進行統一流量治理的訴求。
MSE Ingress Controller 通過 List-Watch 機制獲取關聯的 ACK 叢集中 Ingress 資源的變化,然後以熱更新的方式動態更新 MSE 雲原生閘道器的路由規則。當 MSE 雲原生閘道器收到請求時,匹配 Ingress 轉發規則轉發請求到後端 Service 所對應的 Pod。
相比 Nginx Ingress Controller,首先 MSE Ingress Controller 是以熱更新的方式秒級生效監聽到的 Ingress 資源,這種無需重啟資料面即可生效配置的方式大大提高了叢集入口閘道器的穩定性,有效保障了業務流量無損。更重要的是,MSE Ingress Controller 可以進行多叢集管理,即同時作為多個叢集的入口閘道器,意味著可以同時監聽多個叢集中的 Ingress 資源,解決使用者跨 Kubernetes 叢集流量排程和流量治理問題。
下圖是 MSE Ingress Controller 在多 ACK 叢集模式下 Ingress 的應用場景。
通過 MSE 雲原生閘道器解析 Ingress
我們將基於 MSE 雲原生閘道器和阿里雲 ACK 產品進行實踐,由雲原生閘道器解析並執行 ACK 叢集中定義的 Ingress 資源,完成對外暴露 ACK 叢集中指定服務。
前提條件
• 已擁有一個 MSE 雲原生閘道器
• 已擁有一個 ACK 運維叢集
步驟一:關聯 ACK 叢集並配置監聽 Ingress
- 在 MSE 雲原生閘道器控制檯->服務管理->來源管理中,關聯對應的 ACK 叢集,開啟監聽 Kubernetes Ingress 配置,並配置 IngressClass 和監聽的目標名稱空間。
步驟二:部署服務
建立並拷貝以下內容到 httpbin.yaml 檔案中,用於部署名稱為 httpbin Deployment,以及名稱為 httpbin 的 Service,然後應用到 ACK 叢集中。
apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
app: httpbin
service: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
template:
metadata:
labels:
app: httpbin
spec:
containers:
- image: mse-gw-demo-registry.cn-hangzhou.cr.aliyuncs.com/gw/httpbin
imagePullPolicy: IfNotPresent
name: httpbin
ports:
- containerPort: 80
步驟三:配置 Ingress
建立並拷貝以下內容到 ingress.yaml 中,然後應用到 ACK 叢集中。
ACK 1.19 版本之前
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-demo
spec:
rules:
- host: test.com
http:
paths:
- path: /ip
backend:
serviceName: httpbin
servicePort: 800
ACK 1.19 及之後版本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-demo
spec:
rules:
- host: test.com
http:
paths:
- path: /ip
backend:
service:
name: httpbin
port:
number: 8000
pathType: Exact
步驟四:訪問服務
在 MSE 雲原生閘道器控制檯的基本資訊檢視閘道器 IP 地址。
通過以下命令列測試訪問服務。
curl -H "host: test.com" 47.97.127.61/ip
預期結果:
{
"origin": "x.x.x.x"
}
步驟五:檢視域名、路由相關配置
我們可以在 MSE 雲原生閘道器控制檯檢視已監聽的域名和路由相關的配置,例如,上述 ingress.yaml 在雲原生閘道器控制檯的解析結果。
域名管理如下:
路由管理如下:
釋出雲原生技術最新資訊、彙集雲原生技術最全內容,定期舉辦雲原生活動、直播,阿里產品及使用者最佳實踐釋出。與你並肩探索雲原生技術點滴,分享你需要的雲原生內容。
關注【阿里巴巴雲原生】公眾號,獲取更多雲原生實時資訊!