ASP.NET Core on K8S學習之旅(13)Ocelot API閘道器接入
本篇已加入《.NET Core on K8S學習實踐系列文章索引》,可以點選檢視更多容器化技術相關係列文章。
上一篇介紹了Ingress的基本概念和Nginx Ingress的基本配置和使用,考慮到很多團隊都在使用Ocelot作為API閘道器(包括我司)做了很多限流和鑑權的工作,因此本篇介紹一下如何使用Ocelot接入替代Nginx Ingress作為統一入口。
一、準備工作
我們仍然以上一篇的兩個ASP.NET Core WebAPI示例作為K8s叢集中的後端服務示例,這裡我們來快速地準備一個基於Ocelot的API閘道器服務。
至於怎麼建立Ocelot API閘道器,已經有很多文章介紹了,這裡就不再贅述。需要注意的步驟有以下幾點:
(1)根據Ocelot的版本引入匹配的K8s Provider:
可以看到,這個Provider包是張隊寫的,目前已經支援.NET Core 3.1,最新版本是15.0.6。這裡我選擇的是13.5.2,因為我的API閘道器服務還是.NET Core 2.2的版本。
KubeClient是kubernetes 的C#語言客戶端簡單易用,KubeClient是.NET Core(目標netstandard1.4)的可擴充套件Kubernetes API客戶端, github地址點選這裡。這個Ocelot的kubernetes整合模組就是使用KubeClient開發的,可以參考張隊的這篇文章。
(2)在StartUp類的ConfigureService方法中新增以下程式碼:
services.AddOcelot() .AddKubernetes();
(3)編寫ocelot.json配置檔案:
{ "GlobalConfiguration": { "ServiceDiscoveryProvider": { "Token": "your token", "Namespace": "xdp-poc", "Type": "kube" } }, "ReRoutes": [ // API01: apple-api-svc { "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "UpstreamPathTemplate": "/apple/{url}", "ServiceName": "apple-api-svc", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ] }, // API02: banana-api-svc { "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "UpstreamPathTemplate": "/banana/{url}", "ServiceName": "banana-api-svc", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ] } ] }
由於我的是13.5.2的老版本,因此需要配置ServiceDiscoveryProvider下的資訊(例如Token),這裡我直接使用的我要配置的名稱空間xdp-poc下的default-token,你可以在這裡獲取到:
據張隊介紹,新版本的K8s Provider不再需要提供這些資訊配置。
為了能夠讓這個serviceaccount能夠具有獲取endpoint的許可權,我們還需要事先執行一下以下語句:
kubectl create clusterrolebinding k8s-api-admin\
--clusterrole=cluster-admin --user=admin --user=kubelet\
--group=system:serviceaccounts
如果不執行以上語句可能會出現KubeClient的許可權不夠,無法獲取對應服務的註冊地址和埠,也就無法正確指向對應的服務介面。
預設情況下,如果在GlobalConfiguration中配置了ServiceNamespace,那麼在路由表中不再需要為每個路由設定ServiceNamespace,但是如果某一個或幾個是在不同的ServiceNamespace下,可以在其中為其單獨設定ServiceNamespace,如下所示:
{ "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "UpstreamPathTemplate": "/banana/{url}", "ServiceName": "banana-api-svc", "ServiceNamespace" : "kube-system", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ] }
二、映象&部署
準備好了API閘道器的程式碼,就可以生成映象並推送到映象倉庫了,這裡我仍然推到我的docker hub上,如下圖所示:
當然,實際中還是建議推到自己企業的私有映象倉庫(例如基於Harbor搭建一個)或者使用阿里雲或其他雲的私有映象倉庫服務。
然後,準備一個用於deploy的yaml檔案如下:
apiVersion: apps/v1 kind: Deployment metadata: name: api-gateway-demo namespace: xdp-poc labels: name: api-gateway-demo spec: replicas: 2 selector: matchLabels: name: api-gateway-demo template: metadata: labels: name: api-gateway-demo spec: containers: - name: api-gateway-demo image: xilife/api-gateway-demo:1.0 ports: - containerPort: 80 imagePullPolicy: IfNotPresent --- kind: Service apiVersion: v1 metadata: name: api-gateway-svc namespace: xdp-poc spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080 selector: name: api-gateway-demo
通過kubectl將其部署到K8s叢集中:
kubectl apply -f deploy-api-gateway-svc.yaml
通過Dashboard也可以看到部署成功:
亦或通過檢視容器日誌驗證:
三、快速驗證
這裡由於我剛剛設定的服務是NodePort方式,並且指定暴露的埠號是30080,那麼我直接通過IP+Port來直接訪問:
(1)AppleApi
(2)BananaApi
當然,你也可以為你的API閘道器入口配置SSL證書,通過https來訪問提高安全性(實際中也是強烈建議):
四、小結
本文介紹瞭如何在K8s叢集中接入基於Ocelot的API閘道器服務來替代Ingress作為K8s叢集API服務的統一入口,雖然示例很簡單,但是基本的介紹目的已經達到了。在此,也特別感謝Ocelot的貢獻者們,以及張隊貢獻的這個整合K8s的 Provider。
參考資料
Ocelot K8s部分Doc,https://ocelot.readthedocs.io/en/latest/features/kubernetes.html
憂康,K8s-Endpoint訪問外部服務
楊波,《Sprint Boot與Kubernetes雲原生應用實踐》課程
作者:周旭龍
出處:https://edisonchou.cnblogs.com
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。