ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

栏目: IT技术 · 发布时间: 5年前

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:

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

可以看到,这个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,你可以在这里获取到:

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

据张队介绍,新版本的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上,如下图所示:

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

当然,实际中还是建议推到自己企业的私有镜像仓库(例如基于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也可以看到部署成功:

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

你也可以通过查看容器日志验证:

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

3 快速使用验证

这里由于我刚刚设置的服务是NodePort方式,并且指定暴露的端口号是30080,那么我直接通过IP+Port来直接访问:

(1)AppleApi

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

(2)BananaApi

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

当然,你也可以为你的API网关入口配置SSL证书,通过https来访问提高安全性( 实际中也是强烈建议 ):

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

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学习之旅(13)Ocelot API网关接入

:point_down:点击获取 示例代码


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Web Reputation Systems

Building Web Reputation Systems

Randy Farmer、Bryce Glass / Yahoo Press / 2010 / GBP 31.99

What do Amazon's product reviews, eBay's feedback score system, Slashdot's Karma System, and Xbox Live's Achievements have in common? They're all examples of successful reputation systems that enable ......一起来看看 《Building Web Reputation Systems》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具