2. 开发环境搭建:Go语言环境配置、Kubernetes源码编译环境、Kind集群搭建、本地调试工具链准备
搭建一个稳定、可复现的开发环境是编写 Kubernetes 调度器扩展的第一步。本章将指导你完成从 Go 语言环境配置到本地调试工具链安装的全过程,确保后续的插件开发、编译与测试能够顺畅进行。
2.1 Go 语言环境配置
Kubernetes 调度器及其扩展插件均使用 Go 语言编写。推荐使用 Go 1.21 或更高版本,以兼容最新的 Kubernetes 代码库。
2.1.1 安装与版本管理
- 下载安装:从
go.dev/dl获取对应操作系统的安装包,或使用包管理器(如brew、apt)安装。 - 版本管理工具:推荐使用
gvm或goenv管理多个 Go 版本,便于在不同 Kubernetes 版本间切换。
2.1.2 环境变量设置
确保以下环境变量正确配置:
export GOPATH=$HOME/go
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct # 国内用户建议设置
2.1.3 验证安装
go version
# 输出示例:go version go1.21.5 linux/amd64
go env GOPATH GOROOT
# 确认路径正确
提示:如果使用模块化开发(推荐),请确保
GO111MODULE=on。Kubernetes 项目本身已全面采用 Go Modules。
2.2 Kubernetes 源码编译环境
开发调度器扩展需要能够编译和运行 Kubernetes 核心组件。以下步骤将帮助你搭建源码编译环境。
2.2.1 克隆 Kubernetes 仓库
mkdir -p $GOPATH/src/k8s.io
cd $GOPATH/src/k8s.io
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
git checkout <目标版本> # 例如 v1.28.0
2.2.2 编译 kube-scheduler
make clean
make WHAT=cmd/kube-scheduler
编译产物位于 _output/bin/kube-scheduler。首次编译可能需要 10-20 分钟,后续增量编译会快很多。
2.2.3 编译环境依赖
| 依赖项 | 版本要求 | 说明 |
|---|---|---|
| Go | ≥ 1.21 | 核心编译工具链 |
| GNU Make | ≥ 4.0 | 构建系统 |
| gcc / libc-dev | 系统默认 | C 语言依赖(用于 cgo) |
| etcd | ≥ 3.5 | 本地测试时可选 |
2.3 Kind 集群搭建
Kind(Kubernetes in Docker)是本地开发和测试调度器扩展的最佳选择。它启动快、资源占用低,且支持自定义 kube-scheduler 配置。
2.3.1 安装 Kind
# Linux / macOS
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-$(uname)-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 验证
kind version
2.3.2 创建带自定义调度器的集群
创建一个配置文件 kind-config.yaml,将编译好的 kube-scheduler 挂载到集群中:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraMounts:
- hostPath: /path/to/your/kube-scheduler
containerPath: /usr/local/bin/kube-scheduler
kubeadmConfigPatches:
- |
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
scheduler:
extraArgs:
config: /etc/kubernetes/scheduler-config.yaml
启动集群:
kind create cluster --config kind-config.yaml --name scheduler-dev
2.3.3 验证集群状态
kubectl cluster-info --context kind-scheduler-dev
kubectl get nodes
注意:Kind 集群默认使用内置的 kube-scheduler 镜像。要使用你编译的版本,必须通过
extraMounts 挂载二进制文件,并确保调度器配置文件路径正确。
2.4 本地调试工具链准备
高效的调试工具链能大幅提升开发效率。以下是推荐的工具组合:
2.4.1 核心调试工具
| 工具 | 用途 | 安装方式 |
|---|---|---|
| Delve | Go 语言调试器,支持断点、变量查看 | go install github.com/go-delve/delve/cmd/dlv@latest |
| kubectl | Kubernetes 命令行工具 | 包管理器或官网下载 |
| kubebuilder | 扩展脚手架工具(可选) | curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) |
| stern | 多 Pod 日志聚合查看 | go install github.com/stern/stern@latest |
2.4.2 使用 Delve 远程调试调度器
在 Kind 集群中,可以通过以下步骤对 kube-scheduler 进行远程调试:
- 在宿主机上启动 Delve 服务,附加到调度器进程:
dlv exec /path/to/kube-scheduler -- --config /path/to/scheduler-config.yaml --kubeconfig /path/to/kubeconfig --v=5 --headless --listen=:2345 --api-version=2
- 在 IDE(如 VS Code 或 GoLand)中配置远程调试连接,指向
localhost:2345。 - 设置断点,触发调度流程,观察变量和调用栈。
2.4.3 日志与监控工具
- kubectl logs:查看调度器 Pod 日志。
- kubectl describe pod:查看调度事件和状态。
- metrics-server:监控集群资源使用情况,辅助验证调度决策。
2.5 开发环境架构总览
下图展示了本地开发环境中各组件之间的关系:
2.6 环境验证清单
完成上述步骤后,使用以下清单确认环境就绪:
| 检查项 | 验证命令 | 预期结果 |
|---|---|---|
| Go 版本 | go version |
≥ 1.21 |
| K8s 编译 | ls _output/bin/kube-scheduler |
文件存在且可执行 |
| Kind 集群 | kind get clusters |
显示 scheduler-dev |
| Delve 安装 | dlv version |
显示版本号 |
| kubectl 连接 | kubectl get nodes --context kind-scheduler-dev |
节点状态为 Ready |
关键要点:开发环境的核心是“宿主机编译 + Kind 集群运行 + Delve 调试”的三层架构。确保 Go 环境、K8s 源码和 Kind 集群之间的版本兼容性,是避免后续开发中“环境问题”的关键。