Kuma 将使用的对象抽象为各种资源(Resource),如 Zone,Ingress,Dataplain,RateLimit 等,由资源管理器(Resource Manager)对资源存储(Resource Store)进行增删改查等操作。
Resource Store 向上屏蔽了底层存储的差异,在 Kuma 中使用两种存储模式,kubernetes API Server 和 PostgreSQL 数据库。而 Resource Manager 屏蔽了对于各个资源操作的差异。
Resource Store
接口定义
ResourceStore 接口用于定义资源的底层存储,ResourceStore 需要实现 Create、Update、Delete、Get、List 操作。
1 | type ResourceStore interface { |
接口实现
在 Kuma 中,ResourceStore 接口由 k8s、memory、postgres、remote 实现。其中:
- K8s:在 Kubernetes 模式下,以 Kubernetes API Server 存储资源。
- Postgres:在 Universal 模式下,以 PostgreSQL 作为底层数据库存储数据。
- Memory:内存数据库,用于测试。
- Remote:为 kuma-ctl 做资源存储,负责以 HTTP Restful API 的方式操作 kuma-cp。
1 | ├── k8s |
CustomizableResourceStore
Customizable Resource Store 为某一种具体的资源提供定制化的 Resource Store:
- Customize 方法:为 model.ReourceType 类型的资源指定资源存储器。
- ResourceStore 方法:返回 model.ResourceType 类型的资源存储器,如果没有该类型,则会返回默认的资源存储器。
1 | // ResourceStoreWrapper is a function that takes a ResourceStore and returns a wrapped ResourceStore. |
Resource Manager
接口定义
Resource Manager 用于对资源(Zone、Dataplain 等)进行操作,定义的方法与 Resource Store 差不多,都是增删改查。
1 | type ReadOnlyResourceManager interface { |
CustomizableResourceManager
Customizable Resource Manager 为某一种具体的资源提供定制化的 Resource Manager:
- Customize 方法:为 model.ReourceType 类型的资源指定资源管理器。
- ResourceManager 方法:返回 model.ResourceType 类型的资源管理器,如果没有该类型,则会返回默认的资源管理器。
1 | type ResourceManagerWrapper = func(delegate ResourceManager) ResourceManager |
初始化
在 kuma-cp 初始化 Resource Manager 时,会为每一种资源指定一种资源管理器。
1 | func initializeResourceManager(cfg kuma_cp.Config, builder *core_runtime.Builder) error { |
Cached Manager
Cached Manager 实现了只读资源管理器 Read Only Resource Manager,为对资源的 Get 和 List 操作进行缓存(有过期时间)。
- delegate:底层 ReadOnlyResourceManager,若缓存未命中则会从底层只读资源管理器中读取数据,并记录在缓存中。
- cache:cached manager 的核心数据结构,用于缓存查询结果。key 为
<op>:<resource_type>:<ops.hashcode(resource_name+resource_mesh)>:tenantID
。
1 | cacheKey := fmt.Sprintf("GET:%s:%s:%s", res.Descriptor().Name, opts.HashCode(), tenantID) |
- mutexes:为每一个 key 单独加锁,保证每一个 k-v 都互斥访问。
1 | // Cached version of the ReadOnlyResourceManager designed to be used only for use cases of eventual consistency. |