建设网站网站建站,写微信公众号用什么软件,网站抽奖模块怎么做,网站建设工程师面试对自己的前景规划【云原生】| 作者/Edison Zhou这是恰童鞋骚年的第232篇原创文章上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用#xff0c;考虑到很多团队都在使用Ocelot作为API网关#xff08;包括我司#xff09;做了很多限流和鉴权的工作#xff0c;因此本篇介绍一下如… 【云原生】| 作者/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.html2在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的权限我们还需要事先执行一下以下语句kubectl create clusterrolebinding k8s-api-admin\
--clusterrolecluster-admin --useradmin --userkubelet\
--groupsystem: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 ]
}
2镜像部署准备好了API网关的代码就可以生成镜像并推送到镜像仓库了这里我仍然推到我的docker hub上如下图所示当然实际中还是建议推到自己企业的私有镜像仓库例如基于Harbor搭建一个或者使用阿里云或其他云的私有镜像仓库服务。然后准备一个用于deploy的yaml文件如下apiVersion: apps/v1
kind: Deployment
metadata:name: api-gateway-demonamespace: xdp-poclabels:name: api-gateway-demo
spec:replicas: 2selector:matchLabels:name: api-gateway-demotemplate:metadata:labels:name: api-gateway-demospec:containers:- name: api-gateway-demoimage: xilife/api-gateway-demo:1.0ports:- containerPort: 80imagePullPolicy: IfNotPresent---kind: Service
apiVersion: v1
metadata:name: api-gateway-svcnamespace: xdp-poc
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:name: api-gateway-demo
通过kubectl将其部署到K8s集群中kubectl apply -f deploy-api-gateway-svc.yaml
通过Dashboard也可以看到部署成功你也可以通过查看容器日志验证3快速使用验证这里由于我刚刚设置的服务是NodePort方式并且指定暴露的端口号是30080那么我直接通过IPPort来直接访问1AppleApi2BananaApi当然你也可以为你的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持续集成实践如果本文对你有用不妨点个“在看”/转发朋友圈????点击获取示例代码