|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
|
这是尚未发布的文档。 Admission Controller 1.34-dev. |
在 Go 中编写策略
|
Go 对 WebAssembly 的支持正在快速发展。 此页面最后修订于 2023 年 12 月。 |
自 v1.21 起,官方 Go 编译器可以生成 WebAssembly 二进制文件,以便在浏览器外执行。
还有另一个 Go 编译器可以构建可用于 SUSE Security Admission Controller 的 WebAssembly 二进制文件。 该编译器项目是 TinyGo:
TinyGo 通过基于 LLVM 创建一个新的编译器,将 Go 编程语言带入嵌入式系统和现代网络。
您可以在超过 94 种不同的微控制器板上编译和运行 TinyGo 程序,例如 BBC micro:bit 和 Arduino Uno。
TinyGo 还可以生成非常紧凑的 WebAssembly (Wasm) 代码。 您可以为网页浏览器编译程序,也可以为支持 WebAssembly 系统接口 (WASI) 系列接口的服务器和边缘计算环境编译程序。
Admission Controller 项目目前建议出于两个原因使用 TinyGo:
-
二进制文件更小
-
通过能够将函数导出到运行时来支持 waPC
TinyGo 的限制
TinyGo 还不支持所有 Go 特性,请参阅 TinyGo 语言支持 页面 以查看当前项目状态。
目前,它最大的限制是缺乏完全支持的 reflect 软件包。
这意味着官方 Kubernetes Go API 类型(例如:k8s.io/api/core/v1)无法编译。
Admission Controller 策略需要处理 JSON 数据,例如策略设置和 Kubernetes 接收到的请求。
尽管 TinyGo 目前存在一些限制,但使用它编写 Admission Controller 验证策略仍然很简单。
工具
编写 Admission Controller 策略需要使用版本高于 v0.28.1 的 TinyGo。
然而,使用最新版本可以获得最佳效果。
|
使用旧版本的 TinyGo 会导致运行时错误,因为对 Go 反射的支持有限。 |
在编写 Admission Controller 策略时,这些 Go 库非常有用:
-
Admission Controller Go SDK: 提供结构和函数,减少所需代码量。 它还提供测试助手。
-
Kubernetes Go 类型: 官方 Kubernetes Go 类型 不能与 TinyGo 一起使用。 该模块以 TinyGo 友好的方式提供所有 Kubernetes 类型。
-
gjson: 它提供了一种查询语言,用于快速导航 JSON 文档和数据检索。 该库不使用由 Go 的
stdlib提供的encoding/json包,因此可以与 TinyGo 一起使用。 -
mapset: 提供 集合 数据结构的 Go 实现。 该库减少了编写代码的数量,因为在 Admission Controller 策略中,像 Set
union、intersection、difference这样的操作是常见操作。
最后,Admission Controller 项目提供了一个 模板 Go 策略项目,您可以用它来创建 Admission Controller Go 策略。