3. 环境准备:Kubernetes 集群搭建与仓库配置
在开始 Flux CD 的 GitOps 实践之前,必须准备好底层运行环境。本章将指导你完成三个核心步骤:搭建轻量级 Kubernetes 集群、安装配置 kubectl 命令行工具、以及准备 Git 仓库(GitHub/GitLab)。这些是后续所有流水线操作的基础设施。
3.1 环境概览与组件关系
下图展示了本课程实验环境的整体架构,以及各组件之间的协作关系:
3.2 Kubernetes 集群搭建
本课程推荐两种轻量级 Kubernetes 发行版:Minikube(适合本地开发)和 K3s(适合资源受限环境)。选择依据如下:
| 特性 | Minikube | K3s |
|---|---|---|
| 适用场景 | 本地开发、单节点测试 | 边缘计算、CI/CD 环境、生产边缘 |
| 资源占用 | 中等(2GB+ 内存) | 低(512MB 内存即可运行) |
| 安装复杂度 | 简单(二进制或包管理器) | 简单(单文件安装) |
| 默认驱动 | Docker / VirtualBox / Hyper-V | containerd(内置) |
| Flux 兼容性 | 完全兼容 | 完全兼容 |
3.2.1 使用 Minikube 搭建集群
Minikube 是 Kubernetes 官方维护的本地集群工具,适合在个人电脑上快速启动一个单节点集群。
前置条件:已安装 Docker 或 Hyper-V 等容器/虚拟化环境。
安装步骤:
- 下载 Minikube 二进制文件并赋予执行权限。
- 启动集群,指定资源配额和 Kubernetes 版本。
- 验证集群状态。
# 下载 Minikube(Linux/macOS)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动集群(推荐分配 2 核 CPU、4GB 内存)
minikube start --cpus=2 --memory=4096 --kubernetes-version=v1.28.0
# 检查集群状态
minikube status
# 查看节点信息
kubectl get nodes
3.2.2 使用 K3s 搭建集群
K3s 是 Rancher 推出的轻量级 Kubernetes 发行版,二进制文件仅约 60MB,非常适合在虚拟机或 CI 环境中快速部署。
# 一键安装 K3s(Server 模式)
curl -sfL https://get.k3s.io | sh -
# 检查 K3s 服务状态
sudo systemctl status k3s
# 获取 kubeconfig 文件(默认路径)
sudo cat /etc/rancher/k3s/k3s.yaml
# 使用 kubectl 访问集群(需配置 KUBECONFIG 环境变量)
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes
提示:K3s 默认使用 containerd 作为容器运行时,并内置了 Traefik Ingress Controller。如果不需要,可以在安装时通过 --disable=traefik 禁用。
3.3 kubectl 安装与配置
kubectl 是 Kubernetes 的命令行工具,用于与集群进行交互。无论使用哪种集群方案,都需要正确安装并配置 kubectl。
3.3.1 安装 kubectl
# 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 配置 kubeconfig
kubectl 通过 ~/.kube/config 文件连接集群。Minikube 和 K3s 会自动生成该文件,但有时需要手动合并或切换上下文。
# 查看当前上下文
kubectl config current-context
# 列出所有上下文
kubectl config get-contexts
# 切换上下文(例如从 minikube 切换到 k3s)
kubectl config use-context k3s
# 验证集群连接
kubectl cluster-info
| 命令 | 用途 | 示例输出 |
|---|---|---|
kubectl version --client |
查看客户端版本 | Client Version: v1.28.0 |
kubectl get nodes |
查看集群节点状态 | NAME STATUS ROLES AGE VERSION |
kubectl get pods -A |
查看所有命名空间的 Pod | NAMESPACE NAME READY STATUS |
3.4 Git 仓库准备
GitOps 的核心是将 Git 仓库作为声明式配置的单一事实来源。你需要准备一个 GitHub 或 GitLab 仓库,用于存放 Kubernetes 清单文件和 Flux 配置。
3.4.1 仓库结构设计
推荐采用 环境目录 + 应用目录 的层次结构,便于 Flux 按环境同步:
gitops-repo/
├── clusters/
│ ├── production/
│ │ ├── flux-system/ # Flux 自身组件
│ │ └── apps/ # 生产环境应用
│ └── staging/
│ ├── flux-system/
│ └── apps/
├── apps/
│ ├── nginx/
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── redis/
│ ├── deployment.yaml
│ └── service.yaml
└── README.md
3.4.2 创建仓库并配置访问
GitHub 操作步骤:
- 登录 GitHub,点击右上角 "+" → "New repository"。
- 填写仓库名称(如
gitops-demo),选择 Public 或 Private。 - 勾选 "Add a README file",点击 "Create repository"。
- 在本地克隆仓库:
git clone https://github.com/<用户名>/gitops-demo.git - 创建上述目录结构并推送。
GitLab 操作步骤:
- 登录 GitLab,点击 "New project" → "Create blank project"。
- 输入项目名称(如
gitops-demo),设置可见性级别。 - 克隆到本地:
git clone https://gitlab.com/<用户名>/gitops-demo.git - 初始化目录结构并推送。
注意:如果使用私有仓库,Flux 需要配置部署密钥(Deploy Key)或 Personal Access (PAT)才能拉取代码。后续章节会详细讲解凭证配置。
3.5 环境验证清单
完成上述步骤后,请逐项确认以下检查点:
| 检查项 | 验证命令 | 预期结果 |
|---|---|---|
| 集群运行中 | kubectl get nodes |
节点状态为 Ready |
| kubectl 版本匹配 | kubectl version --short |
Client 与 Server 版本差异 < 1 个次要版本 |
| Git 仓库可访问 | git ls-remote |
返回远程引用列表 |
| 集群内部 DNS 正常 | kubectl run -it --rm dns-test --image=busybox -- nslookup kubernetes.default |
返回 Cluster IP |
3.6 常见问题与排错
- Minikube 启动失败:检查 Docker 是否运行,尝试
minikube delete后重新minikube start。 - K3s 服务未启动:运行
sudo journalctl -u k3s -n 50查看日志,检查端口 6443 是否被占用。 - kubectl 连接超时:确认
KUBECONFIG环境变量指向正确的配置文件,或使用--kubeconfig参数指定路径。 - Git 推送被拒:检查仓库权限,确保已添加 SSH 公钥或使用 HTTPS 凭据。
最佳实践:建议在开始 Flux 安装之前,先运行一个简单的 Nginx Deployment 验证集群功能完整。这能帮助你区分是集群问题还是 Flux 配置问题。
# 快速验证集群
kubectl create deployment nginx-test --image=nginx
kubectl expose deployment nginx-test --port=80 --type=NodePort
kubectl get pods,svc
# 清理测试资源
kubectl delete deployment nginx-test
kubectl delete svc nginx-test