Autor: Wang Jinshan, Microservice-Architekt der Technologieabteilung von Beijing Yunsichangxiang Technology Co., Ltd., verantwortlich für die Forschung und Entwicklung des API-Gateways und Service-Grids des Unternehmens
Einführung in die Speed-Cloud
Speed Cloud wurde im Oktober 2014 gegründet und hat sich zum Ziel gesetzt, Unternehmen bei der digitalen Transformation durch Cloud-native-Technologie zu unterstützen. Das Unternehmen verfügt über zwei Kernproduktsysteme: die Cloud-native Anwendungsplattform TCAP und die Cloud-native Datenplattform KubeData. Zu den Produkten gehört Cloud-native DevOps, Container-Cloud-PaaS und dazwischenliegende Softwaredienste, Edge-Computing, Microservice-Governance, Service Mesh, API-Gateway usw.
Nachfragehintergrund
In der PaaS-Plattform von Speed Cloud gibt es verschiedene Gateway-Software:
- Traffic-Gateway basierend auf HAProxy und Nginx Ingress
- Spring Cloud Gateway des Spring Cloud Microservice Systems
- Kong als API-Gateway
- Istio Ingress Gateway unter dem Service-Mesh-System
Obwohl die oben genannten Produkte jeweils ihre eigenen Anwendungsszenarien haben, besteht das Problem darin, dass die Technologie-Stacks unterschiedlich sind. Nach der Einführung mehrerer Tools für unterschiedliche Anforderungen wird dies zu einem starken Anstieg der Wartungskosten führen. Daher ist es unser Ziel, ein Tool zu finden, das alle Anforderungen erfüllt und einen einheitlichen Technologie-Stack nutzt. Higress hat genau unsere Bedürfnisse erfüllt.
Higress-Lösung
Alternative zu Nginx Ingress
Higress kann als Ingress-Eintrittsgateway des K8s-Clusters verwendet werden, ist mit einer großen Anzahl von K8s-Nginx-Ingress-Annotationen kompatibel und kann schnell und reibungslos von K8s-Nginx-Ingress zu Higress migrieren. Das Folgende ist ein Beispiel für die Implementierung von REST-Routing, das auf den eigenen Annotationen von Higress basiert und mit den Pfaden zum Umschreiben von Nginx Ingress-Annotationen kompatibel ist:
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
Und die Lua-Codeleistung von Nginx Ingress ist relativ schlecht, und die Leistung von Higress im Vergleich zu Nginx Ingress ist erheblich verbessert, wie in der folgenden Abbildung dargestellt:
Alternative zu Spring Cloud Gateway
Unter dem Spring Cloud-Microservice-System muss es als Microservice-Gateway mit der Microservice-Registrierung verbunden werden, um die Serviceerkennung zu realisieren. Higress stellt CRD McpBridge bereit, das problemlos mit verschiedenen Registrierungszentren verbunden werden kann. Das von uns verwendete Spring Cloud-Registrierungszentrum ist Nacos und die Konfiguration von McpBridge ist wie folgt:
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
Als Nächstes konfigurieren Sie Ingress so, dass es an das auf Nacos registrierte Service-Benutzercenter weitergeleitet wird:
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
Auf diese Weise können Spring Cloud-Microservices ohne Änderungen mit dem Higress-Gateway verbunden werden. Im Vergleich zu herkömmlichen Java-Microservice-Gateways wie Spring Cloud Gateway/Zuul ist die Leistung von Higress mehr als doppelt so hoch, was die Ressourcenkosten erheblich senken kann.
Kong ersetzen
Das API-Gateway-Produkt von Speed Cloud wird verwendet, um Unternehmen und Entwicklern dabei zu helfen, die Verwaltung des gesamten Lebenszyklus der API-Erstellung, -Wartung, -Veröffentlichung, -Überwachung und -Alarmierung abzuschließen. Über das API-Gateway wird der Back-End-Dienst in Form einer API geöffnet und allen Parteien zur Verfügung gestellt. Authentifizierungs- und Authentifizierungsfunktionen sind die Schlüsselfunktionen des API-Gateways. Unser API-Gateway wurde ursprünglich auf Basis von Kong erstellt und verwendet hauptsächlich die Plug-Ins Key Auth/Basic Auth/JWT Auth/HMAC Auth von Kong. Higress bietet auch diese Plug-In-Funktionen :
Am Beispiel von Key Auth kann das von Higress bereitgestellte WasmPlugin CRD wie folgt konfiguriert werden:
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
Initiieren Sie eine Authentifizierungsanforderung, da xxx.exmaple.com nur den Zugriff von Consumer2 autorisiert, sodass der folgende Curl-Befehl 403 zurückgibt:
curl http://xxx.example.com/test -H 'x-api-key: 2bda943c-xxxx-xxxx-xxxx-00163e1250b5'
Darüber hinaus bietet Higress einen flexibleren benutzerdefinierten Plug-In-Mechanismus. Im Vergleich zu den neuen Plug-Ins von Kong, bei denen das Gateway erneut bereitgestellt werden muss, kann Higress die Plug-In-Logik dynamisch erweitern und im laufenden Betrieb aktualisieren, was völlig zerstörungsfrei ist Datenverkehr und kann auch die mehrsprachige Entwicklung ohne Einschränkung unterstützen. in der Lua-Sprache.
Alternative zum Istio Ingress Gateway
Das Service-Grid-Produkt von Speed Cloud basiert auf Istio. In der Istio-Service-Grid-Architektur ist das Istio Ingress Gateway im Allgemeinen für das Nord-Süd-Verkehrsmanagement verantwortlich. Da Higress auch die Istio-API unterstützen kann, verwenden wir Higress auch, um das Nord-Süd-Verkehrsmanagement im Service Mesh zu vereinheitlichen.
Higress selbst ist nicht stark von Istio abhängig, daher ist die API-Unterstützung von Istio standardmäßig deaktiviert, was über die Helmparameterkonfiguration aktiviert werden muss:
helm upgrade higress -n higress-system higress.io/higress --reuse-values --set global.enableIstioAPI=true
Nach der Aktivierung können Sie die Istio-API direkt verwenden, um Routen auf Higress zu verwalten:
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
Basierend auf der Istio-API unterstützt Higress auch TCP-Routing, das unsere bisherige Verwendung von HAProxy zum Proxy von MySql und anderen Middleware-Funktionen ersetzen kann, zum Beispiel:
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
Ergebnis und Ausblick
Die migrierte Architektur basiert auf der Higress-Integration verschiedener Technologie-Stacks auf Produktebene, was das Benutzererlebnis verbessert. Die spezifischen Vorteile sind wie folgt:
- Higress unterstützt gleichzeitig die K8s Ingress API und die Istio Gateway/VirtualService API, und mehrere Cluster können schnell und reibungslos aktualisiert werden
- Verwenden Sie Higress, um mehrere Gateways zu vereinheitlichen, den Technologie-Stack für Verkehrseintritt/Routing-Last/Sicherheitsauthentifizierung zu vereinheitlichen und Kostensenkungen und Effizienzsteigerungen zu realisieren
- Higress basiert auf Envoy und nutzt den gleichen Technologie-Stack wie Sidecar für das Ost-West-Verkehrsmanagement, was die Erweiterungs- und Wartungskosten für Entwickler senkt
Abschließend äußern wir auch einige Erwartungen an die zukünftige Entwicklung von Higress:
- Ich hoffe, die Gateway-API so schnell wie möglich zu unterstützen und TCPRoute/UDPRoute zu unterstützen, um die Vierschichtfähigkeit zu verbessern
- Wir freuen uns darauf, dass die Wasm-Plug-in-Ökologie der Community immer zahlreicher wird und mehr sofort einsatzbereite Funktionen bietet
- Derzeit wird Speed Cloud mehrere Sätze von Higress-Gateways in einem K8s-Cluster bereitstellen, in der Hoffnung, einen Betreibermechanismus zur Vereinfachung von Betrieb und Wartung bereitzustellen