【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

可以在 Kubernetes 中通过 API 网关暴露微服务吗?

  • 2019-05-23
  • 本文字数:3864 字

    阅读完需:约 13 分钟

可以在Kubernetes中通过API网关暴露微服务吗?

长话短说:可以。看一下KongAmbassadorGloo等 Ingress 控制器就知道了。


在 Kubernetes 中,Ingress 是一个组件,它将集群外部的流量路由到服务和集群内的 Pod。


简单来说,Ingress 是作为反向代理或负载均衡器:所有外部流量都先路由到 Ingress,然后再路由到其他组件。



虽然最流行的 Ingress 组件是ingress-nginx项目,但是,在选择和使用 Ingress 时还有其他几个选项。


你可以从以下 Ingress 控制器中选择:



还有其他混合 Ingress 控制器可以与现有的云提供商集成,比如 Zalando 的Skipper Ingress


谈到 Kubernetes 中的 API 网关,你有三个常见的选项。

选项 1——API 网关的王者:Kong

如果你正在构建 API,那么你可能会对Kong Ingress提供的功能感兴趣。


Kong 是基于 Nginx 构建的一个 API 网关


Kong 侧重于 API 管理,并提供诸如身份验证、速率限制、重试、断路器等功能。


有趣的是,Kong 被包装成一个 Kubernetes Ingress。因此,你可以在集群中使用它作为用户和后端之间的网关。你可以使用标准的 Ingress 对象向外部流量暴露你的 API:


#ingress.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata:  name: my-ingressspec:  rules:    - host: example.com      http:        paths:          - path: /            backend:              serviceName: api-service              servicePort: 80
复制代码


不仅如此。作为安装过程的一部分,Kong 的控制器会注册自定义资源定义(CRD)。其中一个自定义扩展与 Kong 的插件相关。如果你希望以 IP 地址限制对你的 Ingress 的请求,则可以用以下方法定义该限制:


#limit-by-ip.yamlapiVersion: configuration.konghq.com/v1kind: KongPluginmetadata:  name: rl-by-ipconfig:  hour: 100  limit_by: ip  second: 10plugin: rate-limiting
复制代码


你可以在 ingress.yaml 文件中通过注解引用该限制:


#ingress.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata:  name: my-ingress  annotations:    plugins.konghq.com: rl-by-ipspec:  rules:    - host: example.com      http:        paths:          - path: /            backend:              serviceName: api-service              servicePort: 80
复制代码


你可以通过官方文档进一步了解Kong自定义资源定义(CRD)


但 Kong 不是唯一的选项。

选项 2——现代化 API 网关 Ambassador

Ambassador是另外一个 Kubernetes Ingress,基于 Envoy 构建,提供了一个健壮的 API 网关。


Ambassador Ingress 是一个现代化的 Kubernetes Ingress 控制器,它提供了健壮的协议支持、速率限制、身份验证 API 和可观测性集成。


Ambassador 与 Kong 的主要区别在于 Ambassador 是为 Kubernetes 设计的,并与之很好地集成。


Kong 是 2015 年开源的,当时 Kubernetes Ingress 控制器还没有那么先进。


但即使 Ambassador 在设计时考虑了 Kubernetes,它也没有利用人们熟悉的 Kubernetes Ingress。相反,服务是通过注解向外部暴露的:


#service.yamlapiVersion: v1kind: Servicemetadata:  labels:    service: api-service  name: api-service  annotations:    getambassador.io/config: |      ---      apiVersion: ambassador/v0      kind: Mapping      name: example_mapping      prefix: /      service: example.com:80      host_rewrite: example.comspec:  type: LoadBalancer  ports:    - port: 80      targetPort: 80  selector:    service: api-backend
复制代码


这种新方法非常方便,因为你可以在一个地方为部署和 Pod 定义所有路由。但是,在注解中使用 YAML 作为自由文本可能会导致错误和混淆。在普通的 YAML 中都很难正确地设置格式,更不用说在更大的 YAML 中作为字符串了。如果希望对 API 应用速率限制,以下就是 Ambassador 中的做法。你有一个 RateLimiting 对象,它定义了需求:


#rate-limit.yamlapiVersion: getambassador.io/v1beta1kind: RateLimitmetadata: name: basic-rate-limitspec: domain: ambassador limits:  - pattern: [{x_limited_user: "false"}, {generic_key: "qotm"}]    rate: 5    unit: minute  - pattern: [{x_limited_user: "true"}, {generic_key: "qotm"}]    rate: 5    unit: minute
复制代码


你可以在服务中像下面这样引用速率限制:


#service.yamlapiVersion: v1kind: Servicemetadata:  name: api-service  annotations:    getambassador.io/config: |      ---      apiVersion: ambassador/v1      kind: RateLimitService      name: basic-rate-limit      service: "api-service:5000"spec:  type: ClusterIP  selector:    app: api-service  ports:    - port: 5000      targetPort: http-api
复制代码


关于速率限制,Ambassador 有一个很好的的教程,所以,如果你对使用该特性感兴趣,可以查看Ambassador的官方文档。你可以使用自定义的路由过滤器来扩展 Ambassador,但它没有提供像 Kong 那样丰富的插件机制。

选项 3——把东西粘到一起的 Gloo

Ambassador 并不是唯一基于 Envoy 且可以用作 API 网关的 Ingress。 Gloo是一个Kubernetes Ingress,也是一个 API 网关,能够提供速率限制、断路器、重试、缓存、外部身份验证和授权、转换、服务网格集成和安全性。


Glue 的卖点是它能够自动发现应用程序的 API 端点,并自动理解实参和形参。


我理解,这很难让人相信(他们的文档在这个意义上没有提供什么帮助),所以这里有一个例子。 假设你有一个用于地址簿的 REST API。该应用暴露了以下端点:


  • GET /users/{id}:获取用户资料;

  • GET /users:获取所有用户;

  • POST /users/find:查找特定的用户。


如果你的 API 是使用标准工具(如 OpenAPI)开发的,那么 Gloo 将自动使用 OpenAPI 定义来检查你的 API 并存储这三个端点。如果在发现阶段之后列出 Gloo 提供的所有端点,你将看到:


#glooupstreamSpec:  kube:    selector:      app: addressbook    serviceName: addressbook    serviceNamespace: default    servicePort: 8080    serviceSpec:      rest:        swaggerInfo:          url: http://addressbook.default.svc.cluster.local:8080/swagger.json        transformations:          findUserById:            body:              text: '{"id": {{ default(id, "") }}}'            headers:              :method:                text: POST              :path:                text: /users/find              content-type:                text: application/json          getUser:            body: {}            headers:              :method:                text: GET              :path:                text: /user/{{ default(id, "") }}              content-length:                text: '0'              content-type: {}              transfer-encoding: {}          getUsers:            body: {}            headers:              :method:                text: GET              :path:                text: /users              content-length:                text: '0'              content-type: {}              transfer-encoding: {}
复制代码


一旦 Gloo 有了一个端点列表,你就可以使用该列表在传入请求到达后端之前对其应用转换。例如,你可能希望在请求到达应用程序之前从传入的请求收集所有报头,并将它们添加到 JSON 的有效负载。


或者,你可以暴露 JSON API,并让 Gloo 应用转换,从而在消息到达遗留组件之前将其呈现为 SOAP。 能够发现 API 并应用转换,使得 Gloo 特别适合具有多种技术的环境——或者当你正处于从旧遗留系统迁移到新堆栈的过程中。


Gloo 可以发现其他类型的端点,比如 AWS Lambdas。 当你希望混合和搭配 Kubernetes 与无服务器时,它可以作为一个完美的搭档。

回顾

下面是对这三个 Ingress 控制器的简单回顾:


KongAmbassadorGloo
协议http、https、grpc、tcp、udphttp、https、grpc、tcp、udp、tcp+sslhttp、https、grpc
基础NginxEnvoyEnvoy
弹性主动和被动健康检查、断路器、速率限制、重试速率限制速率限制、断路器、重试、缓存
状态在PostgreSQL或Cassandra中配置,状态保存在CRD中ServiceCRD
路由定义作为Ingress清单在Service中作为Ingress清单
身份验证Basic Auth、HMAC、JWT、Key、LDAP、OAuth 2.0、PASETO、OIDC(仅限企业版)Basic Auth、OIDCBasic Auth、OIDC
可扩展性插件无,外部集成插件
仪表板Kong企业仪表板或开源社区项目Dashboard企业版仪表板


我应该用哪一个?


  • 如果你想要一个经过实战检验的 API 网关,Kong 仍然是你最好的选择。它可能不是最耀眼的,但其文档是最好的,而且网上有很多资源。它的生产里程也比任何其他网关都要长。

  • 如果你需要一个灵活的 API 网关,它可以很好地与新旧基础设施配合使用,那么你应该看看 Gloo。自动发现 API 和转换请求的能力非常有吸引力。

  • 如果你希望在你的服务中设置所有网络的简单性,你应该考虑 Ambassador。它有很好的入门教程和文档。注意,YAML 缩进是一个空字符串。

更多选项

如果你认为 Ambassador、Kong 或 Gloo 都不是你想要的,你可参考以下方法:



查看英文原文:Can you expose your microservices with an API gateway in Kubernetes?


2019-05-23 16:318283
用户头像

发布了 680 篇内容, 共 384.1 次阅读, 收获喜欢 1495 次。

关注

评论

发布
暂无评论
发现更多内容

危中蕴机:Oi! Network展现出的勇气和决心

股市老人

不要过于吹捧ChatGPT:人工智能生成文字还有很大提升空间

石头IT视角

ContentProvider介绍

攻城狮Wayne

ContextClassLoader 三周年连更

kubernetes delta_fifo源码解析

欢乐的阿苏

golang DevOps 后端 源码阅读 #Kubernetes#

一定是疯了!在M1的Mac上玩OpenVINO,让Intel怎么看我?

IT蜗壳-Tango

OpenVINO Stable Diffusion 三周年连更

【Linux】之【磁盘】相关的命令及解析[df、du、iostat、iotop]

A-刘晨阳

Linux 三周年连更 磁盘空间

论程序员的为码之“道”

酱紫的小白兔

从ReentrantLock角度解析AQS

Java AQS 并发

成都.NET线下技术沙龙倒计时一天

MASA技术团队

.net 开发者 MASA Stack

达观助手AI写作下载安装教程及特色功能详解,速速收藏体验!

NLP资深玩家

5 分钟带你小程序入门 [实战总结分享]

程序员海军

小程序 微信小程序 前端 三周年连更

【坚果派-坚果】获取OpenHarmony 3.2 Release源码的两种方式

坚果

HarmonyOS OpenHarmony OpenHarmony3.2 三周年连更

kubernetes indexer源码解析

欢乐的阿苏

golang DevOps cache 源码阅读 #Kubernetes#

Golang并发编程实战:使用ring buffer实现高效的阻塞队列

Jack

devops|中小公司不要做研发效能度量

laofo

DevOps 研发效能 效能度量 DevOps工具链 研发效能度量

C生万物 | 反汇编深挖【函数栈帧】的创建和销毁

Fire_Shield

C语言 汇编 三周年连更 函数栈帧

数据库原理及MySQL应用 | 约束

TiAmo

数据库 MySQL数据库 三周年连更 数据库约束

RabbitMQ组件介绍

穿过生命散发芬芳

RabbitMQ 三周年连更

Java程序控制结构

timerring

Java

zookeeper的节点加密方式及分布式锁实现过程

浅羽技术

三周年连更

对话ChatGPT:Prompt是普通人“魔法”吗?

Alter

kubernetes fifo源码解析

欢乐的阿苏

golang DevOps 后端 源码阅读 #Kubernetes#

Unity 之 使用原生UGUI实现随手移动摇杆功能经典实例

陈言必行

Unity 三周年连更

Spider实战-抓取视频

浅辄

三周年连更

一文掌握 Go 文件的读取操作

陈明勇

Go golang 文件读取 三周年连更

Unity 之 转微信小游戏本地数据存储

陈言必行

Unity 三周年连更

Go语言开发小技巧&易错点100例(三)

海风极客

Go 三周年连更

程序员如何保住自己的饭碗?| 社区征文

liuzhen007

程序员 三周年征文

AI日课@20230412:Prompt Engineering

无人之路

ChatGPT

一文读懂封装

断墨寻径

#java 三周年征文

影驰 GeForce RTX 4070显卡正式开售!星曜 OC系列首发评测抢先看

Geek_2d6073

可以在Kubernetes中通过API网关暴露微服务吗?_云原生_Daniele Polencic_InfoQ精选文章