当前位置: 首页 > news >正文

K8S - GitOps 入门实战 - 自动发布与秒级回滚

引言

传统运维依赖手动执行 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 工作流程图

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

安装工具 (Mac 安装为例)
# 1. 安装 Kind(创建本地 Kubernetes 集群)
brew install kind
# 2. 安装 Argo CD CLI(管理 Argo CD)
brew install argocd
# 3. 安装 Docker(构建镜像)
brew install docker

2.创建本地 Kubernetes 集群

kind create cluster --name gitops-demo

3.安装 Argo CD

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 清单

项目结构

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

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

Flask==2.2.2

步骤2:编写 Dockerfile

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

# 替换 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
  1. Kubernetes 清单(manifest )并推送 git 仓库

步骤1:初始化本地 Git 仓库

mkdir gitops-demo && cd gitops-demo  # 创建项目目录并进入该目录
git init  # 初始化 Git 仓库
mkdir -p k8s  # 创建存放 Kubernetes 配置文件的目录

步骤2:编写k8s 清单 :Deployment 和 Service

# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: gitops-demo-app
spec:replicas: 2selector:matchLabels:app: gitops-demo-apptemplate:metadata:labels:app: gitops-demo-appspec:containers:- name: appimage: 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-appports:- port: 80targetPort: 5000type: ClusterIP

步骤3:提交k8s 清单 到 Git 仓库

# 查看 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
• 访问 https://localhost:8080
• 用户名:admin
• 密码:使用上面获取的初始密码

步骤2:创建应用部署策略
• 应用名:gitops-demo
• 仓库 URL:https://github.com/your-username/gitops-demo.git
• 路径:k8s
• 目标集群:https://kubernetes.default.svc
• 同步策略:勾选 Automated(自动同步)和 Prune(清理无用资源)

2.验证集群部署结果

kubectl get pods -l app=gitops-demo-app
# 预期输出:2Pod 状态为 Running

到这里我们已经完成gitops 自动部署的准备工作,下面可以演示自动发布和自动回滚了。

2.5 自动发布演示

1.更新应用代码 -> 构建新镜像 ->推送镜像仓库

# 修改 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仓库

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.验证新版本镜像已同步到集群

  执行命令验证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仓库

# 故意写入无效镜像版本
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 清单

git revert HEAD
git push origin main

4.验证恢复状态

• Argo CD 自动同步到上一版本,Pod 恢复为 v2运行。

三、总结

3.1 核心总结

GitOps 的核心价值:

• 零手动干预:从代码提交到集群发布全链路自动化。

• 版本即状态:Git 提交历史记录集群状态变迁,支持分钟级回滚。

• 企业级可观测:Argo CD开箱即用,通过 其 Web UI 配置管理及实时监控资源健康状态。

相关文章:

  • Go 写一个简单的Get和Post请求服务
  • k8s平台:手动部署Grafana
  • Linux基础 -- Generic Netlink 框架详解与开发实践
  • 数据资产管理与AI融合:物联网时代的新征程
  • Wireshark使用教程
  • 进程、线程、进程间通信Unix Domain Sockets (UDS)
  • 【自然语言处理与大模型】大模型意图识别实操
  • 一文详解 Linux下的开源打印系统CUPS(Common UNIX Printing System)
  • 回收铼树脂RCX-5143
  • 航电系统之网络控制运动技术篇
  • 2025年4月通信科技领域周报(4.21-4.27):6G标准加速推进 空天地一体化网络进入实测阶段
  • 极光PDF编辑器:高效编辑,轻松管理PDF文档
  • (Go Gin)Gin学习笔记(五)会话控制与参数验证:Cookie使用、Sessions使用、结构体验证参数、自定义验证参数
  • 合并多个Excel文件到一个文件,并保留格式
  • 区块链+医疗:破解数据共享困局,筑牢隐私安全防线
  • Copilot 祝你走在AI前沿:2025 年 4 月动态
  • HTML5好看的水果蔬菜在线商城网站源码系列模板8
  • Copilot总结Word长文档功能更新升级
  • PCB设计工艺规范(一)概述
  • MCP Server 的 Stdio 与 SSE:两种通信方式的本质差异与技术选型指南
  • 应急管理部派出工作组赴山西太原小区爆炸现场指导救援处置
  • 澎湃回声丨23岁小伙“被精神病8年”续:今日将被移出“重精”管理系统
  • 媒体:黑话烂梗包围小学生,“有话好好说”很难吗?
  • 民生银行一季度净利127.42亿降逾5%,营收增7.41%
  • 上汽集团一季度净利润30.2亿元,同比增长11.4%
  • 探索演艺产业新路径,2万观众走进音乐科技融创节