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

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

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:点击获取 示例代码


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

查看所有标签

猜你喜欢:

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

你不知道的JavaScript(中卷)

你不知道的JavaScript(中卷)

[美] Kyle Simpson / 单业、姜南 / 人民邮电出版社 / 2016-8 / 79.00元

JavaScript这门语言简单易用,很容易上手,但其语言机制复杂微妙,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也无法真正理解。本套书直面当前JavaScript开发人员不求甚解的大趋势,深入理解语言内部的机制,全面介绍了JavaScript中常被人误解和忽视的重要知识点。本书是其中卷,主要介绍了类型、语法、异步和性能。一起来看看 《你不知道的JavaScript(中卷)》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具