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持续集成实践

如果本文对你有用,

不妨点个“在看”/转发朋友圈

????点击获取示例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构期末复习

1.完全二叉树的第5层有9个节点,该完全二叉树总计有多少个节点( B ). A.41 B.24 C.40 D.25 2.具有21个顶点的无向图至少有多少条边才能形成连通图 ( B ). A.21 B.20 C.22 D.21…

oracle有入参的试图,Oracle 带参视图

创建包:create or replace package p_view_param isfunction set_param(num number) return number;function get_param return number;end p_view_param;create or replace package body p_view_param isparamValue number;function set_param(num number) return number is…

C++实现拓扑排序(vector模拟邻接表存储,优先队列实现)

代码如下: #include <iostream> #include <queue> #include <vector> using namespace std; const int N 10010; int in[N]; vector<int>v[N]; vector<int>print;//存放拓扑序列 int main() {int n, m;//n为点的个数&#xff0c;m为边的条数,点…

ASP.NET Core分布式项目实战(运行Consent Page)--学习笔记

任务21&#xff1a;运行Consent Page修改 Config.cs 中的 RequireConsent 为 true&#xff0c;这样登录的时候就会跳转到 Consent 页面修改 ConsentController 的 Index 为异步[HttpGet] public async Task<IActionResult> Index(string returnUrl) {var model await Bu…

HDU - 2444——The Accomodation of Students(判断二分图,二分图最大匹配)

题意&#xff1a; 题意&#xff1a; 有n个人&#xff0c;m对人相互认识&#xff1b; 问能否分成两个组&#xff0c;组内任意两个人之间不认识&#xff1b; 若不能&#xff0c;则输出No&#xff1b; 若能&#xff0c;则相互认识的两个人一间房&#xff0c;求最多需要几间房&…

php代码时间控制,PHP 网页过期时间的控制代码

当然,前提要先打开CDN中一个功能reload_into_ims on.这样用户发送过来no-cache也不怕了.因为这样会给给no-cache转成If-Modified-Since .所以我们写程序主要是对If-Modified-Since控制就好了.记的,缓存系统架构中计中最好是后端来控制,所以最好的方法是程序来管理过期. 呵,我只…

[C++11]指针空值类型nullptr

代码如下: #include <iostream> using namespace std;void func(char *p) {cout << "void func(char *p)" << endl; }void func(int p) {cout << "void func(int p)" << endl; }int main() {func(10);func(NULL);return 0;…

一些有关使用EF的错误用法展开的思考

前言这是一个对话性的讨论&#xff0c;它讨论了一个严重的问题趋势&#xff0c;我发现在由初级团队到架构师团队的各种规模的组织中&#xff0c;EntityFramework的利用率都很高。这不是一个如何做的问题,这也不适合新手。如果有什么能激发您的想法&#xff0c;或者您对我提到的…

php字符串类型详解,php数字类型之字符串类型详解

在php中可字符一个字符串我们常用的就是单引号和双引号以前后面的语法结构heredoc和nowdoc定义&#xff0c;这两个要在php5.3.0以上版本。PHP中一个字符串可以通过下面的4种方式来定义&#xff1a;单引号双引号heredoc 语法结构nowdoc 语法结构 (自PHP 5.3.0以后)单引号定义一个…

Round Numbers POJ - 3252(数位dp+判断前导零)

题意 求二进制表示中0的个数大于1的数的个数。 题目 The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone’ (also known as ‘Rock, Paper, Scissors’, ‘Ro, Sham, Bo’, and a host of other names) in order to mak…

[C++11]常量表达式函数

constexpr修饰函数。 普通函数/类成员函数。 1.函数必须要有返回值&#xff0c;并且return返回的表达式必须是常量表达式。 代码如下: #include <iostream> using namespace std;//error 不是常量表达式函数 constexpr void func1() {int a 200;cout << a &l…

Magicodes.IE Csv导入导出

说明本章主要说明如何使用Magicodes.IE.Csv进行Csv导入导出.主要步骤1.安装包Magicodes.IE.CsvInstall-Package Magicodes.IE.Csv2.使用Magicodes.IE.Csv导出Csv通过如下代码片段我们将导出的内容通过相应的特性做出相应的处理.ExporterHeaderAttributeDisplayName&#xff1a;…

ajax获取php的数组,使用AJAX请求获取数组并将其传递到php数组中 - javascript

我正在为下一个问题苦苦挣扎&#xff1a;我有一个ajax请求&#xff0c;该请求将变量传递给PHP文件。 PHP处理该变量并返回一个数组。我需要取回该数组&#xff0c;所以我使用了AJAX成功回调函数&#xff0c;但是我只能打印出数组&#xff0c;仅此而已。我想使用该数组。$.ajax(…

D-query SPOJ - DQUERY(主席树求区间中不同的数的个数)

题意 给出n个数&#xff0c;m个询问&#xff0c;每个询问给出一个区间&#xff0c;需要回答这个区间中不同的数的个数 题目 {assign var“code” value“DQUERY”} {if KaTeX parse error: Expected EOF, got } at position 8: par""}̲ {assign varpa…locale} {…

微软 Build 2020开发者大会发来一张英雄帖,邀您速来赴约!

&#xff08;本文阅读时间&#xff1a;2 分钟&#xff09;微软 Build 2020开发者大会将于北京时间5 月 19 日晚上 23:00正式开启。大会将以Teams Live Event的形式面向全球开发者免费注册&#xff0c;并增设中文专家面对面&技术专场&#xff0c;方便开发者从48小时的连续技…

[C++11]不允许使用auto的四个场景

不允许使用auto的四个场景&#xff1a; 1.不能作为函数参数使用&#xff0c;因为只有在函数调用的时候才会给函数参数传递实参&#xff0c;auto要求必须要给修饰的变量赋值&#xff0c;因此二者矛盾。 代码如下: //error int func(auto a, auto b) {cout << a <<…

Network UVA - 315(Tarjan+连通性问题:求割点)

题意&#xff1a; 存在n个电话公司的网络连接站点&#xff0c;每个站点之间相互连通&#xff0c;是一个连通图&#xff0c;问&#xff0c;如果去掉一个站点&#xff0c;能够将整个网络体系变得不再连通&#xff0c;那么这样的点有几个&#xff0c;即求它的割点个数。 题目&am…

linux 进程内存开销,linux下查看最消耗CPU、内存的进程

1.CPU占用最多的前10个进程&#xff1a;ps auxw|head -1;ps auxw|sort -rn -k3|head -102.内存消耗最多的前10个进程ps auxw|head -1;ps auxw|sort -rn -k4|head -103.虚拟内存使用最多的前10个进程ps auxw|head -1;ps auxw|sort -rn -k5|head -104.也可以试试ps auxw --sortrs…

[C++11]自动类型推导auto

1.auto C11中&#xff0c;auto并不代表一种实际的数据类型&#xff0c;只是一个类型声明的"占位符"&#xff0c;auto并不是万能的在任意场景下都能够推导出变量的实际类型&#xff0c;使用auto声明的变量必须要进行初始化&#xff0c;以让编译器推导出它的实际类型&…

[最全操作指南] 在线六个项目全部迁移Linux

&#xff08;书山有路勤为径&#xff0c;学海无涯苦作舟&#xff09;开源也两年了&#xff0c;没想到自己在宣传.NetCore全栈的时候&#xff0c;也慢慢的做出了几个产品&#xff0c;毕竟也是一行一行的敲出来的&#xff0c;也是一天一夜的改出来的&#xff0c;希望每个人都能在…