kurtosis-tech/kurtosis

GitHub: kurtosis-tech/kurtosis

Kurtosis 是一个用于简化区块链临时开发和测试环境部署的平台。

Stars: 541 | Forks: 97

# 什么是Kurtosis? 您是否曾尝试基于同事的工作进行构建,或为开源项目做贡献,结果却在启动环境进行体验的第一步就卡住了?[Kurtosis](https://www.kurtosis.com) 处理了启动临时开发或测试环境的复杂性,让您可以专注于开发,而不是配置。 Kurtosis 由以下部分构成: - 一个用于分发后端环境定义的打包系统,可以在 Docker 或 Kubernetes 上运行 - 一个带有逐环境文件管理系统的运行时,用于可重复地初始化您的环境状态 - 一套工具集,使开发者能够与其环境进行交互,就像在 Docker 或 k8s 上一样 # 为什么使用Kurtosis? Kurtosis 最适合于: # Kurtosis 与 Docker Compose 或 Helm 有何不同? Kurtosis 运行在比 Docker Compose 或 Helm 更高的一层,它生成运行在底层引擎(Docker 引擎或 Kubernetes)之上的环境。 由于这层额外的抽象,我们能够引入一些特性来改善启动临时环境的体验: - 一个逐环境文件管理系统,支持为开发或测试环境进行可移植的状态初始化 - 环境级参数化;用户拥有一种强大而灵活的方式(超越仅仅修改环境变量)来影响其环境的修改 - 一流的即插即用可组合性;期望用户将环境定义导入更大的环境中,并且此体验得到了优化 - 能够获得上述所有功能,但可运行在 _Docker 引擎或 K8s_ 上,由您选择 `注意:我们目前不推荐使用 Kurtosis 来部署长期的生产环境。任何与生产环境使用相关的问题/Discord帖子都将被关闭。` # 如何开始? 要查看 Kurtosis 的实际效果,请首先按照[此处](https://docs.kurtosis.com/install)的说明进行安装。 然后,运行 [Redis 投票应用 Kurtosis 包](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/redis-voting-app): ``` kurtosis run github.com/kurtosis-tech/awesome-kurtosis/redis-voting-app ``` 最后,在浏览器中打开最后一行打印的 `http` 链接。 如果您有任何问题或功能请求,我们非常乐意通过以下方式了解: - 在我们的 [Github 讨论论坛](https://github.com/kurtosis-tech/kurtosis/discussions/new?category=q-a) 上发布您的问题 - [在我们的 Discord 服务器上寻求帮助][discord] - 在我们的 [Github](https://github.com/kurtosis-tech/kurtosis/issues/new/choose) 上提交 issue(也可以通过 `kurtosis feedback --bug` 或 `kurtosis feedback --feature` 来完成) - [在 Twitter 上给我们发消息][twitter] ### 进一步探索 要尝试更多类似这样的 Kurtosis 包,请查看 [`awesome-kurtosis` 仓库][awesome-kurtosis]! 要了解如何编写 Kurtosis 包,请查看我们的[快速入门指南][quickstart-reference]。 要了解 Kurtosis 的工作原理,请参阅[我们的文档][docs]。 要查看我们产品的发展路线图,请查看[这里](https://github.com/kurtosis-tech/kurtosis/wiki/Short%E2%80%90term-Roadmap)。 # Claude 代码技能 此仓库包含 [Claude Code](https://claude.ai/download) 技能,用于教导 Claude 如何与 Kurtosis 协作。技能是位于 `skills/` 目录中的结构化提示,向 Claude 提供关于构建、调试、部署和管理 Kurtosis 飞地的操作知识。 ### 可用技能 | 技能 | 描述 | |-------|------| | `clean` | 清理飞地和工件 | | `cli-local-build` | 从源代码构建 CLI | | `cluster-manage` | 管理 Kurtosis 集群 | | `context-manage` | 管理 Kurtosis 上下文 | | `docker-debug` | 调试基于 Docker 的飞地 | | `docker-local-build` | 本地构建和加载 Docker 镜像 | | `dump` | 转储飞地状态以进行调试 | | `enclave-inspect` | 检查正在运行的飞地 | | `engine-manage` | 启动、停止和重启引擎 | | `files-inspect` | 检查文件工件 | | `gateway` | 管理 Kurtosis 网关 | | `grafloki` | 查询 Grafana 和 Loki 可观测性 | | `import-compose` | 导入 Docker Compose 文件 | | `k8s-clean-cluster` | 从 K8s 清理 Kurtosis 资源 | | `k8s-debug-pods` | 在 Kubernetes 上调试 Pod | | `k8s-dev-deploy` | 构建并将开发镜像部署到 K8s | | `lint` | 代码库检查 | | `port-forward` | 从飞地转发端口 | | `portal` | 管理 Kurtosis 门户 | | `run-package` | 运行 Starlark 包 | | `service-manage` | 管理飞地内的服务 | | `starlark-dev` | 开发 Starlark 包 | ### 安装技能 当技能存在于项目的 `skills/` 目录中时,Claude Code 会自动发现它们。有几种安装方法: #### 选项 2:将技能复制到您的项目中 将 `skills/` 目录复制到您希望 Claude 具备 Kurtosis 知识的任何项目中: ``` # 从 kurtosis 仓库中复制技能到你的项目 cp -r /path/to/kurtosis/skills /path/to/your-project/skills ``` #### 选项 3:从另一个项目创建符号链接 如果您希望将技能与 Kurtosis 仓库保持同步而不复制: ``` # 符号链接整个技能目录 ln -s /path/to/kurtosis/skills /path/to/your-project/skills # 或符号链接单个技能 mkdir -p /path/to/your-project/skills ln -s /path/to/kurtosis/skills/run-package /path/to/your-project/skills/run-package ``` #### 选项 4:为所有项目全局安装 要使 Kurtosis 技能对您的所有 Claude Code 项目可用,请将它们添加到您的全局 Claude 配置中: ``` # 复制技能到你的全局 Claude 配置 cp -r /path/to/kurtosis/skills ~/.claude/skills ``` ### 使用技能 安装后,技能在 Claude Code 中作为斜杠命令调用: ``` /clean # Clean up enclaves /run-package # Run a Starlark package /docker-debug # Debug Docker containers /k8s-debug-pods # Debug Kubernetes pods ``` 您也可以在对话中自然地引用技能——当讨论 Kurtosis 主题时,Claude 会自动使用相关的技能上下文。 ## 仓库结构 此仓库采用 monorepo 结构,包含以下项目: - `container-engine-lib`:用于抽象 [飞地][enclave] 所使用的容器引擎的库。 - `core`:在 [飞地][enclave] 内启动的容器,用于协调其状态 - `engine`:启动用于协调[飞地][enclave]的容器 - `api`:定义 Kurtosis 平台(`engine` 和 `core`)的 API - `cli`:生成 CLI 二进制文件,允许与 Kurtosis 系统进行交互 - `docs`:发布到 [docs.kurtosis.com](docs) 的文档 - `internal_testsuites`:端到端测试 ## 开发依赖 (Nix) 安装 [Nix 包管理器](https://nixos.org/download)。 ``` sh <(curl -L https://nixos.org/nix/install) ``` 并启用一些 Nix 标志(或者您可以在每次调用 `nix` 命令时添加 `--extra-experimental-features 'nix-command flakes'`): ``` mkdir -p ~/.config/nix echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf ``` 要启动环境,只需打开一个新的 shell 终端,转到仓库的根目录并运行: ``` nix develop ``` 这将下载所有开发依赖并相应地设置环境。 您也可以使用 [`direnv`](https://direnv.net/) 在进入主文件夹或使用您首选 IDE 的插件时自动加载环境: - `vscode`: [mkhl.direnv](https://github.com/direnv/direnv-vscode) - `jet brains`: [Direnv integration](https://plugins.jetbrains.com/plugin/15285-direnv-integration) Direnv 也可以通过 Nix 轻松安装(或者如果您愿意,也可以使用 [HomeBrew](https://formulae.brew.sh/formula/direnv)): ``` nix-env -f '' -iA direnv ``` 现在您只需将 direnv hook 添加到您的 shell: ``` echo 'eval "$(direnv hook bash)"' >> ~/.bashrc # 或为 ZSH 配置 echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc ``` 下次您打开新的 shell 终端并转到仓库文件夹时,您的环境将自动更新和加载。 ## 开发依赖 (手动安装) 以下命令假定环境变量 `BREW_PREFIX` 包含 brew 前缀。 ``` BREW_PREFIX="$(brew --prefix)" ``` #### Bash (5 或以上) 在 MacOS 上: ``` # 安装现代版本的 bash,MacOS 自带的版本太旧 brew install bash # 允许 bash 作为 shell echo "${BREW_PREFIX}/bin/bash" | sudo tee -a /etc/shells # 可选:将 bash 设为你的默认 shell chsh -s "${BREW_PREFIX}/bin/bash" ``` #### Git 在 MacOS 上: ``` # 安装现代版本的 git,MacOS 自带的版本可能太旧 brew install git ``` #### Docker 在 MacOS 上: ``` brew install docker ``` #### Go (1.23 或以上) 在 MacOS 上: ``` brew install go@1.23 # 将 Go 二进制目录添加到你的 PATH PATH="${BREW_PREFIX}/opt/go@1.23/bin:$PATH" # 将 GOPATH 的 bin 目录添加到你的 PATH PATH="${HOME}/go/bin:$PATH" ``` 在 Ubuntu 上: ``` wget https://go.dev/dl/go1.23.7.linux-amd64.tar.gz tar -C /usr/local -zxf go1.23.7.linux-amd64.tar.gz # 将以下内容添加到你的 bashrc 或等效配置文件 export PATH=$PATH:/usr/local/go/bin ``` #### Goreleaser 在 MacOS 上: ``` brew install goreleaser/tap/goreleaser ``` 在 Ubuntu 上: ``` echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | sudo tee /etc/apt/sources.list.d/goreleaser.list sudo apt update sudo apt install goreleaser ``` #### Node (20.* 或以上) 和 Yarn 在 MacOS 上,使用 `NVM`: ``` brew install nvm mkdir ~/.nvm nvm install 20.11.0 npm install -g yarn ``` 在 Ubuntu 上,使用 `NVM`: ``` curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.bashrc nvm install 20.11.0 npm install -g yarn ``` #### Rust 在 MacOS,Ubuntu 上: ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` #### Go 和 Typescript protobuf 编译器二进制文件 在 MacOS 上: ``` brew install protoc-gen-go brew install protoc-gen-go-grpc go install connectrpc.com/connect/cmd/protoc-gen-connect-go@latest yarn global add ts-protoc-gen yarn global add grpc-tools ``` 在 Ubuntu 上: ``` go install google.golang.org/grpc/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest go install connectrpc.com/connect/cmd/protoc-gen-connect-go@latest yarn global add ts-protoc-gen yarn global add grpc-tools ``` #### Go 和 Typescript 的 OpenAPI 生成器 在 MacOS 上: ``` go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.16.2 yarn global add openapi-typescript@7.0.0-next.5 ``` 在 Ubuntu 上: ``` go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.16.2 yarn global add openapi-typescript@7.0.0-next.5 ``` ## 构建说明 要构建整个项目,请运行: ``` ./scripts/build.sh ``` **注意:** 如果您遇到与 `github.com/kurtosis-tech/kurtosis/kurtosis_version` 相关的模块导入错误,您可能需要首先生成版本常量: ``` ./scripts/generate-kurtosis-version.sh ``` 此脚本生成所需的 `kurtosis_version.go` 文件,该文件包含整个代码库使用的版本常量。该文件在构建过程中自动生成,但在某些开发场景下可能需要手动运行。 要仅构建特定项目,请在 `./PROJECT/PATH/script/build.sh` 上运行脚本,例如: ``` ./container-engine-lib/scripts/build.sh ./core/scripts/build.sh ./api/scripts/build.sh ./engine/scripts/build.sh ./cli/scripts/build.sh ``` 如果 `api` 子目录中的 Protobuf 文件有任何更改,则必须重新生成 Protobuf 绑定: ``` ./api/scripts/regenerate-protobuf-bindings.sh ``` 如果您在 Podman 集群上开发 Kurtosis,请运行: ``` ./scripts/build.sh false true # no debug image, use podman ``` 这将使用 Podman 镜像构建器来构建镜像。有关构建选项的更多详细信息,请参阅脚本中的文档。 ## 运行开发版本 构建项目后,像运行 kurtosis 命令一样运行 `./cli/cli/scripts/launch-cli.sh`。这将启动本地构建的最新 CLI 版本,该版本也将使用其最新构建的镜像启动 engine 和 core 容器。 您可以通过运行 `./cli/cli/launch-cli.sh engine status` 和 ``` A Kurtosis engine is running with the following info: Version: 53d823 <-- or `-dirty` depending on the commit ``` 来验证这一点。版本将与创建的 engine 镜像的最新开发版本相同(可以通过 `docker images` 验证)。engine 启动的飞地将使用与 engine 相同的版本启动。 如果您希望指定与 engine 不同的 core 镜像版本,可以在 `enclave add` 上使用 `--api-container-version` 标志来实现(例如,`./cli/cli/scripts/build.sh enclave add --api-container-version `)。 如果您同时开发 engine 的多个开发版本,可以使用 `engine restart --version ` 来指定要使用的确切 engine 版本。 ``` alias kt="kurtosis" alias dkt="$(pwd)/cli/cli/scripts/launch-cli.sh" ``` 如果您希望对最近构建的 CLI 进行 Tab 补全,可以将其别名为 `kurtosis`: ``` alias kurtosis="$(pwd)/cli/cli/scripts/launch-cli.sh" kurtosis enclave add ``` ## 单元测试说明 构建脚本在构建过程中也会运行单元测试。 对于所有 Go 模块,在模块文件夹上运行 `go test ./...`。例如: ``` cd cli/cli/ go test ./... ``` ## 端到端测试说明 每个项目的构建脚本也会运行项目内的单元测试。运行 `./script/build.sh` 将保证 monorepo 中的所有单元测试通过。 要运行端到端测试: 1. 确保 Docker 正在运行 ``` $ docker --version Docker version X.Y.Z ``` 2. 确保 Kurtosis Engine 正在运行 ``` $ kurtosis engine status A Kurtosis engine is running with the following info: Version: 0.X.Y ``` 3. 运行 `test.sh` 脚本 ``` $ ./internal_testsuites/scripts/test.sh ``` 如果您正在开发 Typescript 测试,请确保您首先构建了 `api/typescript`。截至 2022-09-29,对 `api/typescript` 内 Typescript 包的任何更改都不会热加载。 ## 运行调试说明(目前适用于 Golang 代码) 用于通过 Golang 远程调试运行 CLI: 1. 构建 CLI 开发二进制文件并运行您想要调试的命令(在此示例中为 kurtosis 版本),这将启动调试服务器并等待客户端连接 ``` cli/cli/scripts/build.sh source ./scripts/set_kt_alias.sh ktdebug version ``` 2. 打开您想要调试的命令的文件 3. 在您希望光标停止的行添加断点 4. 然后在“运行面板”中选择“CLI-remote-debug”运行配置 5. 按下“调试”按钮 6. 使用调试面板检查变量值并继续调试流程 用于通过 Delve 调试客户端运行 CLI: 1. 构建 CLI 开发二进制文件并运行您想要调试的命令(在此示例中为 kurtosis 版本),但首先将“dlv-terminal”作为第一个参数传递(这将在终端中启动 Delve 客户端) ``` cli/cli/scripts/build.sh source ./scripts/set_kt_alias.sh ktdebug dlv-terminal version ``` 2. 您可以使用终端客户端和 `break` 命令添加新断点 ``` (dlv) break version.run:1 ``` 3. 您可以使用 `continue` 命令将光标移动到上一步创建的断点 ``` (dlv) continue ``` 4. You can see [more Delve commands here][delve-docs] 用于通过 Golang 远程调试运行 Kurtosis engine: 1. 将主构建脚本的第一个参数 `debug_mode` 设置为 true。这将生成一个新的 Kurtosis engine 容器镜像,该镜像的名称中将包含 `debug` 后缀。 ``` scripts/build.sh true ``` 2. 在您希望光标停止的行添加断点 3. 使用 `ktdev engine start --debug-mode` 或 `ktdev engine restart --debug-mode` 命令在调试模式下运行 engine ``` source ./scripts/set_kt_alias.sh ktdev engine start --debug-mode ``` 4. 然后在“运行面板”中选择“Engine-remote-debug”运行配置 5. 按下“调试”按钮 6. 调用 engine 的服务器(您可以使用 Kurtosis CLI 或 Postman)以命中断点 7. 使用调试面板检查变量值并继续调试流程 8. 您可以通过使用 `ktdebug` 而不是前面提到的 `ktdev` 来运行,同时调试 CLI 和 Kurtosis engine 的服务器,请记住在 Goland IDE 中运行两个远程调试配置。 ``` source ./scripts/set_kt_alias.sh ktdebug engine start ``` 如果您在 K8s 中调试 Kurtosis engine 的附加步骤: 1. 将用于调试的 engine 镜像上传到 K8s 集群 ``` # 例如: k3d image load kurtosistech/engine:5ec6eb-dirty-debug ``` 2. 在 Goland 中按下调试按钮之前(在另一个终端实例中)运行端口转发脚本,将主机端口绑定到容器的调试服务器端口 ``` scripts/port-forward-engine-debug.sh ``` 3. 在调用 engine 的服务器后(也在另一个终端实例中)不要忘记运行 Kurtosis 网关 ``` ktdev gateway ``` 用于通过 Golang 远程调试运行 Kurtosis APIC: 1. 将主构建脚本的第一个参数 `debug_mode` 设置为 true。这将生成一个新的 Kurtosis APIC 容器镜像,该镜像的名称中将包含 `debug` 后缀。 ``` scripts/build.sh true ``` 2. 在您希望光标停止的行添加断点。 3. 根据您是否还想调试 engine,选择以调试模式运行 Kurtosis engine 或不运行。 ``` source ./scripts/set_kt_alias.sh ktdev engine start --debug-mode OR ktdev engine start # you will have to build the engine in the regular way `engine/scripts/build.sh` if you choose this version ``` 4. 使用 `enclave add` 命令添加一个新的调试模式飞地,并传递 `debug-mode` 标志。这将创建一个新的 APIC 容器,其调试服务器端口已绑定并等待连接。 重要提示:目前您只能运行一个调试模式的飞地,如果您尝试运行另一个,将会失败,因为调试端口已被占用。 ``` ktdev enclave add --debug-mode ``` 5. 然后在“运行面板”中选择“APIC-remote-debug”运行配置 6. 按下“调试”按钮 7. 在主机上找到 APIC 的 GRPC 服务器端口(您可以在 Docker Desktop 中或使用 Docker CLI 查看,它是与容器的 7443 端口绑定的那个) 8. 调用 APIC 的服务器(您可以使用 Kurtosis CLI 或 Postman)以命中断点 9. 使用调试面板检查变量值并继续调试流程 10. 您可以通过使用 `ktdebug` 而不是前面提到的 `ktdev` 来运行,同时调试 CLI、Kurtosis engine 的服务器和 Kurtosis APIC 的服务器,请记住在 Goland IDE 中运行三个远程调试配置。 ``` source ./scripts/set_kt_alias.sh ktdev engine start --debug-mode ktdebug enclave add ``` 如果您在 K8s 中调试 Kurtosis APIC 的附加步骤: 1. 将用于调试的 APIC 镜像上传到 K8s 集群 ``` # 例如: k3d image load kurtosistech/core:5ec6eb-dirty-debug ``` 2. 在 Goland 中按下调试按钮之前(在另一个终端实例中)运行端口转发脚本,将主机端口绑定到容器的调试服务器端口 ``` scripts/port-forward-apic-debug.sh enclave-name ``` 3. 在调用 APIC 的服务器后(也在另一个终端实例中)不要忘记运行 Kurtosis 网关 ``` ktdev gateway ```
标签:Docker, EVTX分析, MITM代理, NIDS, SOC Prime, 临时环境, 区块链, 区块链开发, 参数化配置, 可组合性, 可视化界面, 启动工具, 基础设施, 堆栈管理, 子域名突变, 安全防御评估, 容器化, 容器编排, 工具集, 开发工具, 开发平台, 打包工具, 文件管理, 日志审计, 测试平台, 网络连接监控, 请求拦截, 运行时