|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
|
这是尚未发布的文档。 Admission Controller 1.34-dev. |
WASI
WebAssembly系统接口(WASI)是一个WebAssembly标准,提供一组接口,允许在浏览器外执行WebAssembly。
|
编写常规策略的作者不应使用普通的WASI系统接口来编写策略。 此页面适用于SUSE Security Admission Controller维护者或希望在前沿WASM平台上进行实验的低级策略作者。 |
使用WASI,您可以拥有一个与系统原语交互的WebAssembly模块,如STDOUT、STDERR、STDIN、环境变量等。
许多用于编译Admission Controller策略的编译器生成针对WASI接口的WebAssembly模块。
然而,Admission Controller策略使用https://github.com/wapc[waPC]项目在策略与策略运行时(kwctl`或`policy-server)之间实现双向通信。Admission Controller通信协议的使用在这里进行了描述。
在某些特殊情况下,waPC项目尚不可用。 在这些情况下,您可以使用WASI提供的接口编写策略。
|
Admission Controller支持从Admission Controller 1.7.0版本开始的WASI策略。 |
使用案例
编写"普通WASI"策略的唯一原因是当您无法使用waPC通信机制时。
目前(截至2023年6月),这样做的唯一好理由是使用官方的Go编译器生成WebAssembly模块。
从1.21版本开始,官方的Go编译器能够生成针对WASI接口的WebAssembly模块。 然而,这些模块尚不能向WebAssembly运行时导出函数。 这个限制,由https://github.com/golang/go/issues/42372[这个专门的问题]跟踪,阻碍了waPC协议的采用。
Admission Controller项目团队建议您使用TinyGo编译器编写Admission Controller Go策略,如这里所述。
然而,某些复杂的Go代码库无法使用TinyGo编译器进行编译。 这包括例如像https://github.com/google/cel-go[CEL-go]或https://github.com/kyverno/kyverno/[Kyverno]这样的代码库。 在这种情况下,使用官方的Go编译器可以提供帮助。
通信协议
本节描述如何编写一个普通的WASI策略。
您需要将代码编写为常规CLI程序。 该程序必须接受以下子命令:
-
validate:此命令由策略引擎调用以评估入场请求。 -
validate-settings:此命令由策略引擎调用以验证策略设置。
在这两种情况下,要验证的数据通过STDIN提供。 策略必须通过STDOUT提供答案。 您可以使用STDERR进行调试或错误消息。
Validation
请求的验证发生在使用`validate`子命令调用策略CLI程序时。
STDIN必须包含描述`ValidationRequest`对象的JSON文档。 策略必须向STDOUT写入包含`ValidationResponse`对象的JSON文档。
`ValidationRequest`和`ValidationResponse`对象的描述见这里。
上下文感知
目前仅通过Go SDK支持。Go SDK像往常一样公开上下文感知能力,更多信息请见这里。
作为WASI Go上下文感知策略的示例,请参见https://github.com/kubewarden/go-wasi-context-aware-test-policy[go-wasi-context-aware-test-policy]。
设置验证
该策略必须提供一个名为`validate-settings`的子命令。 该命令用于验证用户提供的设置。
程序必须在STDIN接收一个包含用户提供的设置的JSON对象。 然后它验证这些设置并向STDOUT写入一个`SettingsValidationResponse`对象。
`SettingsValidationResponse`的格式和设置验证过程的描述见这里。
模板项目
这个 GitHub 储存库 包含一个基于 Go 的使用 WASI 协议的策略模板。