4. 开发环境搭建:Go语言环境配置、Docker环境配置、Kind/MicroK8s本地多集群模拟、kubectl与kubeconfig多上下文管理
在开始编写和部署 Operator 之前,搭建一个稳定、可复现的本地开发环境是首要任务。本章将指导你完成从语言运行时到多集群模拟的完整环境配置,确保后续章节的实战操作能够顺畅进行。
4.1 Go 语言环境配置
Operator SDK 和 Kubernetes 控制器均基于 Go 语言构建。推荐使用 Go 1.21 及以上版本,以支持最新的泛型特性和模块管理。
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| Go 版本 | 1.21+ | 支持泛型、改进的错误处理 |
| GOPATH | $HOME/go |
Go 工作区根目录 |
| GOROOT | 自动检测 | Go 安装目录,通常无需手动设置 |
| 代理 | https://goproxy.cn,direct |
国内加速,避免模块下载超时 |
验证命令:
go version
# 输出示例:go version go1.21.5 linux/amd64
go env GOPATH GOROOT
# 确认路径正确,且 GOPATH/bin 已加入 PATH
4.2 Docker 环境配置
Operator 最终会以容器镜像的形式运行在集群中。本地开发阶段,Docker 用于构建测试镜像并推送至本地仓库。
- 安装 Docker Engine:参考官方文档,确保
docker命令可用。 - 配置非 root 用户:将当前用户加入
docker组,避免每次执行sudo。 - 设置镜像加速器:编辑
/etc/docker/daemon.json,添加国内镜像源。
性能提示: 在 macOS 或 Windows 上,建议为 Docker Desktop 分配至少 4GB 内存和 2 个 CPU 核心,以支持同时运行多个 Kind 集群。
4.3 本地多集群模拟:Kind 与 MicroK8s
为了模拟生产环境中的多集群拓扑,我们选择两种轻量级方案:Kind(Kubernetes in Docker)和 MicroK8s。前者适合快速创建临时集群,后者适合需要持久化存储和附加组件的场景。
4.3.1 使用 Kind 创建多集群
Kind 将每个集群的控制面和 Worker 节点都封装为 Docker 容器,非常适合 CI/CD 和本地快速验证。
# 创建第一个集群:cluster-1
kind create cluster --name cluster-1 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
# 创建第二个集群:cluster-2
kind create cluster --name cluster-2 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
EOF
# 查看所有集群
kind get clusters
# 输出:cluster-1 cluster-2
4.3.2 使用 MicroK8s 创建多集群
MicroK8s 通过 microk8s add-node 命令将多台机器组成集群。在单机开发场景下,可以使用 multipass 启动多个 Ubuntu 虚拟机来模拟。
# 在主节点上安装 MicroK8s
sudo snap install microk8s --classic --channel=1.28
# 加入工作节点(在另一台机器或虚拟机上执行)
microk8s join 192.168.1.100:25000/xxxxxxxxxxxxxxxxxxxxxxxx
# 验证集群状态
microk8s kubectl get nodes
注意: MicroK8s 默认使用
--classic 模式,需要 snap 支持。在 Docker 容器内无法直接运行 MicroK8s,建议在虚拟机或裸机 Linux 上使用。
4.4 kubectl 与 kubeconfig 多上下文管理
当本地存在多个集群时,kubectl 通过 kubeconfig 文件中的上下文(context)来切换目标集群。合理管理上下文是高效开发的关键。
| 命令 | 用途 | 示例 |
|---|---|---|
kubectl config get-contexts |
列出所有上下文 | 显示当前集群列表 |
kubectl config use-context |
切换当前上下文 | kubectl config use-context kind-cluster-1 |
kubectl config set-context |
创建或修改上下文 | 指定集群、用户、命名空间 |
kubectl config view |
查看完整配置 | 合并多个 kubeconfig 文件 |
4.4.1 合并多个 kubeconfig 文件
Kind 和 MicroK8s 会自动将集群信息写入 ~/.kube/config。如果需要手动合并,可以使用 KUBECONFIG 环境变量。
# 合并两个配置文件
export KUBECONFIG=~/.kube/config:~/.kube/microk8s-config
# 查看合并后的上下文
kubectl config get-contexts
# 永久合并(备份原文件后执行)
kubectl config view --flatten > ~/.kube/config-new
mv ~/.kube/config ~/.kube/config.bak
mv ~/.kube/config-new ~/.kube/config
4.4.2 使用别名快速切换
为常用操作设置 shell 别名,可以大幅提升效率。
# 在 ~/.bashrc 或 ~/.zshrc 中添加
alias kc='kubectl config use-context'
alias kgc='kubectl config get-contexts'
# 使用示例
kgc
kc kind-cluster-1
kubectl get nodes
最佳实践: 为每个集群设置独立的
kubeconfig 文件,并通过 KUBECONFIG 环境变量按需加载。避免将所有集群信息写入同一个文件,减少误操作风险。
4.5 环境验证清单
完成上述配置后,执行以下命令验证环境是否就绪:
# 1. 验证 Go
go version
# 2. 验证 Docker
docker run hello-world
# 3. 验证 Kind 集群
kind get clusters
kubectl --context kind-cluster-1 get nodes
kubectl --context kind-cluster-2 get nodes
# 4. 验证 MicroK8s(如有)
microk8s kubectl get nodes
# 5. 验证上下文切换
kubectl config use-context kind-cluster-1
kubectl config current-context