什么是 Ingress?
在 Kubernetes 中,隨著微服務架構的廣泛應用,集群中的服務需要暴露到外部,以便供用戶或其他服務訪問。如何高效、安全地管理這些流量,成為了一個重要的議題。Ingress 作為 Kubernetes 提供的一種資源,能夠為你提供靈活且高效的外部流量路由功能。本文將介紹如何在 Kubernetes 中使用 Apache APISIX 作為 Ingress 控制器,來智能地管理和路由外部流量。
Ingress 是 Kubernetes 中的一種資源,主要用于控制和管理外部 HTTP 和 HTTPS 流量如何進入集群。Ingress 可以基于請求的 域名、路徑 等規則,將流量路由到集群內部的不同服務。與傳統的 NodePort 或 LoadBalancer 服務暴露方式相比,Ingress 更加靈活高效,適合在微服務架構中使用。
Ingress 的基本功能
- 外部流量路由:根據域名、路徑等規則將流量路由到目標服務。
- 負載均衡:Ingress 控制器能夠自動為服務提供流量分發,確保流量均勻分配到各個 Pod 上。
- SSL/TLS 終止:Ingress 可以配置 SSL/TLS 證書,確保安全的 HTTPS 流量。
- 請求重定向與重寫:Ingress 允許根據路徑規則對請求進行重定向和重寫。
Apache APISIX 作為 Ingress 控制器
Apache APISIX 是一個高性能、可擴展的 API 網關。它原生支持 Kubernetes Ingress,可以作為 Kubernetes 集群中的 Ingress 控制器,處理和管理外部流量。APISIX 不僅提供流量路由功能,還集成了負載均衡、流量控制、日志收集等功能,非常適合微服務架構中的流量管理。
為什么選擇 APISIX 作為 Ingress 控制器?
- 高性能:APISIX 基于 NGINX 和 OpenResty 構建,性能非常高,能夠處理大量的并發請求。
- 靈活的路由規則:支持路徑、域名、請求頭、方法等靈活的路由規則。
- 豐富的插件生態:APISIX 提供了豐富的插件支持,比如認證、流量控制、API 限速、監控等,可以滿足大多數場景的需求。
- 動態配置:APISIX 支持動態配置,可以通過 Kubernetes API 和 ConfigMap 輕松調整路由規則和服務配置。
Ingress 的工作原理
Ingress 是通過 Ingress 控制器 實現外部流量路由的。Ingress 控制器監聽 Kubernetes 中的 Ingress 資源,并根據配置的路由規則將流量轉發到對應的服務。
Apache APISIX 作為 Ingress 控制器,會根據集群中定義的 Ingress 資源和路由規則,將外部流量路由到相應的服務。APISIX 控制器會自動管理負載均衡、請求轉發、SSL/TLS 終止等任務。
基本工作流程:
- 外部請求通過負載均衡器進入集群,發送到 Ingress 控制器(如 Apache APISIX)。
- Ingress 控制器解析 Ingress 資源中的路由規則,確定將流量轉發到哪個 Service。
- 流量被轉發到對應的 Service,Service 會根據選擇器將流量轉發到匹配的 Pod。
- 最終,Pod 處理請求并返回響應。
如何配置 Apache APISIX 作為 Ingress 控制器?
1. 部署 Apache APISIX Ingress 控制器
在 Kubernetes 中使用 Apache APISIX 作為 Ingress 控制器,首先需要部署 APISIX 控制器。以下是部署步驟:
# 添加 APISIX 官方 Helm 倉庫
helm repo add apisix https://charts.apisix.apache.org
helm repo update# 安裝 APISIX Ingress 控制器
helm install apisix apisix/apisix-ingress-controller \--set apisix.gateway.enabled=true \--set ingressController.installCRDs=true
這個命令將會部署 APISIX 控制器以及相關的 CRDs(自定義資源定義),并為集群中的服務提供路由能力。
2. 創建 Ingress 資源
APISIX 控制器將根據你定義的 Ingress 資源規則將外部流量路由到 Kubernetes 集群中的服務。以下是一個基本的 Ingress 資源示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:ingress.kubernetes.io/rewrite-target: /apisix.ingress.kubernetes.io/ssl-redirect: "true"
spec:rules:- host: example.comhttp:paths:- path: /frontendpathType: Prefixbackend:service:name: frontend-serviceport:number: 80- path: /backendpathType: Prefixbackend:service:name: backend-serviceport:number: 80
在上面的例子中,外部請求 http://example.com/frontend
會被路由到 frontend-service
,而請求 http://example.com/backend
會被路由到 backend-service
。APISIX 會根據這些規則管理流量路由,并根據需要執行負載均衡。
3. 配置域名和負載均衡器
為了通過域名 example.com
訪問服務,你需要將該域名指向 APISIX 控制器 的外部負載均衡器的 IP 地址。如果你使用云平臺(如 AWS、GCP),負載均衡器會提供一個外部 IP 地址。
將 DNS 配置指向這個 IP 地址:
example.com
→ APISIX 控制器的外部 IP 地址
這樣,當用戶訪問 http://example.com
時,流量會通過 APISIX 控制器路由到相應的服務。
4. 配置 SSL/TLS
如果你希望通過 HTTPS 提供安全的訪問,可以為 APISIX 配置 SSL/TLS 證書。首先,你需要將證書存儲為 Kubernetes Secret,然后在 Ingress 資源中引用它:
- 創建 TLS 證書 Secret:
kubectl create secret tls apisix-tls --cert=cert.crt --key=cert.key
- 更新 Ingress 資源,啟用 SSL/TLS:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: secure-ingress
spec:tls:- hosts:- example.comsecretName: apisix-tlsrules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 443
這將確保所有通過 https://example.com
訪問的流量都通過 TLS 加密,提供安全的通信。
5. 使用 APISIX 插件增強功能
APISIX 提供了多種插件,允許你增強流量控制的能力。例如,你可以啟用流量限速、身份驗證、日志記錄等功能。通過配置 Ingress 注解,你可以輕松啟用這些插件。
例如,啟用流量限速插件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:apisix.ingress.kubernetes.io/plugins: rate-limiting
spec:rules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 80
這樣,APISIX 會為 example.com
配置流量限速插件,限制每秒鐘的請求數。
總結
Apache APISIX 作為一個高性能的 API 網關和 Ingress 控制器,能夠為 Kubernetes 提供靈活、強大的外部流量路由和管理能力。通過配置 APISIX Ingress 控制器,你可以輕松地將外部 HTTP/HTTPS 流量路由到集群中的不同服務,并且還能夠集成負載均衡、SSL/TLS 終止、流量控制等功能。
與傳統的 NodePort 和 LoadBalancer 服務暴露方式相比,APISIX 提供了更高的靈活性、可擴展性和可管理性,特別適合用于微服務架構中多服務的流量路由。通過 APISIX,你可以更好地控制外部流量的訪問方式,提高集群的性能、安全性和可靠性。