2023年8月10日 · 阅读需 20 分钟


功能划分

这里我们先大概梳理一下Higress工程各目录的职责划分

目录功能说明
apiHigress所涉及操作的kubernetes api
clientHigress集成kubernetes的client进行资源监听与下发
cmd命令行参数解析等处理代码
docker构建Higress docker image的描述文件
docs文档内容
envoyenvoy源码内容
helm使用helm安装Higress等配置
istioistio源码内容
pkg/ingressIngress 资源转换为 Istio 资源等相关代码
pkg/bootstrap包括启动 gRPC/xDS/HTTP server 等的代码
pluginsHigress 插件 sdk,以及官方内置插件代码
registry实现对接多种注册中心进行服务发现的代码
samples一些常见Pod、Service的yaml示例
test单元测试及e2e测试用例
tools编译、构建、image分发以及本地测试环境搭建等脚本

研发指引

CRD模型定义

进入api目录

higress/api

根据所要新建CRD的api类型,选择相对于的子目录,比如

networking/v1

编写CRD模型

比如我这里想定义一个http_2_rpc的CRD资源

http_2_rpc.proto

  1. // Copyright (c) 2022 Alibaba Group Holding Ltd.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the “License”);
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an “AS IS” BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. syntax = proto3”;
  14. import google/api/field_behavior.proto”;
  15. // $schema: higress.networking.v1.Http2Rpc
  16. // $title: Http2Rpc
  17. // $description: Configuration affecting service discovery from multi registries
  18. // $mode: none
  19. package higress.networking.v1;
  20. option go_package = github.com/alibaba/higress/api/networking/v1”;
  21. // <!— crd generation tags
  22. // +cue-gen:Http2Rpc:groupName:networking.higress.io
  23. // +cue-gen:Http2Rpc:version:v1
  24. // +cue-gen:Http2Rpc:storageVersion
  25. // +cue-gen:Http2Rpc:annotations:helm.sh/resource-policy=keep
  26. // +cue-gen:Http2Rpc:subresource:status
  27. // +cue-gen:Http2Rpc:scope:Namespaced
  28. // +cue-gen:Http2Rpc:resource:categories=higress-io,plural=http2rpcs
  29. // +cue-gen:Http2Rpc:preserveUnknownFields:false
  30. // —>
  31. //
  32. // <!— go code generation tags
  33. // +kubetype-gen
  34. // +kubetype-gen:groupVersion=networking.higress.io/v1
  35. // +genclient
  36. // +k8s:deepcopy-gen=true
  37. // —>
  38. message Http2Rpc {
  39. oneof destination {
  40. DubboService dubbo = 1;
  41. GrpcService grpc = 2;
  42. }
  43. }
  44. message DubboService {
  45. string service = 1 [(google.api.field_behavior) = REQUIRED];
  46. string version = 2 [(google.api.field_behavior) = REQUIRED];
  47. string group = 3 [(google.api.field_behavior) = OPTIONAL];
  48. repeated Method methods = 4 [(google.api.field_behavior) = REQUIRED];
  49. }
  50. message Method {
  51. string service_method = 1 [(google.api.field_behavior) = REQUIRED];
  52. string headers_attach = 2 [(google.api.field_behavior) = OPTIONAL];
  53. string http_path = 3 [(google.api.field_behavior) = REQUIRED];
  54. repeated string http_methods = 4 [(google.api.field_behavior) = REQUIRED];
  55. repeated Param params = 5;
  56. }
  57. message Param {
  58. string param_source = 1 [(google.api.field_behavior) = REQUIRED];
  59. string param_key = 2 [(google.api.field_behavior) = REQUIRED];
  60. string param_type = 3 [(google.api.field_behavior) = REQUIRED];
  61. }
  62. message GrpcService {
  63. oneof destination {
  64. string proto_descriptor_str = 1;
  65. string proto_descriptor_file_path = 2;
  66. }
  67. repeated string services = 3 [(google.api.field_behavior) = REQUIRED];
  68. }

2、代码生成

这里依赖kubernetes code generators生成相关kubetype、client、informer、lister等代码。 在higress根目录执行以下命令,

GENERATE_API=1 make gen-client

执行上述命令后会生成,如下代码

kubernetes customresuource定义

通过将这个定义注册给kubernetes集群,然后就能创建对应的CRD资源实例。 kubernetes-customresuource-definition.png

CRD对应资源对象Go语言的定义及操作方法

Hingress(IngressConfig)初始化及运行阶段会使用这里的api模型。 higress-api.png

kubernetes client apis

Hingress集成kubernetes client与kube-apiserver交互时会使用这里的模型对象。 kubernetes-client-api.png

kubernetes client apis operate

kubernetes-client-api-operate.png

kubernetes client informer

kubernetes-client-informer.png

kubernetes client informer lister

kubernetes-client-informer-lister.png

3、集成 Controller

这里主要是在ingress_config,添加自定义CRD Resource的引用对象,并且通过informer机制监听CRD实例的变化,然后实现相关业务逻辑,比如生成istio EnvoyFilter等

higress/pkg/ingress/config/ingress_config.go

定义相关属性

  1. //异步线程启动后,可以监听CRD-http2rpc资源变化事件
  2. http2rpcController http2rpc.Http2RpcController
  3. //资源变化事件处理时通过Lister获取发送变化的CRD实例对象
  4. http2rpcLister netlisterv1.Http2RpcLister
  5. //存储全量的http2rpcs资源对象,以便在其他事件流程中消费
  6. http2rpcs map[string]*higressv1.Http2Rpc

ingress-config.png

在higress启动阶段初始化上述变量

这里就会引用自动化生成的一些代码,进行Controller的创建及事件绑定。 ingress-config-initial.png

实现CRD变更事件处理逻辑

ingress-config-event.png

扩展阅读

Kubernetes Controller 机制详解(一)

Kubernetes Informer机制