如何使用 Higress Admin SDK 进行配置管理
发布时间 2024-02-08
1. 背景
Higress 一个遵循开源 Ingress/Gateway API 标准,提供流量调度、服务治理、安全防护三合一的高集成、易使用、易扩展、热更新的下一代云原生网关。而配置管理网关的运维工作中扮演者重要的角色。如何让配置管理自动化,尤其是与其他的运维系统进行对接,就成为了一个非常迫切的需求。本文将介绍如何使用 Higress Admin SDK 来管理 Higress 系统内的各类配置。希望能够对存在此类需求的朋友有所帮助。
2. Higress Admin SDK
Higress Admin SDK 脱胎于 Higress Console。起初,它是作为 Higress Console 的一部分,为前端界面提供实际的功能支持。后来考虑到对接外部系统等需求,我们将配置管理的部分剥离出来,形成一个独立的逻辑组件,便于各个系统进行对接。目前支持服务来源管理、服务管理、路由管理、域名管理、证书管理、插件管理等功能。
Higress Admin SDK 现在只提供 Java 版本,且要求 JDK 版本不低于 17。
3. 开发实操
3.1 环境准备
这里我们以本地基于 Kind 搭建的 K8s 集群作为实验环境。所以首先,请大家参考这篇文档在本地完成 K8s 集群的搭建和 Higress 的安装。
然后,我们需要创建一个测试用的 K8s 服务。大家可以将下方的 YAML 保存为 test.yaml,然后执行 kubectl apply -f test.yaml 命令在 K8s 中创建对应的资源。
kind: PodapiVersion: v1metadata: name: higress-demo-app namespace: default labels: app: higress-demospec: containers: - name: higress-demo-app image: mendhak/http-https-echo:29---kind: ServiceapiVersion: v1metadata: name: higress-demo-service namespace: defaultspec: selector: app: higress-demo ports: - port: 80803.2 代码编写
这里的目标是创建一个路由,使 http://www.test.com/ 这个 URL 指向我们刚刚创建的 higress-demo-service。
第一步:配置依赖
根据项目所使用的构建工具来添加 Higress Admin SDK 依赖:
<dependency> <groupId>io.higress.api</groupId> <artifactId>higress-admin-sdk</artifactId> <version>0.0.2</version></dependency>implementation 'io.higress.api:higress-admin-sdk:0.0.2'第二步:创建 Higress SDK 实例
String kubeConfigFile = Paths.get(System.getProperty("user.home"), "/.kube/config").toString();HigressServiceConfig config = HigressServiceConfig.builder().withKubeConfigPath(kubeConfigFile).build();HigressServiceProvider provider = HigressServiceProvider.create(config);这里我们使用的是 K8s 集群外的配置方式,所以需要设置 kubeConfig 文件的路径,以便 SDK 操作 K8s 内的各类资源。
第二步:创建域名
这里我们使用 SDK 中的 DomainService 来创建一个 www.test.com 域名,并将该域名设置为只开放 HTTP 访问。
Domain domain = Domain.builder().name("www.test.com").enableHttps(Domain.EnableHttps.OFF).build();provider.domainService().add(domain);第三步:创建路由
这里我们使用 SDK 中的 DomainService 来创建一个名为 higress-demo 的路由。路由绑定 www.test.com 域名,匹配所有以 / 开头的请求,并将请求转发至 higress-demo-service.default.svc.cluster.local 服务的 8080 端口。
Route route = Route.builder() .name("higress-demo") .domains(Collections.singletonList("www.test.com")) .path(RoutePredicate.builder() .matchType(RoutePredicateTypeEnum.PRE.name()) .matchValue("/") .build()) .services(Collections.singletonList( UpstreamService.builder() .name("higress-demo-service.default.svc.cluster.local:8080") .build() )).build();provider.routeService().add(route);3.3 测试验证
执行编写好的代码:确认一切正常。然后在 Shell 中执行以下命令,检查请求路由情况。
curl -svk http://localhost/ -H "Host: www.test.com"能够以 JSON 格式返回请求的详细信息就说明路由配置已经可以正常工作。
{ "path": "/", "headers": { "host": "www.test.com", "user-agent": "curl/8.4.0", "accept": "*/*", "x-forwarded-for": "10.42.0.230", "x-forwarded-proto": "http", "x-envoy-internal": "true", "x-request-id": "4a3db96b-c46c-4c8a-a60f-a513f258736d", "x-envoy-decorator-operation": "higress-demo-service.default.svc.cluster.local:8080/*", "x-envoy-attempt-count": "1", "x-b3-traceid": "a426d189c027371957f008c2cb2e9e8f", "x-b3-spanid": "57f008c2cb2e9e8f", "x-b3-sampled": "0", "req-start-time": "1707363093608", "original-host": "www.test.com" }, "method": "GET", "body": "", "fresh": false, "hostname": "www.test.com", "ip": "10.42.0.230", "ips": [ "10.42.0.230" ], "protocol": "http", "query": {}, "subdomains": [ "www" ], "xhr": false, "os": { "hostname": "higress-demo-app" }, "connection": {}}4. 总结
目前 Higress Admin SDK 支持的功能还比较简单。未来社区也会在进一步着力增强 Higress 的治理侧功能,SDK 的能力也会不断完善。大家对 SDK 和 Console 有任何疑问和建议,都欢迎在 GitHub 上提出。感谢大家的支持!
以上实操过程的项目代码可以在这里下载:下载链接