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云原生应用实践》课程
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
F5G时代,家宽迈向千兆,别让光猫拖了后腿
即将开播:5月14日,Jenkins在K8S下的三种部署流程和实战演示 移动网络已迈入5G时代,其带宽、时延等网络能力将成倍提升,业务和商业模式也将发生翻天覆地的变化。那么,几十年与之并行发展的固网宽带又将发生怎样的变革? 家宽新业务发展迎来拐点 还记得2003年吗?这一年,“非典”疫情让无数人足不出户,但却成为了中国互联网加速发展的拐点。京东、淘宝等都在这一年诞生。 如今新冠疫情影响了全球数十亿人的生活,但种种迹象表明,这或将空前改变人们的线上行为,加速推动新时代的线上业务发展。 疫情发生后,2月4日,教育部印发《关于在疫情防控期间做好普通高等学校在线教学组织与管理工作的指导意见》,随后各类在线平台共发布2.4万网课,人数增长128倍。艾媒咨询数据显示,在线教育市场规模逐年增长,2020年中国在线教育用户规模将达到3.09亿人,预计市场规模达到4538亿元。 在线远程办公需求也持续爆发,welink日会议数量翻一倍,1000万企业,2亿用户使用阿里钉钉在线办公。艾媒咨询数据显示,2020年新春复工期间,中国有超过1800万家企业采用了线上远程办公模式,共计超过3亿用户使用远程办公应用...
- 下一篇
社区首款 OAM 可视化平台发布!关注点分离、用户友好、上手难度低
作者 |徐运元,杭州谐云科技合伙人及资深架构师,云计算行业和 Kubernetes 生态资深从业者 **导读:**什么是 OAM?2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 QCon 上海 2019 重磅宣布,阿里云与微软联合推出开放应用模型 Open Application Model (OAM)开源项目。 OAM 的核心关注点 **关注点分离:**开发者关注应用本身,运维人员关注模块化运维能力,让应用管理变得更轻松、应用交付变得更可控; **平台无关与高可扩展:**应用定义与平台层实现解耦,应用描述支持任意扩展和跨环境实现; **模块化应用运维特征:**可以自由组合和支持模块化实现的运维特征描述。 OAM 的核心模块 1. 应用组件(Components) 在 OAM 中,“应用”是由多个概念共同组合而成。第一个概念是:应用组件(Components),它是整个应用的重要组成部分。应用组件既可以包括应用运行所依赖的服务:比如 MySQL 数据库,也包括应用服务本身:比如拥有多个副本的 PHP 服务器。开发者可以把他们写的代...
相关文章
文章评论
共有0条评论来说两句吧...