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

相关推荐
Akshsjsjenjd1 小时前
Docker资源限制详解
运维·docker·容器
xrkhy1 小时前
微服务之OpenFeign 服务调用
微服务·云原生·架构
小猪咪piggy2 小时前
【微服务】(2) 环境和工程搭建
微服务·云原生·架构
雲帝3 小时前
1panel docker开启swap内存
运维·docker·容器
陈陈CHENCHEN3 小时前
【Kubernetes】K8s 集群 RBAC 鉴权
kubernetes
qq_264220894 小时前
k8s-Pod详解
云原生·容器·kubernetes
小诸葛的博客4 小时前
k8s localpath csi原理
云原生·容器·kubernetes
小猿姐8 小时前
闲谈KubeBlocks For MongoDB设计实现
mongodb·云原生·kubernetes
thinktik10 小时前
AWS EKS 集成Load Balancer Controller 对外暴露互联网可访问API [AWS 中国宁夏区]
后端·kubernetes·aws