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的权限,我们还需要事先执行一下以下语句:
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" ]
}
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,那么我直接通过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网关接入相关推荐
- ASP.NET Core on K8s学习之旅(14)Ingress灰度发布
[云原生]| 作者/Edison Zhou 这是恰童鞋骚年的第236篇原创文章 上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用,然后我还录了一个快速分享小视频介绍了一 ...
- 文章目录 | .NET Core on K8s学习之旅 (更新至20200618)
.NET Core on K8s学习之旅 更新记录: -- 20200511 增加Ingress & Nginx Ingress介绍 -- 20200515 增加Ocelot API网关集成示 ...
- ASP.NET Core on K8S学习初探(1)
" [LOG] ASP.NET Core on K8S Starting..." 01 - 写在之前 当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务 ...
- .Net Core微服务入门——Ocelot API网关接入(一)
.Net Core微服务入门--Ocelot API网关接入 上一章我们测试了一个简单的Client 端访问Consul实现服务注册与发现,但是现实生产环境我们直接通过Client自行连接Consul ...
- .Net Core微服务入门——Ocelot API网关接入(二)
Net Core微服务入门--Ocelot API网关接入(二) 我们先接入Consul,实现服务发现 服务发现 1.引入 Ocelot.Provider.Consul 包 2.修改ocelot.js ...
- ASP.NET Core on K8S学习初探(3)部署API到K8S
" 终于可以部署ASP.NET Core到K8S中了..." 在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP ...
- ASP.NET Core on K8S学习初探(2)
" [LOG] ASP.NET Core on K8S Starting..." 在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows ...
- ASP.NET Core on K8S深入学习(2)部署过程解析与部署Dashboard
上一篇<K8S集群部署>中搭建好了一个最小化的K8S集群,这一篇我们来部署一个ASP.NET Core WebAPI项目来介绍一下整个部署过程的运行机制,然后部署一下Dashboard,完 ...
- ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建
在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...
最新文章
- 不改一行代码定位线上性能问题
- python编码读法-python的读法
- docker可以把应用及其相关的_Docker相关命令应用
- 深度案例 | 中商惠民:如何用数据洞察商超需求 重塑高效流通链
- careercup-链表 2.1
- 区块链系列教程之:比特币中的网络和区块链
- 程序解析excel中的图片_产品日志丨支持导入Excel中的图片amp;批量修改后期实体字段...
- 管理信息系统数据库设计标准(草稿)
- Hibernate学习笔记--第二篇 关联关系映射 many –to –one
- 【初级03】java JVM核心技术(3): jvm调优
- 提升写作效率,让 Word 更好地为你所用
- Cesium:实现动态画点、线并测距
- SENT协议译码的深入探讨
- win7计算机高级还原,win7怎么恢复出厂设置 win7恢复出厂设置方法【图文】
- 第四次实验任务 任务一
- 微型计算机的外存储器 现在普遍采用什么,当前微型计算机上大部分采用的外存储器,不包含什么? 有选择A 硬盘 B 光盘 C 软盘 D 磁带...
- Ruby语言介绍(二)——Ruby基本语法(语言基础)
- 彻底解决Chrome自动更新方案
- socket本地通信
- IUV“经世杯”option3X
热门文章
- 【模拟】【codeforces】599B Spongebob and Joke
- php 输出缓冲区清理
- 【MFC】MFC中调用系统软键盘的几种方法
- iPhone5:4G是否进入主流的风向标?
- RFileWriteStream 写入汉字
- Silverlight专题(10)- WatermarkedTextBox使用
- k8s extender_Windows Home Server的Drive Extender的9种选择
- 百度新闻 谷歌新闻_每日新闻摘要:到目前为止,Google I / O提供的最佳信息
- 用window.location.href实现页面跳转
- 7.16 10.19-10.22