在 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 unionintersectiondifference 这样的操作是常见操作。

最后,Admission Controller 项目提供了一个 模板 Go 策略项目,您可以用它来创建 Admission Controller Go 策略。

获取 TinyGo 依赖项。

获取 TinyGo 的最简单方法是使用上游容器镜像。 官方发布在这里,而开发分支的构建会自动推送到这里

如有需要,请查看 TinyGo 的入门页面以获取更多信息。

教程前提条件。

在本教程中,您需要在开发机器上安装以下工具:

  • docker 或其他容器引擎:用于构建 WebAssembly 策略。 您将使用官方 TinyGo 容器镜像中提供的编译器。

  • bats:用于编写测试并自动执行它们。

  • kwctl: 由 Admission Controller 提供的 CLI 工具,用于在 Kubernetes 之外运行其策略以及其他操作。 在文档的本节中进行了介绍。