时速云使用 Higress 替换 Ngnix Ingress + Spring Cloud Gateway 的生产实践

news2024/11/16 13:38:30

作者:王金山,北京云思畅想科技有限公司技术部微服务架构师,负责公司 API 网关和服务网格等研发工作

时速云介绍

时速云成立于2014年10月,致力于通过云原生技术帮助企业实现数字化转型,拥有云原生应用平台 TCAP 和云原生数据平台 KubeData 两大核心产品体系,产品包含云原生 DevOps、容器云 PaaS、中间件服务、边缘计算、微服务治理、服务网格、API 网关等。

需求背景

1.png

时速云的 PaaS 平台中存在着多款网关软件:

  • 以 HAProxy、Nginx Ingress 为基础的流量网关
  • Spring Cloud 微服务体系的 Spring Cloud Gateway
  • 作为 API 网关的 Kong
  • 服务网格体系下的 Istio Ingress Gateway

以上产品虽说各自有自己的应用场景,但是带来的问题是技术栈各不相同,为了满足不同的需求引入多种工具后,带来的就是维护成本的急剧增加。因此,寻找一种既可以满足所有需求,又可以使用统一技术栈的工具,成为我们追求的目标。Higress 正符合我们的需求。

Higress 解决方案

替代 Nginx Ingress

Higress 可以作为 K8s 集群的 Ingress 入口网关, 并且兼容了大量 K8s Nginx Ingress 的注解,可以从 K8s Nginx Ingress 快速平滑迁移到 Higress。如下是一个基于 Higress 自带注解来实现 REST 路由,并兼容 Nginx Ingress 注解重写路径的示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # 兼容 Nginx Ingress 注解
    nginx.ingress.kubernetes.io/rewrite-target: /
    # Higress 注解,支持 method/header/query 匹配路由
    higress.io/match-method: POST
    higress.io/exact-match-query-higressQuery: hi
    higress.io/prefix-match-header-x-higress-header: hi
  name: foo
spec:
  ingressClassName: higress
  rules:
  - host: foo.example.com
    http:
      paths:
      - pathType: Prefix
        path: /foo
        backend:
          service:
            name: foo-service
            port:
              number: 5678

并且 Nginx Ingress 的 Lua 代码性能比较差,Higress 对比 Nginx Ingress 的性能提升很大,如下图所示:

2.png

替代 Spring Cloud Gateway

Spring Cloud 微服务体系下,作为微服务网关必须跟微服务注册中心进行对接,实现服务发现。Higress 提供了 McpBridge 这个 CRD,可以很方便地跟多种注册中心对接,我们使用的 Spring Cloud 注册中心是 Nacos,McpBridge 配置如下:

apiVersion: networking.higress.io/v1
kind: McpBridge
metadata:
  name: default
  namespace: higress-system
spec:
  registries:
    # 定义一个名为 my-nacos  的服务来源
  - name: my-nacos
    # 注册中心类型是 Nacos 2.x,支持 gRPC 协议
    type: nacos2
    # 注册中心的访问地址,可以是域名或者IP
    domain: 127.0.0.1
    # 注册中心的访问端口,Nacos 默认都是 8848
    port: 8848
    # Nacos 命名空间 ID
    nacosNamespaceId: d8ac64f3-xxxx-xxxx-xxxx-47a814ecf358
    # Nacos 服务分组
    nacosGroups:
    - DEFAULT_GROUP

接着,配置 Ingress 转发到注册在 Nacos 上的服务 user-center:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.io/destination: user-center.DEFAULT-GROUP.d8ac64f3-xxxx-xxxx-xxxx-47a814ecf358.nacos
  name: user
  namespace: default
spec:
  rules:
  - http:
      paths:
      - backend:
          resource:
            apiGroup: networking.higress.io
            kind: McpBridge
            name: default
        path: /
        pathType: Prefix

这样 Spring Cloud 微服务无需做任何改造,即可接入 Higress 网关。对比 Spring Cloud Gateway/Zuul 等传统 Java 微服务网关, Higress 的性能高出2倍以上,可以显著降低资源成本。

替代 Kong

时速云的 API 网关产品用于帮助企业和开发者完成 API 的创建、维护、发布、监控告警等整个生命周期的管理。通过 API 网关,以 API 的形式将后端服务开放出来,提供给各方使用。认证鉴权能力是 API 网关中的关键能力,我们的 API 网关最初是基于 Kong 来构建的,主要使用了 Kong 的 Key Auth/Basic Auth/JWT Auth/HMAC Auth 插件,而 Higress 也都提供了这些插件能力:

3.png

以 Key Auth 为例,通过 Higress 提供的 WasmPlugin CRD 做如下配置即可:

apiVersion: extensions.higress.io/v1alpha1
kind: WasmPlugin
metadata:
  name: key-auth
  namespace: higress-system
spec:
  # 全局配置,配置认证规则
  defaultConfig:
    consumers:
    - credential: 2bda943c-xxxx-xxxx-xxxx-00163e1250b5
      name: consumer1
    - credential: c8c8e9ca-xxxx-xxxx-xxxx-e700dcc40e35
      name: consumer2
    keys:
    - x-api-key
    # 从请求header识别key
    in_header: true
    # 开启全局认证,consumer未识别将拒绝访问
    global_auth: true
  # 匹配规则,配置授权规则
  matchRules:
  # 路由级生效配置,匹配default命名空间下名为foo的ingress
  - ingress:
    - default/foo
    config:
      # 仅允许 consumer1 访问
      allow:
      - consumer1
  # 域名级生效配置
  - domain:
    - www.test.com
    - *.example.com
    config:
      # 仅允许 consumer1 访问
      allow:
      - consumer2
  url: oci://higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/key-auth:1.0.0

发起一个认证请求,因为 xxx.exmaple.com 仅授权了 consumer2 访问,所以下面这个 curl 命令将返回 403:

curl http://xxx.example.com/test -H 'x-api-key: 2bda943c-xxxx-xxxx-xxxx-00163e1250b5'

此外,Higress 提供了更灵活的自定义插件机制,相比 Kong 新增插件需要重新部署网关,Higress 可以动态扩展并热更新插件逻辑,对流量完全无损,而且也可以支持多种语言开发,不局限于 Lua 语言。

替代 Istio Ingress Gateway

时速云的服务网格产品是基于 Istio 搭建的,在 Istio 服务网格架构中一般由 Istio Ingress Gateway 来负责南北向的流量治理。因为 Higress 也能够支持 Istio API,所以我们也使用 Higress 统一了服务网格中的南北向流量管理。

Higress 本身并未对 Istio 有强依赖,因此默认关闭了 Istio 的 API 支持,需要通过 helm 参数配置开启该支持:

helm upgrade higress -n higress-system higress.io/higress --reuse-values --set global.enableIstioAPI=true

开启后,可以直接使用 Istio API 来管理 Higress 上的路由:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: devops
  namespace: higress-system
spec:
  selector:
    higress: higress-system-higress-gateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - devops.com
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: devops
  namespace: higress-system
spec:
  gateways:
  - higress-system/devops
  hosts:
  - devops.com
  http:
  - name: default
    route:
    - destination:
        host: devops.default.svc.cluster.local 

基于 Istio API,Higress 也支持 TCP 路由,这可以替代我们之前使用 HAProxy 来代理 MySql 等中间件的功能,例如:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: mysql 
  namespace: higress-system
spec:
  selector:
    higress: higress-system-higress-gateway
servers:
  - hosts:
    - '*'
   port:
     name: tcp
     number: 3306
     protocol: TCP
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: mysql
  namespace: higress-system
spec:
  gateways:
  - mysql
  hosts:
  - '*'
  tcp:
  - match:
    - port: 3306
    route:
    - destination:
         host: mysql
         port:
           number: 3306
         subset: v1

收益与展望

4.png

迁移后的架构基于 Higress 在产品层面做了各个技术栈的统一融合,增强了用户体验,具体收益如下:

  1. Higress 同时支持 K8s Ingress API 以及 Istio Gateway/VirtualService API,多个集群可以快速平滑升级
  2. 使用 Higress 进行了多种网关的统一,统一了流量入口/路由负载/安全认证的技术栈,实现了降本增效
  3. Higress 基于 Envoy,与东西向流量治理的 Sidecar 采用相同的技术栈,降低了开发人员扩展和维护的成本

最后,我们也对 Higress 未来发展提出几点期待:

  1. 希望能尽快支持 Gateway API,并支持 TCPRoute/UDPRoute,增强四层能力
  2. 期待社区的 Wasm 插件生态越来越丰富,提供更多开箱即用的能力
  3. 目前时速云会在一个 K8s 集群中部署多套 Higress 网关,希望能提供 Operator 机制来简化运维

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

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

相关文章

php 目录

简介 PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。 PHP代码的标签 数据类型 String(字符串) Integer(整型) Float(浮点型) Boolean(布尔型) Array(数组&…

knife4j(swagger2)实现spring security或shiro权限注解内容显示

在前后端交互时,某些接口需要指定权限才能访问,虽然可以在ApiOperation注解的notes参数上自己加上,但是每个接口都要手动写,有点儿。。。 基于此需求,我们可以使用swagger提供的OperationBuilderPlugin,通…

档案库房空气质量温湿度一体化平台解决方案

档案馆温湿度十防环境一体化解决平台方案 说明:档案库房温湿度一般要达到如下要求: 在选定温度、湿度后,每昼夜波动幅度温度≦2℃,湿度≦5%RH。 下表是档案库房温湿度要求列表: 档案库房温湿度要求 项 目 温湿度范…

企业给员工内部搭建知识库用什么好?

企业给员工内部搭建知识库是一种有效的知识管理方式,可以帮助企业更好地管理和共享知识资源,提高员工的工作效率和学习能力。本文将介绍企业搭建内部知识库的好处、搭建方法和注意事项等方面的内容,希望对企业进行知识管理的决策者有所帮助。…

青年就业创业数据分析:视频相关就业已成为数字生态就业的主要发展形式

哈喽大家好,随着网络的普及,利用数字科技与互联网技术,以青年群体为主要对象,数字生态行业催生出了一大批新兴的就业岗位。世界范围内,数字生态经济已成为不少国家经济发展的重要支撑,成为解决青年就业问题…

00后腾讯T3-2 晒出工资单:狠补了这个,真香…

最近一哥们跟我聊天装逼,说他最近从腾讯跳槽了,我问他跳出来拿了多少?哥们表示很得意,说跳槽到新公司一个月后发了工资,月入5万多,表示很满足!这样的高薪资着实让人羡慕,我猜这是税后…

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

文章目录 1. 实验节点规划表2. 安装Prometheus3. 安装node_exporter4. 配置prometheus.yml文件5. 安装Grafana6. 安装Altermanager监控告警 采用 "PrometheusGrafana"的开源监控系统,安装部署K8S集群监控平台。 并使用Altermanager告警插件,配…

AutoSAR系列讲解(入门篇)1.2-AutoSAR的概述

目录 一、到底什么是AutoSAR 1、大白话来讲 2、架构上来讲 应用软件层(APPL) 实时运行环境(RTE) 基础软件层(BSW) 3、工具链上来讲 二、AutoSAR的目标 一、到底什么是AutoSAR 1、大白话来讲 AUTOSAR 就是AUTomotive Open System ARchitecture的…

nginx页面优化及yum安装LNMP

文章目录 一.nginx优化1.版本号1.1查看版本号1.2修改版本号1.2.1修改配置文件1.2.2修改源码文件,重新编译安装 2.nginx的日志分割2.1 写日志分割的脚本2.2给脚本执行权限、执行2.3创建定时任务可以每个月固定分割一次 3.nginx的页面压缩3.1配置3.2验证 4.图片缓存4.…

FPGA通信—千兆网(RTL8211EG)硬件设计

一、硬件布局指南 创造一个低噪音、功率稳定的环境降低EMI/EMC的程度及其对RTL8211E/RTL8211EG的影响简化信号跟踪的路由任务 1.1 布局 RTL8211EG 必须尽可能靠近MAC(小于2.5英寸6.35cm)连接到RSET引脚的电阻器应靠近RTL8211E/RTL8211EG&#xff08…

jmeter接口测试教程以及接口测试流程详解

目录 前言: 一、Jmeter简介 二、Jmeter安装 三、设置Jmeter语言为中文环境 四、Jmeter主要元件 五、Jmeter元件的作用域和执行顺序 六、Jmeter进行接口测试流程 七、Jmeter进行接口测试流程步骤详解 前言: JMeter是一款功能强大的性能测试工具&…

【算法与数据结构】18、LeetCode四数之和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题的解法借助了【算法与数据结构】15、LeetCode三数之和的算法思想。首先我们进行排序,然…

用实例阐述回溯算法

目录 什么是回溯算法? 基本概念 示例认知 什么时候可以使用回溯算法? 回溯算法经典应用-无向图两节点之间路径 问题描述 回溯过程 代码示例 回溯算法经典应用-四皇后问题 问题描述 四皇后问题解决步骤 Step 1 Step 2 Step 3 Step 4 Step…

ICC2:polygon多边形操作

有时候想画一个环形或者不规则形状的metal shape/blockage,一遇到更新floorplan都要重新画,手工活如果能被脚本替代肯定是最优解,ICC2就提供这样的一组命令有效提高工作效率。 1.创建polygon 先看一下创建polygon的操作: create_poly_rect:提供一组或多组boundary坐标,工…

OpenCL编程指南-5.2数学函数

数学函数 OpenCL C实现了C99规范中描述的数学函数。使用这些数学函数的应用程序需要在代码中包含math.h头文件。这些数学函数可以作为OpenCL内核的内置函数。 对于表5-2和表5-3中的数学函数,我们将使用泛型类型名gentype指示这些函数可以取float、float2、float3、…

【AUTOSAR】CCP协议的代码分析与解读(二)----CCP协议格式和命令代码

CCP协议介绍 CCP的全称是CAN Calibration Protocol (CAN标定协议),是基于CAN总线的ECU标定协议规范。CCP协议遵从CAN2.0通信规范,支持11位标准与29位扩展标识符。 CCP通信方式 CCP协议采用主从通信方式,如上图所示,其中从设备是…

Visual modflow Flex地下水数值模拟教程

详情点击链接:Visual modflow Flex地下水数值模拟及参数优化、抽水实验设计与处理、复杂的饱和/非饱和地下水流分析 一,地下水数值软件的操作流程、建模步骤和所需资料处理 [1] Visual MODFLOW Flex特征[2] Visual MODFLOW Flex软件界面及模块 [3] 地…

详细讲解接口自动化攻略

目录 前言: 为什么要做接口自动化 问题在哪里 全靠参数化 接口间参数传递 测试数据参数化 测试断言 测试管理 导入测试用例 接口执行顺序 使用测试数据集 测试参数配置 运行结果&测试报告 测试套件 前言: 接口自动化是提高测试效率和…

ThreadX在gcc下的移植

本文介绍ThreadX在arm-none-eabi-gcc编译器下的移植方法。 1、ThreadX介绍和源码获取 threadx的介绍和源码获取请参考之前的博文:ThreadX在mdk(AC5)中的移植。 2、准备工作 本篇主要介绍threadx在corex-m7上的移植,编译器使用arm-none-eabi-gcc。 在…