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 提供容器运行时支撑。

开发环境工具链拓扑 开发环境工具链拓扑 Kustomize v5.4 Go KRM 函数插件 kubectl 客户端 Kind / MicroK8s 本地 Kubernetes 集群 Docker Engine 容器运行时 说明: Kustomize 通过 --enable-alpha-plugins 加载 Go 编译的 KRM 函数插件;插件通过 kubectl 与集群 API 交互; Docker 为 Kind 提供节点容器,为 MicroK8s 提供底层容器运行时。

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 验证环境连通性 中的全套脚本,定位具体故障点后再排查。