引言
传统运维依赖手动执行 kubectl apply或脚本推送应用,存在环境差异、操作记录缺失、回滚缓慢等痛点。
GitOps以 Git 为唯一可信源,通过声明式配置和版本化回滚,重构 Kubernetes 交付流程,带来以下优势:
• 环境一致性:多环境配置集中托管于 Git,消除人工干预风险。
• 审计追溯:所有变更通过 Git 提交记录追踪,天然合规。
• 秒级回滚:基于 Git 历史版本快速恢复集群状态,故障恢复效率提升 90%+。
一、GitOps 核心原理
1.1 GitOps 三大支柱
关键说明:
1.声明式配置
• 唯一可信源:所有变更通过 Git 提交,禁止人工直接操作集群。
• 版本化追踪:Git 提交历史天然记录操作人、时间及变更内容。
2.状态同步
• 强制一致性:集群配置偏离 Git 定义时,自动触发修复(如误删 Deployment 自动重建)。
• 差异可视化:UI 直接对比镜像版本、环境变量等关键字段差异。
3.自动化恢复
• 快速回退:直接回滚 Git 提交 → 触发同步 → 集群秒级还原。
• 安全防护:同步前自动校验 YAML 合法性,拦截非法配置。
1.2 Argo CD 简介
Argo CD 是一个用于 Kubernetes 的声明式 GitOps 持续交付工具,用于 Kubernetes 应用的管理与部署。
Argo CD 核心组件:
组件 | 职责 |
---|---|
API Server | 提供Web UI、CLI和API接口 |
Repo Server | 拉取并解析Git仓库中的资源配置文件 |
Application Controller | 同步配置到集群,并持续监控状态一致性 |
二、GitOps 自动化发布与回滚实战
2.1 目标与工作流程
1.目标
通过 Argo CD实现以下核心能力:
• 自动发布:提交 Git 代码后,自动同步到 Kubernetes 集群。
• 秒级回滚:当配置错误时,一键回退到历史版本。
2.gitops 工作流程
gitops 工作流程图
java
A[修改代码] --> B[构建镜像并推送]
B --> C[更新 Deployment 镜像版本]
C --> D[提交到 Git 仓库]
D --> E[Argo CD 检测 Git 变更]
E --> F[自动同步到集群]
F --> G[应用新版本]
G --> H{运行正常?}
H -->|是| I[流程结束]
H -->|否| J[Git 回滚到历史版本]
J --> E
流程解析
1.自动发布流程
• 修改代码:开发者更新代码。
• 构建并推送镜像:打包代码为镜像,推送到仓库。
• 更新 Deployment 镜像版本:更新 deployment.yaml,指向新镜像。
• 提交到 Git:推送代码和配置更新至 Git。
• Argo CD 检测变更:Argo CD 监控 Git 仓库。
• 自动同步到集群:Argo CD 自动同步配置到集群。
• 应用新版本:K8s 替换旧版本的 Pod。
2.秒级回滚流程
• 检测运行状态:发现异常(如 Pod 崩溃)。
• Git 回滚:回退到历史版本。
• Argo CD 重新同步:Argo CD 自动同步恢复集群状态。
实战部分
2.2 环境搭建
1.安装必要工具
确保已安装并配置好以下环境:
Kubernetes 集群(可使用 Minikube 或 Kind 进行本地测试)
kubectl命令行工具
Docker(用于构建镜像)
Argo CD CLI (管理 Argo CD)
安装 Argo CD
java
安装工具 (以Mac 安装为例)
# 1. 安装 Kind(创建本地 Kubernetes 集群)
brew install kind
# 2. 安装 Argo CD CLI(管理 Argo CD)
brew install argocd
# 3. 安装 Docker(构建镜像)
brew install docker
2.创建本地 Kubernetes 集群
java
kind create cluster --name gitops-demo
3.安装 Argo CD
java
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 等待 Argo CD Pod 就绪(约1分钟)
kubectl wait --for=condition=Ready pods --all -n argocd --timeout=300s
# 端口转发访问 Web UI
kubectl port-forward svc/argocd-server -n argocd 8080:443 &
# 获取初始密码
echo "Argo CD 初始密码:" $(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)
2.3 准备应用镜像和 k8s 清单
项目结构
java
gitops-demo/
│── .git/ # Git 版本控制数据(隐藏目录)
│── .gitignore
│── app/ # Flask 应用代码
│ ├── Dockerfile # 构建 Docker 镜像
│ ├── app.py # 应用主文件
│ ├── requirements.txt
│── k8s/ # Kubernetes 部署配置
│ ├── deployment.yaml # 部署配置文件
│ ├── service.yaml # 服务配置文件
│── README.md
注:下文提到的
• your-username请替换为 你自己的 GitHub 仓库地址。
• your-dockerhub-username请替换为 你自己的 Docker Hub 账号。
1.准备应用代码与镜像
步骤1:创建极简 Flask 应用
app/app.py
java
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "GitOps Demo v1"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
app/requirements.txt
java
Flask==2.2.2
步骤2:编写 Dockerfile
java
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
步骤3:构建并推送镜像到 Docker Hub
java
# 替换 your-dockerhub-username 为你的账号
docker build -t your-dockerhub-username/gitops-demo-app:v1 ./app
# 登录 Docker Hub
docker login
# 推送镜像
docker push your-dockerhub-username/gitops-demo-app:v1
- Kubernetes 清单(manifest )并推送 git 仓库
步骤1:初始化本地 Git 仓库
java
mkdir gitops-demo && cd gitops-demo # 创建项目目录并进入该目录
git init # 初始化 Git 仓库
mkdir -p k8s # 创建存放 Kubernetes 配置文件的目录
步骤2:编写k8s 清单 :Deployment 和 Service
java
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitops-demo-app
spec:
replicas: 2
selector:
matchLabels:
app: gitops-demo-app
template:
metadata:
labels:
app: gitops-demo-app
spec:
containers:
- name: app
image: your-dockerhub-username/gitops-demo-app:v1 # 替换为你的镜像
ports:
- containerPort: 5000
# k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
name: gitops-demo-app
spec:
selector:
app: gitops-demo-app
ports:
- port: 80
targetPort: 5000
type: ClusterIP
步骤3:提交k8s 清单 到 Git 仓库
java
# 查看 k8s 目录下的文件
ls k8s
# 输出结果:
# deployment.yaml
# service.yaml
# 添加 k8s 目录下的所有文件到git暂存区
git add k8s
# 提交
git commit -m "Add Kubernetes deployment and service files"
# 关联远程仓库(如果未关联过)
git remote add origin https://github.com/your-username/gitops-demo.git # 替换为你的 Git 仓库
# 推送代码到远程仓库,并设置main 分支为默认上游分支
git push -u origin main
2.4 配置 Argo CD (实现自动部署)
1.配置Argo CD
步骤1:登录 Argo CD Web UI
• 用户名:admin
• 密码:使用上面获取的初始密码
步骤2:创建应用部署策略
• 应用名:gitops-demo
• 仓库 URL:https://github.com/your-username/gitops-demo.git
• 路径:k8s
• 目标集群:https://kubernetes.default.svc
• 同步策略:勾选 Automated(自动同步)和 Prune(清理无用资源)
2.验证集群部署结果
java
kubectl get pods -l app=gitops-demo-app
# 预期输出:2 个 Pod 状态为 Running
到这里我们已经完成gitops 自动部署的准备工作,下面可以演示自动发布和自动回滚了。
2.5 自动发布演示
1.更新应用代码 -> 构建新镜像 ->推送镜像仓库
java
# 修改 app/app.py 的返回内容
return "GitOps Demo v2"
# 构建并推送新镜像
docker build -t your-dockerhub-username/gitops-demo-app:v2 ./app
docker push your-dockerhub-username/gitops-demo-app:v2
2.更新 Deployment 镜像版本 -> 推送 git仓库
java
sed -i '' 's/v1/v2/g' k8s/deployment.yaml
git add . && git commit -m "Update to v2" && git push origin main
3.观察 Argo CD 自动同步
• 在 Argo CD UI中查看应用状态变为 Synced。
4.验证新版本镜像已同步到集群
java
执行命令验证pod 镜像版本
# 获取所有标签为 app=gitops-demo-app 的 Pod 的第一个容器镜像名称
kubectl get pods -l app=gitops-demo-app -o jsonpath="{.items[*].spec.containers[0].image}"
# 输出:your-dockerhub-username/gitops-demo-app:v2
2.6 秒级回滚演示
1.提交错误配置到 deployment文件 -> 推送Git仓库
java
# 故意写入无效镜像版本
sed -i '' 's/v2/invalid/g' k8s/deployment.yaml
git add . && git commit -m "Break the app" && git push origin main
2.观察 Argo CD 同步失败
• Argo CD 状态变为 Degraded,Pod 状态为 ImagePullBackOff。
3.通过 Git 回滚 K8S 清单
java
git revert HEAD
git push origin main
4.验证恢复状态
• Argo CD 自动同步到上一版本,Pod 恢复为 v2运行。
三、总结
3.1 核心总结
GitOps 的核心价值:
• 零手动干预:从代码提交到集群发布全链路自动化。
• 版本即状态:Git 提交历史记录集群状态变迁,支持分钟级回滚。
• 企业级可观测:Argo CD开箱即用,通过 其 Web UI 配置管理及实时监控资源健康状态。