在這篇文章中,我將展示如何建立一個 APISIX控制器,該控制器在 Kubernetes 叢集中公開啟用 Dapr 的應用程式。 本質上,APISIX控制器將配置相同的標準 Dapr annotations以注入daprd sidecar。 通過公開這個 sidecar,它將允許外部應用程式與叢集中啟用 Dapr 的應用程式進行通訊,請參閱 Dapr API 參考。下圖是我們實際專案中的架構圖:
Apache APISIX Ingress 概覽
在 K8s 生態中,Ingress 作為表示 K8s 流量入口的一種資源,想要讓其生效,就需要有一個 Ingress Controller 去監聽 K8s 中的 Ingress 資源,並對這些資源進行相應規則的解析和實際承載流量。在當下趨勢中,像 Kubernetes Ingress Nginx 就是使用最廣泛的 Ingress Controller 實現。
而 APISIX Ingress 則是另一種 Ingress Controller 的實現。跟 Kubernetes Ingress Nginx 的區別主要在於 APISIX Ingress 是以 Apache APISIX 作為實際承載業務流量的資料面。如下圖所示,當使用者請求到具體的某一個服務/API/網頁時,通過外部代理將整個業務流量/使用者請求傳輸到 K8s 叢集,然後經過 APISIX Ingress 進行後續處理。
從上圖可以看到,APISIX Ingress 分成了兩部分。一部分是 APISIX Ingress Controller,作為控制面它將完成配置管理與分發。另一部分 APISIX Proxy Pod 負責承載業務流量,它是通過 CRD(Custom Resource Definitions) 的方式實現的。Apache APISIX Ingress 除了支援自定義資源外,還支援原生的 K8s Ingress 資源。詳細內容參見:https://www.apiseven.com/zh/blog/apisix-ingress-details
Dapr 概覽
Dapr是一個可移植,事件驅動的執行時。它使開發人員簡單地去構建執行在雲和edge上彈性、無狀態和有狀態的應用,並且包含多種語言和開發人員框架。
Any language, any framework, anywhere
今天,我們正在經歷一波雲應用浪潮。開發人員熟悉web +資料庫應用程式架構(例如經典的3層設計),但不熟悉本質上是分散式的微服務應用程式架構。成為分散式系統專家很難,你也不應該這樣做。開發人員希望專注於業務邏輯,同時依靠平臺為他們的應用程式注入伸縮性、彈性、可維護性、彈性和其他本地雲架構的屬性。
這就是Dapr的用武之地。Dapr將構建微服務應用程式的最佳實踐編入開放的、獨立的構建塊中,使您能夠使用自己選擇的語言和框架構建可移植的應用程式。每個構建塊都是完全獨立的,您可以在應用程式中使用其中的一個、一些或全部。
此外,Dapr與平臺無關,這意味著您可以在任何Kubernetes叢集和其他與Dapr整合的託管環境上本地執行應用程式。這使您能夠構建可以在雲和edge上執行的微服務應用程式。
詳細內容參見:https://docs.dapr.io/zh-hans/concepts/overview/
APISIX 支援Dapr 的部署
前提條件
• Kubernetes 1.19+ 叢集,叢集上已經配置了 Dapr 。
• 安裝了 Helm CLI 3x。
• Kubectl CLI 已安裝並配置為訪問叢集。
• 可選:用於建立自簽名證照的OpenSSL。
• APISIX的Helm Chart 版本0.7.2+,具體原因0.7.2 版本修復的issue:https://github.com/apache/apisix-helm-chart/issues/167
準備APISIX Helm
通過執行以下命令為 APISIX控制器新增最新的 helm chart repo:
$ helm repo add apisix https://charts.apiseven.com
$ helm repo update
建立APISIX Ingerss名稱空間
確保當前 kubectl 上下文指向正確的 Kubernetes 叢集,然後執行以下命令:
kubectl create namespace ingress-apisix
安裝支援 Dapr 的 APISIX 控制器
使用以下內容建立一個名為 dapr-annotations.yaml 的檔案,以在 APISIX Proxy Pod 上設定註釋:
apisix:
podAnnotations:
dapr.io/enabled: "true"
dapr.io/app-id: " apisix-gateway"
dapr.io/app-port: "9080"
dapr.io/enable-metrics: "true"
dapr.io/metrics-port: "9099"
dapr.io/sidecar-listen-addresses: 0.0.0.0
dapr.io/config: ingress-apisix-config
注意:上面的app-port告訴 daprd sidecar Proxy在監聽哪個埠。 有關受支援的註釋的完整列表,請參閱 Dapr Kubernetes pod 註釋規範。
下面是我在AKS上安裝的示例dapr-annotations.yaml:
apisix:
podAnnotations:
dapr.io/app-id: apisix-gateway
dapr.io/app-port: '9080'
dapr.io/enable-metrics: 'true'
dapr.io/enabled: 'true'
dapr.io/metrics-port: '9099'
dapr.io/sidecar-listen-addresses: 0.0.0.0
dapr.io/config: ingress-apisix-config
gateway:
type: LoadBalancer
ingress-controller:
enabled: true
dashboard:
enabled: true
執行以下命令,該命令引用上述檔案:
helm install apisix apisix/apisix -f dapr-annotations.yaml -n ingress-apisix
建立APISIX的Dapr Sidecar 資源
1、配置一個Apisix 上游 upstream—apisix-dapr
主機名 填寫:apisix-gateway-dapr,埠號填寫3500
{
"nodes": [
{
"host": "apisix-gateway-dapr",
"port": 3500,
"weight": 1
}
],
"retries": 1,
"timeout": {
"connect": 6,
"read": 6,
"send": 6
},
"type": "roundrobin",
"scheme": "http",
"pass_host": "pass",
"name": "apisix-dapr"
}
2、配置一個apisix 服務 apisix-gateway-dapr , 上游服務選擇apisix-dapr:
{
"name": "apisix-gateway-dapr",
"upstream_id": "376187148778341098"
}
部署測試示例專案
HTTPBin是以Python+Flask寫的一款工具,它cover了各類的HTTP場景,且每個介面一定都有返回。我們使用 kennethreitz/httpbin 作為示例專案進行演示:
kubectl apply -f 01.namespace.yaml
kubectl apply -f 02.deployment.yaml
kubectl apply -f 03.svc.yaml
上面假設有一個使用 Dapr app-id kennethreitz-httpbin執行的微服務,
路徑匹配改寫
比如請求閘道器是 /httpbin/*, 然後後端接收的路徑應該是 /*, 中間的httpbin只是充當服務名的標識。
路徑 填 /* 匹配/get這種請求
路徑改寫選正則改寫
匹配^/ httpbin/(.*) 表示匹配/之後的部分,作為第一個匹配到的值,變數名為$1
轉發路徑模板 /v1.0/invoke/svc-kennethreitz-httpbin.kind-test/method/$1 即取上一個匹配後的引數拼接轉發。 在支援名稱空間的託管平臺上,Dapr 應用 ID 是符合有效的 FQDN 格式,其中包括目標名稱空間。例如,以下字串包含應用 ID (svc-kennethreitz-httpbin) 以及應用執行在 名稱空間(kind-test)。
測試是否代理成功,訪問http://20.195.90.43/httpbin/get:
可以看到也正常代理了。
刪除 APISIX控制器
為方便起見,這裡是刪除 APISIX控制器的命令:
helm delete apisix -n ingress-apisix
不要忘記刪除之前建立的名稱空間ingress-apisix。
總結
你可以在 Kubernetes 中使用 Apache APISIX 的官方 Helm 倉庫直接部署 Apache APISIX 和 APISIX Ingress Controller。並且 Apache APISIX可通過作為閘道器,承載 APISIX Ingress Controller 的資料面來承載業務流量。將Dapr 通過Sidecar 的annotations 注入到APISIX Proxy Pod,通過Dapr的服務呼叫模組呼叫叢集中的微服務。