跳转到内容

开发环境搭建

Nantian Gateway 的控制面用 Go 编写,数据面用 Rust 编写,管理界面用 Next.js 编写。本页带你从零搭建本地开发环境,完成编译、运行和调试的全流程。

工具版本要求用途
Go≥ 1.21控制面编译
Rust≥ 1.85数据面编译
Docker≥ 24.0本地集群和容器化运行
kubectl≥ 1.28Kubernetes 集群操作
Helm≥ 3.12Chart 打包和部署
protoc≥ 3.21Protobuf 编译
Node.js≥ 18管理界面和文档站
工具用途
Kind本地 Kubernetes 集群
just命令运行器(CI 和任务自动化)
golangci-lintGo 代码 Lint
cargo-watchRust 热重载开发
Terminal window
# 验证 Go
go version
# 预期: go version go1.21.x ...
# 验证 Rust
rustc --version
# 预期: rustc 1.88.x ...
# 验证 Docker
docker version
# 验证 kubectl
kubectl version --client
# 验证 Helm
helm version
# 验证 protoc
protoc --version
# 验证 Node.js
node --version
Terminal window
# Fork 主仓库,然后克隆你的 Fork
git clone https://github.com/<your-username>/gateway.git
cd gateway
# 添加主仓库为 upstream
git remote add upstream https://github.com/nantian-gw/gateway.git

开发环境推荐使用 Kind 搭建本地集群:

Terminal window
# 创建 Kind 集群
kind create cluster --name nantian-dev
# 验证集群状态
kubectl cluster-info
kubectl get nodes
Terminal window
# 安装 Gateway API v1.5.1 CRD
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/standard-install.yaml

控制面使用 Go 编写,入口在 gateway/cmd/manager/main.go

Terminal window
# 进入控制面目录
cd gateway
# 安装依赖
go mod download
# 编译控制面
go build -o bin/manager ./cmd/manager
# 本地运行控制面(需要先安装 Nantian Gateway CRD)
kubectl apply -f deploy/crds/
./bin/manager \
--metrics-bind-address=:8080 \
--health-probe-bind-address=:8081 \
--xds-bind-address=:9090 \
--leader-elect=false
参数默认值说明
--metrics-bind-address:8080Prometheus 指标端口
--health-probe-bind-address:8081健康检查和管理 API 端口
--xds-bind-address:9090gRPC xDS 服务器端口
--leader-electtrue是否启用主从选举
--leader-elect-namespace当前命名空间选举所在的命名空间
--gateway-class-namenantian-gw认领的 GatewayClass 名称

数据面使用 Rust 编写,位于 dataplane/ 目录。

Terminal window
# 进入数据面目录
cd dataplane
# 编译数据面(debug 模式)
cargo build
# 编译数据面(release 模式,性能优化)
cargo build --release
# 运行数据面
cargo run -- \
--node-id dataplane-dev-0 \
--controlplane-addr http://localhost:9090 \
--cluster kind \
--admin-bind-address 0.0.0.0:8082 \
--metrics-bind-address 0.0.0.0:9091
参数默认值说明
--node-id自动生成节点标识
--controlplane-addrhttp://localhost:9090控制面 gRPC 地址
--clusterkind集群名称
--admin-bind-address0.0.0.0:8082Admin API 地址
--metrics-bind-address0.0.0.0:9091Prometheus 指标端口

修改 proto/ 目录下的 .proto 文件后,需要重新生成 Go 和 Rust 代码:

Terminal window
# 生成 Go 代码
cd proto
buf generate
# 生成 Rust 代码(在 dataplane 目录下)
cd ../dataplane
# 代码生成已集成在 dataplane 的 build.rs 中
cargo build

管理界面是基于 Next.js 的 Web 应用:

Terminal window
cd dashboard
# 安装依赖
npm install
# 开发模式运行
npm run dev
# 浏览器访问 http://localhost:3000

文档站使用 Astro + Starlight:

Terminal window
cd website
# 安装依赖
npm install
# 开发模式运行
npm run dev
# 浏览器访问 http://localhost:4321

项目提供了 docker-compose.yml 用于快速启动完整的开发环境:

Terminal window
docker compose up -d

这会启动:

  • 控制面实例
  • 数据面实例
  • 管理界面

使用 Delve 调试 Go 代码:

Terminal window
# 安装 Delve
go install github.com/go-delve/delve/cmd/dlv@latest
# 调试模式运行控制面
dlv debug ./cmd/manager -- \
--leader-elect=false \
--xds-bind-address=:9090

VS Code 用户可以安装 Go 扩展,在 .vscode/launch.json 中配置调试目标。

Rust 数据面支持 RUST_LOG 环境变量控制日志级别:

Terminal window
# 启用详细日志
RUST_LOG=debug cargo run -- --node-id dataplane-dev-0
# 仅查看特定模块日志
RUST_LOG=nantian_dataplane::proxy=trace cargo run -- --node-id dataplane-dev-0

常用的日志级别:errorwarninfodebugtrace

在开发过程中,可以查看控制面和数据面之间的 xDS 通信来验证配置是否正确传递:

Terminal window
# 查看控制面 Admin API 中的 xDS 客户端状态
curl http://localhost:8081/api/v1/clients | jq
# 查看数据面 Admin API 中的 xDS 连接状态
curl http://localhost:8082/api/v1/xds/status | jq