本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

这是尚未发布的文档。 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 unionintersectiondifference 这样的操作是常见操作。

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

获取 TinyGo 依赖项。

获取 TinyGo 的最简单方法是使用上游容器镜像。 官方发布在https://hub.docker.com/r/tinygo/tinygo[这里],而开发分支的构建会自动推送到https://hub.docker.com/r/tinygo/tinygo-dev[这里]。

如有需要,请查看 TinyGo 的https://tinygo.org/getting-started/[入门]页面以获取更多信息。

教程前提条件。

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

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

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

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