4. 开发环境准备:安装Go、Kustomize、Docker、Kind/MicroK8s,配置本地Kubernetes集群
本章是实战课程的基石。你将在一台干净的开发机上依次安装 Go(编译KRM函数)、Kustomize(插件加载器)、Docker(容器运行时)、Kind 或 MicroK8s(本地集群),并完成集群连通性验证。所有工具版本均经过兼容性测试,确保后续章节的插件开发与准入策略联动能够无缝运行。
推荐操作系统: Ubuntu 22.04 LTS 或 macOS Ventura+。Windows用户建议使用 WSL2 + Ubuntu 发行版。
4.1 工具版本矩阵与兼容性说明
为避免因版本不匹配导致的“环境地狱”,下表列出了本课程验证过的工具版本组合。请严格参照此表安装。
| 工具 | 推荐版本 | 最低版本 | 备注 |
|---|---|---|---|
| Go | 1.22.x | 1.21.0 | KRM函数插件需使用 plugin build tag |
| Kustomize | v5.4.x | v5.3.0 | 内置 alpha 插件框架 |
| Docker | 24.0.x | 20.10.0 | Kind 依赖 Docker 运行节点容器 |
| Kind | v0.22.x | v0.20.0 | 支持 extraMounts 和 featureGates |
| MicroK8s | 1.29.x | 1.28.0 | 需启用 host-access 和 registry 插件 |
| kubectl | 1.29.x | 1.28.0 | 与集群版本偏差不超过 ±1 |
4.2 安装Go与配置工作区
Go 是开发 Kustomize KRM 函数插件的核心语言。安装后需正确设置 GOPATH 和 GOBIN。
# 下载并安装 Go 1.22.2(Linux/macOS)
wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz
# 配置环境变量(追加到 ~/.bashrc 或 ~/.zshrc)
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
# 验证安装
go version
# 输出示例:go version go1.22.2 linux/amd64
工作区结构建议: 本课程所有插件代码统一放在
$GOPATH/src/kustomize-plugins/ 下,每个插件独立目录,便于 Kustomize 的 --enable-alpha-plugins 加载。
4.3 安装Kustomize(含alpha插件支持)
Kustomize v5.4+ 已内置 alpha 插件框架。推荐使用 go install 安装,确保与 Go 版本一致。
# 使用 go install 安装最新稳定版
go install sigs.k8s.io/kustomize/kustomize/v5@latest
# 验证安装
kustomize version
# 输出示例:v5.4.1
# 确认 alpha 插件可用
kustomize help alpha
# 应显示 alpha 相关子命令列表
避坑提示: 不要使用
brew 或系统包管理器安装 Kustomize,它们可能捆绑旧版本,缺少 alpha 插件支持。始终使用 go install 或 GitHub Release 二进制。
4.4 安装Docker与配置非root用户
Docker 是 Kind 集群的底层依赖。安装后务必配置当前用户加入 docker 组,避免每次执行 kind 命令都需要 sudo。
# 安装 Docker(Ubuntu 示例)
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 将当前用户加入 docker 组(需重新登录生效)
sudo usermod -aG docker $USER
newgrp docker
# 验证
docker run hello-world
4.5 安装Kind并创建本地集群
Kind(Kubernetes in Docker)可以在几分钟内启动一个多节点集群。我们将创建一个包含 1个控制平面 + 2个Worker节点 的集群,并挂载本地插件目录。
# 安装 Kind
go install sigs.k8s.io/kind@v0.22.0
# 创建集群配置文件 kind-config.yaml
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraMounts:
- hostPath: /home/$USER/go/bin
containerPath: /plugins
- role: worker
- role: worker
EOF
# 启动集群
kind create cluster --config kind-config.yaml --name kustomize-lab
# 验证集群状态
kubectl cluster-info --context kind-kustomize-lab
kubectl get nodes
为什么挂载
go/bin? 后续章节中,Kustomize 插件(KRM函数)编译后的二进制文件将存放在 $GOBIN,挂载到控制平面节点的 /plugins 目录,便于准入控制器通过 hostPath 卷加载。
4.6 备选方案:安装MicroK8s(适用于ARM/Linux桌面)
如果你的开发环境是 ARM 架构(如 Apple Silicon、树莓派)或偏好轻量级 snap 包,可以选择 MicroK8s 替代 Kind。MicroK8s 自带 kubectl 和 registry 插件,适合本地镜像管理。
# 安装 MicroK8s(Ubuntu)
sudo snap install microk8s --classic --channel=1.29/stable
# 将当前用户加入 microk8s 组
sudo usermod -aG microk8s $USER
newgrp microk8s
# 启用必要插件
microk8s enable host-access
microk8s enable registry
# 验证
microk8s kubectl get nodes
microk8s status --wait-ready
| 对比维度 | Kind | MicroK8s |
|---|---|---|
| 启动速度 | 快(约30秒) | 中等(约1分钟) |
| 多节点支持 | 原生支持 | 需额外配置 |
| ARM兼容性 | 需交叉编译 | 原生支持 |
| 内置镜像仓库 | 需额外部署 | 内置 registry 插件 |
| 插件挂载 | 通过 extraMounts | 通过 host-access |
4.7 验证环境连通性
完成安装后,执行以下全套验证脚本,确保所有组件正常工作。
# 1. 验证 Go 编译环境
cat <<EOF > /tmp/hello.go
package main
import "fmt"
func main() { fmt.Println("Go OK") }
EOF
go run /tmp/hello.go
# 2. 验证 Kustomize 插件路径
kustomize plugin list
# 3. 验证 Docker 与 Kind 集群
kind get clusters
kubectl get pods -A
# 4. 验证集群可调度 Pod
kubectl run nginx --image=nginx:alpine --restart=Never
kubectl wait --for=condition=Ready pod/nginx --timeout=30s
kubectl delete pod nginx
# 5. 验证挂载目录(Kind 控制平面)
docker exec kustomize-lab-control-plane ls /plugins
# 应列出 $GOBIN 中的二进制文件
预期输出: 所有命令返回正常,无错误日志。最后一步应看到
kustomize 或其他已安装的 Go 二进制文件列表。
4.8 环境拓扑与工具链关系
下图展示了开发环境中各工具的层级关系与数据流。Kustomize 作为编排层,调用 Go 编译的 KRM 函数插件;插件通过 kubectl 与 Kind/MicroK8s 集群交互;Docker 提供容器运行时支撑。
4.9 常见问题与快速修复
- 问题:
kustomize alpha命令不存在。
修复: 升级 Kustomize 到 v5.3+,或使用go install sigs.k8s.io/kustomize/kustomize/v5@latest重新安装。 - 问题: Kind 创建集群时提示
failed to create cluster: node(s) failed to join the cluster。
修复: 检查 Docker 资源限制(建议分配 4GB+ 内存),执行kind delete cluster --name kustomize-lab后重试。 - 问题: MicroK8s 启动后
kubectl无法连接。
修复: 执行microk8s kubectl config view --raw > ~/.kube/config导出 kubeconfig,或使用microk8s kubectl别名。 - 问题: Go 编译插件时报
undefined: plugin。
修复: 编译时添加-tags=plugin参数,例如go build -tags=plugin -o myplugin.so .。
重要提醒: 本课程后续所有章节均基于本章搭建的环境。如果遇到任何环境问题,请优先执行
4.7 验证环境连通性 中的全套脚本,定位具体故障点后再排查。