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 工作流程图

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
  1. 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

• 访问 https://localhost:8080

• 用户名: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 配置管理及实时监控资源健康状态。

相关推荐
jk英菲尼迪4 小时前
Windows系统安装Docker(Win10系统升级,然后安装)
运维·docker·容器
国际云,接待6 小时前
甲骨文云2025深度解析:AI驱动的云原生生态与全球化突围
运维·服务器·人工智能·云原生·性能优化·云计算·量子计算
野生绿箭侠7 小时前
Docker 部署 flink1.19.2
运维·docker·容器
小马爱打代码9 小时前
K8S - 命名空间实战 - 从资源隔离到多环境管理
云原生·容器·kubernetes
qq74223498410 小时前
AI开发者的Docker实践:汉化(中文),更换镜像源,Dockerfile,部署Python项目
python·docker·容器
佳腾_11 小时前
【分布式系统中的“瑞士军刀”_ Zookeeper】二、Zookeeper 核心功能深度剖析与技术实现细节
分布式·zookeeper·云原生·集群管理·命名服务
欧先生^_^11 小时前
删除k8s某命名空间,一直卡住了怎么办?
云原生·容器·kubernetes
王中阳Go14 小时前
最新字节跳动运维云原生面经分享
运维·后端·云原生·面试·golang
阿湯哥14 小时前
外部访问 Kubernetes 集群中 MQ 服务的方案
云原生·容器·kubernetes