关于阿里云:时速云使用-Higress-替换-Ngnix-Ingress-Spring-Cloud-Gateway-的生产实践

128次阅读

共计 4757 个字符,预计需要花费 12 分钟才能阅读完成。

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

时速云介绍

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

需要背景

时速云的 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 的性能晋升很大,如下图所示:

代替 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 也都提供了这些插件能力:

以 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

收益与瞻望

迁徙后的架构基于 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 机制来简化运维

正文完
 0