KubeSphere 网关的设计与实现(解读)
作者:泓舟子,KubeSphere 后端研发工程师,云原生爱好者,现专注于云原生微服务方向。
KubeSphere 中为什么需要网关?
如果需要将 K8s 集群内的服务暴露到外部访问有那些方式呢?可以通过将 Service 设置成 NodePort 方式暴露出去或者通过 Ingress 方式。另外使用 Ingress 方式可以实现将请求分发到一个或多个 Service,可以同一个 IP 地址下暴露多个服务等优势。
但是对于 Ingress 方式而言,在 K8s 中只是内置了 Ingress CRD(可以创建 Ingress 资源),没有内置 Ingress Controller,必须部署了 Ingress Controller 才能为 Ingress 资源提供外部访问集群内部服务的能力。而 KubeSphere 中的网关就是 Ingress Controller 。
网关的设计
KubeSphere v3.2 对网关进行了重构,在保留了原有网关功能的基础上增加了以下几点新功能:
- 启用集群和项目级别的网关:可以根据业务上的需求灵活选择不同粒度的网关。
- 增减网关副本数:灵活调整副本数达到更高的可用性。
- 灵活配置 Ingress Controller 配置选项。
- 可指定网关应用负载安装的位置:可选择将网关应用负载安装的位置指定某固定命名空间或分别让其位于各自项目命名空间下。结合 KubeSphere 中的权限管理,若让资源位于各个项目命名空间下,拥有该项目权限的用户也能查看到网关资源。
- 网关日志:集中查询网关日志,将分布在各个副本的网关日志集中起来查询。
- 网关监控指标:监控网关中的一些指标,包括请求总量/成功率/延迟 等指标。
网关的实现
目前 K8s 支持和维护 AWS、 GCE 和 Nginx Ingress 控制器,KubeSphere 使用 Ingress Nginx Controller 作为默认的网关实现,没有做任何代码修改。
各个功能点的实现思路
集群和项目级别的网关:这个通过传入参数覆盖默认的 Helm Chart Values 来实现并在代码逻辑里控制,如果启用了集群网关就不能启用项目网关了;若启用了项目网关又启用了集群网关,那么通过两个网关入口都可以访问,只是这样会有两个 Ingress Controller 同时 Watch 相同的 Ingress 对象。
增减网关副本数&配置 Ingress Controller 配置选项:这个通过传入参数覆盖默认的 Helm Chart Values 来实现,实现过程用到的 Helm Operator 将在后面重点介绍。
可指定网关应用负载安装的位置:可选择将网关应用负载安装的位置指定某固定命名空间或分别让其位于各自项目命名空间下。这个在代码逻辑中控制,并做成了配置项,默认将所有资源安装在 kubesphere-controls-system 下。
网关日志:使用到了 KubeSphere 中日志组件,日志组件会采集日志数据然后存储在 Elasticsearch 中,网关在查询日志过程就根据参数在 Elasticsearch 中查询日志。
网关监控指标:使用到了 KubeSphere 中监控组件,KubeSphere 内部配置了 Prometheus 相关的参数采集 Ingress 相关指标,查询监控信息过程就根据监控组件中的 API 查询相关数据。
下面重点介绍设计实现过程抽象出的 CRD 和如何巧妙地用 Helm Operator 集成。
抽象出 Gateway CRD 做适配
在设计上抽象了一个 Gateway CRD 来适配不同的 Ingress Controller,Gateway CRD 中包含设置 Ingress Controller 所需的公共属性。KubeSphere API 和 UI 只与 Gateway CRD 交互。
# Gateway sample
apiVersion: gateway.kubesphere.io/v1alpha1
kind: Gateway
metadata:
name: kubesphere-router-proj1
namespace: kubesphere-controls-system # all Gateway workload will be created in the kubesphere-controls-system namespace by default. However, it's configurable in kubesphere-config when calling KubeSphere API.
spec:
controller:
# controlpanel replicas. For ingress Controler that has controlpanel and workers. *Reserved field. Changing on UI isn't supported yet.
replicas: 1
# annotations of the controlpanel deployment. *Reserved field. Changing on UI isn't supported yet.
annotations: {}
# Watching scope,
# enabled =true, watching for the project only. The user needs to specify the watching namespace.
# enabled =false, Global gateway, watching for all namespaces.
scope:
enabled: false
namespace: "" # defaults to .Release.Namespace
# gateway configurations. only key-value pair supported currently.
config:
max-bucket: 1m
# worker workload deployment configuration
deployment:
annotations:
"servicemesh.kubesphere.io/enabled": "false"
replicas: 1
#
service:
# Cloud LoadBalancer configurations for service
annotations:
"service.beta.kubernetes.io/qingcloud-load-balancer-eip-ids": "test-ip-id"
# Service Type, only LoadBalancer and NodePort are supported
type: LoadBalancer
集成 Nginx Ingress Controller
KubeSphere 使用 Nginx Ingress Controller 作为默认的网关实现。为了简化部署步骤,我们集成了 Helm-operator-plugins 作为 Helm Operator 。
在 Helm Operator 中主要有以下关键点:
根据 watch.yaml 中配置的监听指定 CRD 下的 CR 来创建或更新 Chart 资源。其中可以根据 CR spec 中的值覆盖默认 Helm Chart 中的值,这是由 Helm Operator 中的机制决定的,详见官方说明。
如下的含义是需要 Watch gateway.kubesphere.io/v1alpha1 的 Nginx CR,如果有变化就触发 Reconcile ,根据 chart 中配置的地址创建或更新对应的资源。
- group: gateway.kubesphere.io
version: v1alpha1
kind: Nginx
chart: /var/helm-charts/ingress-nginx
在 KubeSphere 中的使用:
watchs.yaml 中就做了如下配置:
- group: gateway.kubesphere.io
version: v1alpha1
kind: Nginx
chart: /var/helm-charts/ingress-nginx
- group: gateway.kubesphere.io
version: v1alpha1
kind: Gateway
chart: /var/helm-charts/gateway
其中对 chart 而言:
- Nginx 是用的官方的 Helm Chart,在打包 ks-controller-manager 时下载的官方 Helm Chart。详见:https://github.com/kubesphere/kubesphere/blob/v3.2.0/build/ks-controller-manager/Dockerfile#L34
- Gateway 是在 KubeSphere 中定制的 Helm Chart,里面主要就操作了 Nginx CR 资源。详见:https://github.com/kubesphere/kubesphere/blob/v3.2.0/config/gateway/templates/nginx-ingress.yaml
整体而言:
Helm Operator Watch 了 Gateway 和 Nginx 2 个 CRD 的资源,当前端发起创建或更新网关时是对 Gateway CR 发起创建或更新操作:
- 发起请求创建或更新 Gateway CR ;
- 根据 watchs.yaml 配置的 Gateway, Helm Operator 监听到有 Gateway CR 资源变化,将创建或更新 Nginx CR ;
- 根据 watchs.yaml 配置的 Nginx,Helm Operator 监听到 Nginx CR 资源变化后就根据 Nginx CR 中的 spec 中的值来覆盖默认 Helm Chart 中的值来创建或更新 Nginx Ingress Contoller。
配置项的设计
为了方便更改网关的一些参数设计了如下配置项:
gateway:
watchesPath: /var/helm-charts/watches.yaml
repository: kubesphere/nginx-ingress-controller
tag: v1.1.0
namespace: kubesphere-controls-system
- watchesPath:指定 Helm Operator Watch 的配置文件,如果需要禁用 Helm Operator 就可以删掉这个配置项。
- repository:指定 nginx-ingress-controller 的仓库。
- tag:指定 nginx-ingress-controller 的 tag。
- namespace:指定网关应用负载安装的位置位于指定的命名空间下,若删掉这个配置项就会安装在各个项目命名空间下。
使用过程注意事项
- 如果启用了 servicemesh ,在原有的 Ingress 需要加上额外的注解
nginx.ingress.kubernetes.io/upstream-vhost: [service-name].[service-namespace].svc.cluster.local流量拓扑/链路追踪可以正常工作,不然入口流量处会有异常。 - 修改网关相关属性,比如:副本数、Nginx 配置项等,不能直接在相关的 deploy/configmap 等应用负载里面修改,需要在网关设置中修改(修改的是 Gateway CR)。因为使用的是 Helm Operator 来管理控制网关相关资源的状态,所有值都会以 Gateway CR 中的配置为准,改了网关相关应用负载中的值最终都会被 Helm Operator 还原掉。
参考:
- https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
- https://github.com/kubesphere/community/blob/master/sig-microservice/concepts-and-designs/KubeSphere-gateway-operator-design.md
- https://github.com/kubesphere/kubesphere
- https://sdk.operatorframework.io/docs/building-operators/helm/
本文由博客一文多发平台 OpenWrite 发布!
KubeSphere 网关的设计与实现(解读)的更多相关文章
- API网关的设计思路及落地 IT大咖说 - 大咖干货,不再错过
API网关的设计思路及落地 IT大咖说 - 大咖干货,不再错过 http://www.itdks.com/dakashuo/new/dakalive/detail/1407
- 一个简单可参考的API网关架构设计
网关一词较早出现在网络设备里面,比如两个相互独立的局域网段之间通过路由器或者桥接设备进行通信, 这中间的路由或者桥接设备我们称之为网关. 相应的 API 网关将各系统对外暴露的服务聚合起来,所有要调用 ...
- 网关never_host设计
never下app的host与api Never是纯c#语言开发的一个框架.host则是使用该框架开发出来的API网关,它包括了:路由.认证.鉴权.熔断,内置了负载均衡器Deployment:并且只需 ...
- 基于CC2530的ZigBee转以太网网关的设计与实现
*已刊登至:<无线电>8月刊 物联网技术的实现中,无线技术是必不可少的部分. 近年无线技术的发展,将ZigBee推入人们的视线中.那么ZigBee是如何的一种技术呢?带着疑问.我查询了它的 ...
- 网关(Gatesvr) 设计(1)
Gate解决的问题: 1.用户在服务端的实例可以在不同的进程中,也可以移动到同一个进程中.2.用户只需要与服务端建立有限条连接,即可以访问到任意服务进程.这个连接的数量不会随服务进程的数量增长而线性增 ...
- 唯品会API网关设计与实践--转
原文地址:https://609518.kuaizhan.com/86/70/p4108366952248f 刘璟宇Leo 唯品会资深研发工程师,在大型高性能分布式系统设计和开发方面有丰富的经验.目前 ...
- 如何设计一个亿级网关(API Gateway)?
1.背景 1.1 什么是API网关 API网关可以看做系统与外界联通的入口,我们可以在网关进行处理一些非业务逻辑的逻辑,比如权限验证,监控,缓存,请求路由等等. 1.2 为什么需要API网关 RPC协 ...
- 基于ZigBee的家居控制系统的设计与应用
基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘 要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...
- APP设计尺寸规范大全,APP界面设计新手教程【官方版】(转)
正值25学堂一周年之际,同时站长和APP设计同仁们在群里(APP界面设计 UI设计交流群,APP界面设计⑥群 APPUI设计③群58946771 APP设计资源⑤群 386032923欢迎大家加入交流 ...
- 理解WEB API网关
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
随机推荐
- 【转载】解决Nvidia-smi没有进程但是显存不释放的问题
----------------版权声明:本文为CSDN博主「打拳的土豆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn ...
- Hutool常用工具类
1.背景 实际开发中经常用到很多的工具类,这里hutool提供了一系列的工具类,下面重点介绍常用的工具类. 2.使用步骤 官方文档:https://hutool.cn/docs/#/ 添加依赖 < ...
- 使用SiliconCloud尝试GraphRag——以《三国演义》为例(手把手教程,适合小白)
使用OpenAI模型体验GraphRag--以<边城>为例 在使用SiliconCloud之前,先使用OpenAI的模型看看GraphRag的效果. GraphRAG是一种基于AI的内容理 ...
- 零基础学习人工智能—Python—Pytorch学习(八)
前言 本文介绍卷积神经网络的上半部分. 其实,学习还是需要老师的,因为我自己写文章的时候,就会想当然,比如下面的滑动窗口,我就会想当然的认为所有人都能理解,而实际上,我们在学习的过程中之所以卡顿的点多 ...
- 全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列
全网最适合入门的面向对象编程教程:38 Python 常用复合数据类型-使用列表实现堆栈.队列和双端队列 摘要: 在 Python 中,列表(list)是一种非常灵活的数据结构,可以用来实现堆栈(st ...
- .net core mvc 跳转LoginPath时端口缺失
在使用nginx部署.net core mvc的程序时,假如我使用的是5002端口,并且当访问站点时如果未登录,则跳转到登录页面.可是最后却发现跳转的时候端口丢失了,那是因为我配置的是 p ...
- Python 绘制 K 线图
import mplfinance as mpf import pandas as pd # 示例数据 data = pd.DataFrame({ 'Date': ['2023-01-01', '20 ...
- 常用 DNS 查询速度测试
测试工具 DNS-Benchmark | GitHub 总结 进过多轮测试,我认为: 223.5.5.5 和 223.6.6.6 平均响应时间最短(223.5.5.5 在教育网内疑似无法连通) 114 ...
- C++创建与调用dll动态链接库(MinGW64 Dev-C++)
本文使用的是dev-c++,如果涉及到VC++中不一样的操作,也会适当进行区分. 项目一:创建DLL 1.创建一个DLL类型的项目,当前命名为dlltest,并选择合适的路径进行保存. 2.在生成的 ...
- LeetCode 二叉树的最近公共祖先
一.二叉搜索树的最近公共祖先 利用二叉搜索树的性质,祖先的两个孩子,左孩子的小于根节点的值,右孩子大于根节点的值. 如果根节点的值,同时大于p的值和q的值,那么在左子树找根节点: 如果根节点的值,同时 ...