文章目录
Bundle
是OPA
管理policy
和data
的一种方式。
OPA
实现的轻量级策略引擎,一开始就是为了云原生环境的service
提供解耦的策略服务,分布式是必然要考虑的问题。
在Bundle api
的设计中,其实就全面考虑并体现了在分布式应用中如何更好的解耦策略引擎的管理。
比如:
- 如何做集中配置管理
- 如何动态更新策略
- 如何监控策略引擎节点的状态以及决策日志收集
有了这些功能,再加上其高效的策略描述语言Rego
,OPA
才真正称得上是云原生时代的通用策略引擎。
本文将带大家简单梳理一遍Bundle
的组织方式、管理api、及监控方式。
考虑到一次性过完不易消化,文末会提供一个直接可实操的docker-compose
版本的demo
,将全面覆盖本文细节
建议大家看完本文,本机运行去体验一下,会有更直观的理解。
Bundle 文件组织方式
下面我们先来看下Bundle
的文件组织方式
在Bundle
下的data
,只能被识别data.json
和data.yaml
的文件, 而其上边的目录会作为其数据前缀
如下边roles/data.json
(bundle/example
作为一个bundle
),会将data.json
的数据挂在data.roles
节点下
1 | cd bundle/example |
其中.manifest
文件是Bundle
的一个可选的元数据(metadata
)配置文件
1 | cat .manifest |
它的作用是声明Bundle
的版本revision
及其下的路径前缀(roots: path prefix
)
roots
不仅规定了Bundle
应该有的路径前缀;在用Bundle api
(后边会提到)更新文件时,也会按其规定的路径前缀来更新文件
然后bundle
也支持tarball
格式加载到server
例如opa run -b
的方式指定Bundle
1 | cd bundle/example |
Tips: 关于如何在交互式命令行里传递
input
。
之前非bundle使用opa run quick-start repl.input:quick-start/input.json
到bundle格式时,就需要构建repl/input/data.json
文件格式作为输入
具体可以用时参考文档bundle-file-format
opa server api
在了解Bundle
支持的管理api前,我们先看下opa server api
主要api如下:
type | 用途 |
---|---|
Data api | 查询文档(能被输出的规则、虚拟文档等) |
Policy api | 查询策略 |
Query api | 执行命令 |
Compile api | 执行部分查询计算(partial evaluate query ) |
Health api | 健康检查 |
Metric api | 指标统计(prometheus 格式) |
下面我们以文档查询(Data
)api为例尝试下:
我们先用之前quick-start
的代码起一个opa sever
1 | opa run --server quick-start |
(注意:opa server api
的路径前缀为/v1/
, 对应的,查询api路径前缀为/v1/data/
,)
1 | 构造input输出请求 |
Tips:不指定路径时,默认路径为
data.system.main
,这时输入不需要包裹在input
key内。
也可以使用--set
和--set-file
可以覆盖配置文件中的配置opa run --server --set=default_decision=example_rbac/allow/ quick-start
curl -s http://0.0.0.0:8181/ -d @quick-start/input.json
而且Data查询也支持组合参数如explain
,metrics
,provenance
等,详细查看文档,这里就不展开了。
Bundle 管理api
Bundle
为了在分布式系统中更好的展现OPA的威力,提供了四种Api:
- Bundles
用于策略分发,可以定时轮训更新Bundle
包 - Decision Logs
定期上传日志包,支持按大小分片,开启后会有日志id,决策日志可追溯 - Status
定期上传服务状态,包含metrics
等信息 - Discovery
服务发现,可以用于集中管理OPA
的Bundle
配置,各个节点下载定期同步配置后,按配置去更新Bundle
如下图:
这里举个带注释Bundle
的四种接口配置例子
(先扫一遍留个印象,具体使用时查看文档,后边会提供可实操的代码)
1 | # opa/config-bundle.yaml |
Bundle 集成方式
这里我们简单过下集成方式
opa server 方式
运行方式很简单如下:
1 | opa run -s -a 0.0.0.0:8181 -c opa/config-bundle.yaml |
运行后,opa server会根据配置自动拉取Bundle
包:rbac.tar.gz
下载成功后启动策略服务。同时定期上传决策日志和状态给服务端(即:demo-server:8888
)
go lib 方式
使用lib github.com/open-policy-agent/opa/rego
集成
关键代码举例如下:
1 | // 构建查询,PrepareForEval可重用 |
具体组织方式官方推荐的有下边集中式和分布式这两种:
推荐感兴趣的同学再去看下官方go集成的demo: example-api-authz-go
Bundle 的监控
opa server 支持metrics
, 而且是prometheus
格式的
所以配合prometheus
可以直接进行对其数据指标的监控,如下图:
再配合grafana
的dashbord
可以更好的展示metrics
数据,如下图:
Bundle in action
上边说这么多,不实际试一下怎么知道Bundle
究竟如何呢?
这里提供一个docker-compose
版的demo给大家去本地验证尝试
里边提供了三种Bundle
版本:
- opa-bundle
- opa-discovery
- demo-sever (go lib集成)
也提供了两种版本的monitor
- slim version
- advance version
里边有详细的操作文档,有问题可以在Repo里提issue
这个Repo包含了这一系列的OPA
教程,欢迎感兴趣的同学 star
关注!
同时我在知乎也建了一个OPA技术圈,也欢迎大家参与讨论。
好了,到此,OPA
的基本教程就结束了。后边再抽空结合官方的例子写些实战教程吧。
最后附上一个Repo中验证Bundle的过程,大家也可以从这里开始尝试哦
如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2020/04/16/opa-bundle.html