3. 环境准备:安装核心工具链
在开始构建自定义 CRD 控制器之前,必须搭建一套完整、可复现的本地开发环境。本章将指导你依次安装 Go、Docker、kubectl 以及一个轻量级 Kubernetes 集群(minikube 或 kind)。
版本对齐建议:本课程所有示例均基于 Go 1.21+、Docker 24+、Kubernetes 1.28+ 以及 Operator SDK 1.34+。请尽量保持版本一致,避免因版本差异导致 API 变更或兼容性问题。
3.1 安装 Go 语言环境
Operator SDK 生成的控制器代码完全基于 Go 语言,且依赖 Go 模块系统进行依赖管理。Go 的安装方式因操作系统而异,但核心步骤一致。
3.1.1 下载与安装
- 访问 Go 官方下载页面,选择对应操作系统和架构的安装包。
- Linux/macOS 推荐使用
tar解压至/usr/local;Windows 直接运行 MSI 安装程序。 - 设置环境变量
GOPATH和PATH。
# Linux/macOS 示例
wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.bashrc
3.1.2 验证安装
go version
# 期望输出: go version go1.21.5 linux/amd64
常见陷阱:如果
go version 显示旧版本,请检查 PATH 中是否包含其他 Go 安装路径。使用 which go 定位实际调用的二进制文件。
3.2 安装 Docker
Docker 用于构建和推送 Operator 镜像,同时也是 minikube 和 kind 运行集群的容器运行时。安装方式推荐使用官方脚本或系统包管理器。
| 操作系统 | 推荐安装方式 | 验证命令 |
|---|---|---|
| Ubuntu/Debian | sudo apt install docker.io |
docker --version |
| CentOS/RHEL | sudo yum install docker-ce |
docker --version |
| macOS | Docker Desktop for Mac | docker --version |
| Windows | Docker Desktop for Windows | docker --version |
# 安装后,将当前用户加入 docker 组(Linux)
sudo usermod -aG docker $USER
newgrp docker
# 验证 Docker 能否正常运行
docker run hello-world
关键配置:确保 Docker 守护进程已启动(
sudo systemctl enable --now docker),并且当前用户拥有执行 Docker 命令的权限。如果遇到权限拒绝,请检查是否已执行 usermod 并重新登录。
3.3 安装 kubectl
kubectl 是 Kubernetes 的命令行工具,用于与集群交互。Operator SDK 在生成、部署和调试过程中会频繁调用 kubectl。
3.3.1 安装步骤
# Linux (使用 curl 下载最新稳定版)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# macOS (使用 Homebrew)
brew install kubectl
# Windows (使用 chocolatey)
choco install kubernetes-cli
3.3.2 验证与配置
kubectl version --client
# 期望输出: Client Version: v1.28.4
# 配置自动补全(可选但推荐)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
3.4 安装本地 Kubernetes 集群
本地集群是开发和测试 CRD 控制器的核心环境。minikube 和 kind 是两种最流行的选择,各有优劣。
| 特性 | minikube | kind (Kubernetes in Docker) |
|---|---|---|
| 底层技术 | 虚拟机或容器 | Docker 容器作为节点 |
| 启动速度 | 较慢(需创建 VM) | 快(秒级启动) |
| 资源占用 | 较高 | 较低 |
| 多节点支持 | 支持 | 原生支持 |
| 适用场景 | 完整集群模拟 | CI/CD、快速迭代 |
3.4.1 安装 minikube
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# macOS
brew install minikube
# 启动集群(默认驱动为 docker)
minikube start --cpus=4 --memory=8192 --kubernetes-version=v1.28.4
3.4.2 安装 kind
# Linux/macOS
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 创建集群配置文件
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
# 启动集群
kind create cluster --config kind-config.yaml --name operator-dev
选择建议:如果你的机器内存小于 8GB,优先选择 kind;如果需要测试节点自动修复、存储卷挂载等高级特性,minikube 更合适。本课程后续示例同时兼容两种集群。
3.5 环境验证与架构总览
安装完成后,执行以下命令验证整个工具链是否就绪:
# 验证 Go
go version
# 验证 Docker
docker version
# 验证 kubectl
kubectl version --client
# 验证集群
kubectl cluster-info
kubectl get nodes
下图展示了本地开发环境中各工具之间的协作关系:
环境就绪检查清单:
- Go 版本 ≥ 1.21,
GOPATH和PATH正确配置 - Docker 守护进程运行中,当前用户有执行权限
- kubectl 版本与集群版本偏差在 ±1 个小版本内
- minikube 或 kind 集群状态为
Running,kubectl get nodes返回 Ready 节点
3.6 常见问题与排错
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
go: command not found |
Go 未加入 PATH | 检查 /usr/local/go/bin 是否在 PATH 中 |
Cannot connect to the Docker daemon |
Docker 服务未启动或权限不足 | sudo systemctl start docker;将用户加入 docker 组 |
Unable to connect to the server |
kubectl 未找到集群上下文 | 检查 ~/.kube/config 是否存在;执行 kubectl config get-contexts |
| minikube 启动失败 | 驱动不支持或资源不足 | 使用 --driver=docker;增加内存/CPU 配额 |
| kind 创建集群超时 | 镜像拉取慢或端口冲突 | 配置 Docker 镜像加速器;检查 localhost:6443 是否被占用 |