Higress 社区周会记要(2022/11/26)_Blog-HigressOfficial Website
铭师堂的云原生升级实践Know more

Higress 社区周会记要(2022/11/26)

Release Time 2022-11-29


Higress 是遵循开源 Ingress/Gateway API 标准,提供流量调度、服务治理、安全防护三合一的高集成、易使用、易扩展、热更新的下一代云原生网关。

本次(2022/11/26)是 Higress 社区第一次周会,参会成员 50+,会议过程进行了录屏,已经发布在 Higress 开发者钉钉群,可以搜索钉群号(30565000871)入群。下面是会议过程的记录:

一、分享 Higress 基于 Istio/Envoy 架构的技术实现原理

Listener 和 Cluster 是实现网关请求转发能力的最小化模型,Envoy 可以基于 xDS 协议从 gRPC server 获取 LIstener 和 Cluster 的配置,实现这两部分配置独立更新互不影响,如 Cluster 重建不影响 Listener 上客户端连接断开。


Listener 中的证书、路由、过滤器都可以实现基于 xDS 协议独立更新,Cluster 基于 EDS 类型实现后端节点独立更新。这是 Envoy 和 Nginx 最明显的区别:

  • Nginx: 基于 nginx.conf,整个配置跟 worker 进程的生命周期绑定,任何配置变更 reload,进程都要重建,跟 downstream 和 upstream 的连接都会断开
  • **Envoy:**举例来说,Listener 的生命周期只跟 Listener 的配置绑定,路由的生命周期只跟路由的配置绑定,并且都可以基于 xDS 协议独立地热更新

Istio 抽象了 API 用于生成各类 xDS 配置,下图虚线箭头是 Istio API 和 xDS 配置间较直接的映射关系。Istio API 的配置来源可以是 K8s CRD,也可以是基于 xDS 协议(MCP-over-xDS)的 gRPC Server。

Higress 实现了将 K8s Ingress 转换为 Istio API 的逻辑,并通过上述 gRPC Server 向 Istio 提供配置。


以通过 Ingress 配置跨域访问为例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# higress 兼容了 nginx-ingress 的注解
nginx.ingress.kubernetes.io/enable-cors: "true"
name: foo
namespace: default
spec:
rules:
- http:
paths:
- backend:
service:
name: foo-service
port:
number: 5678
path: /foo
pathType: Exact

将被转换为:

---
kind: Gateway
apiVersion: networking.istio.io/v1alpha3
metadata:
name: istio-autogenerated-k8s-ingress-global
namespace: higress-system
spec:
selector:
higress: higress-system-higress-gateway
servers:
- hosts:
- "*"
port:
name: http-80-ingress-global
number: 80
protocol: HTTP
---
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
name: default-global
namespace: higress-system
spec:
gateways:
- higress-system/istio-autogenerated-k8s-ingress-global
hosts:
- "*"
http:
- match:
- uri:
exact: "/foo"
name: default/foo
route:
- destination:
host: foo-service.default.svc.cluster.local
port:
number: 5678
weight: 100
corsPolicy:
allowCredentials: true
allowHeaders:
- DNT
- X-CustomHeader
- Keep-Alive
- User-Agent
- X-Requested-With
- If-Modified-Since
- Cache-Control
- Content-Type
- Authorization
allowMethods:
- GET
- PUT
- POST
- DELETE
- PATCH
- OPTIONS
allowOrigins:
- regex: ".*"
maxAge: 1728000s

从这个例子可以看到,Ingress 最大的优势就是简单,只用一个注解就实现了跨域这个路由策略。

Higress 也支持 Ingress 和 Istio API 进行混用,对于 Ingress 无法满足的需求场景,也可以选择使用 Istio API (K8s CRD)来实现。Higress 会按照以 Istio API 创建的配置优先为原则,在生成最终的路由配置时进行合并。

二、开源社区最新进展同步

感谢张海彬(@NameHaibinZhang)提供了一个名为 McpBridge 的 API 实现,可以用于对接 Nacos/ZK 等注册中心实现服务发现。并且是直接基于 Nacos/ZK 的 go client 获取服务 ip,无需 Nacos/ZK 等支持 Istio MCP 协议。这也是 McpBridge 这个名字的由来。


配置方式为创建 McpBridge 资源,指定注册中心的地址和类型:

apiVersion: networking.higress.io/v1kind: McpBridgemetadata: name: default namespace: higress-systemspec: registries: - domain: 127.0.0.1 nacosGroups: - DEFAULT_GROUP nacosNamespace: beeae72f-xxxx-xxxx-xxxx-d484cc4d7a2d name: my-nacos-server port: 8848 type: nacos

然后在 Ingress 中通过 backend.resource 引用这个 McpBridge 资源,并通过 higress.io/destination 注解指定目标服务地址,下面这个 Nacos 类型的服务,其服务地址格式为:服务名.服务分组.命名空间.nacos

apiVersion: networking.k8s.io/v1kind: Ingressmetadata: annotations: higress.io/destination: "sc.DEFAULT-GROUP.beeae72f-xxxx-xxxx-xxxx-d484cc4d7a2d.nacos" name: foo namespace: defaultspec: rules: - http: paths: - backend: resource: apiGroup: networking.higress.io/v1 kind: McpBridge name: default path: /foo pathType: Exact

(备注:这个配置方式目前暂未完全定稿,欢迎小伙伴参与讨论,完整的使用文档将在这部分代码正式 release 之后提供)

三、支持非 K8s 部署的架构探讨

最后探讨了社区小伙伴最为关心的,如何支持非 K8s 场景使用的问题。实现的方式如下图所示,Higress 会借鉴 Istio 对于配置来源的抽象方式,支持从 Nacos/Etcd 等配置中心获取 Ingress/Gateway 等 API。这部分实现将作为 Higress 社区后续的重点工作进行推进。欢迎有兴趣的小伙伴一起参与共建。


**Higress 开源贡献小组正在火热招募贡献者。**如果您有时间,有热情,有意愿,欢迎联系社区加入开源贡献小组,一起共同完善 Higress,一起主导下一代云原生网关的设计和实现。
社区官网(点击“阅读原文”跳转): https://higress.io
社区开发者群(钉钉群):30565000871
微信交流群: