ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入
【云原生】|?作者/Edison Zhou
這是恰童鞋騷年的第232篇原創文章
上一篇介紹了Ingress的基本概念和Nginx Ingress的基本配置和使用,考慮到很多團隊都在使用Ocelot作為API網關(包括我司)做了很多限流和鑒權的工作,因此本篇介紹一下如何使用Ocelot接入替代Nginx Ingress作為統一入口。
1準備工作
我們仍然以上一篇的兩個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地址:https://github.com/tintoy/dotnet-kube-client/。這個Ocelot的kubernetes集成模塊就是使用KubeClient開發的,可以參考張隊的這篇文章:https://www.cnblogs.com/shanyou/p/10632282.html
(2)在StartUp類的ConfigureService方法中添加以下代碼:
services.AddOcelot().AddKubernetes();(3)編寫ocelot.json配置文件:
{"GlobalConfiguration": {"ServiceDiscoveryProvider": {"Token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJ4ZHAtcG9jIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4taGs3c2YiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjYxYjljOTVi","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的權限,我們還需要事先執行一下以下語句:
如果不執行以上語句可能會出現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" ] }2鏡像&部署
準備好了API網關的代碼,就可以生成鏡像并推送到鏡像倉庫了,這里我仍然推到我的docker hub上,如下圖所示:
當然,實際中還是建議推到自己企業的私有鏡像倉庫(例如基于Harbor搭建一個)或者使用阿里云或其他云的私有鏡像倉庫服務。
然后,準備一個用于deploy的yaml文件如下:
通過kubectl將其部署到K8s集群中:
kubectl?apply?-f?deploy-api-gateway-svc.yaml通過Dashboard也可以看到部署成功:
你也可以通過查看容器日志驗證:
3快速使用驗證
這里由于我剛剛設置的服務是NodePort方式,并且指定暴露的端口號是30080,那么我直接通過IP+Port來直接訪問:
(1)AppleApi
(2)BananaApi
當然,你也可以為你的API網關入口配置SSL證書,通過https來訪問提高安全性(實際中也是強烈建議):
4小結
本文介紹了如何在K8s集群中接入基于Ocelot的API網關服務來替代Ingress作為K8s集群API服務的統一入口,雖然示例很簡單,但是基本的介紹目的已經達到了。在此,也特別感謝Ocelot的貢獻者們,以及張隊貢獻的這個集成K8s的 Provider。
5參考資料
Ocelot K8s部分,https://ocelot.readthedocs.io/en/latest/features/kubernetes.html
憂康,K8s-Endpoint訪問外部服務
楊波,《Sprint Boot與Kubernetes云原生應用實踐》課程
往期精彩回顧
.NET Core on K8s學習系列文章目錄
基于Jenkins的開發測試全流程持續集成實踐
基于Jenkins的ASP.NET Core持續集成實踐
如果本文對你有用,
不妨點個“在看”/轉發朋友圈
????點擊獲取示例代碼
總結
以上是生活随笔為你收集整理的ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core接入ElasticSe
- 下一篇: ASP.NET Core分布式项目实战(