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

【架构实战】GitOps实践:让运维更优雅

【架构实战】GitOps实践让运维更优雅字数统计约3600字一、真实故事引入一次误删引发的运维革命2024年春天我们团队负责维护一个拥有23个微服务的K8s生产集群当时的运维方式还停留在半自动化阶段修改ConfigMap、调整Deployment副本数、更新镜像版本等操作都需要运维人员登录跳板机手动执行kubectl apply -f命令。有一次新入职的运维同学在处理一个紧急需求时误执行了kubectl delete deployment order-service -n prod导致订单服务整个被删除集群中订单相关的Pod全部消失线上订单功能瘫痪了12分钟。虽然我们通过etcd备份快速恢复了Deployment但这次事故让我们惊出一身冷汗——如果备份不是最新的或者误操作的是数据库相关的资源后果不堪设想。事故复盘时我们意识到所有的配置变更都不应该直接操作集群而应该像管理代码一样管理配置所有的变更都有记录、可回滚。于是我们引入了GitOps理念用Argo CD作为核心工具把所有的K8s资源配置都存储在Git仓库中从此运维变成了提交PR、合并代码的简单操作再也没出现过误删、配置不一致的问题。二、概念原理GitOps到底是什么GitOps是Weaveworks在2017年提出的一种云原生运维理念核心思想是把Git作为系统的唯一事实来源所有的系统配置、应用部署、环境变更都通过Git来管理通过自动化工具将Git中的配置同步到生产环境。2.1 GitOps四大核心原则声明式配置所有的系统状态都用声明式的配置文件如K8s的YAML描述而不是命令式的脚本版本控制为唯一真相源所有的配置都存储在Git仓库中只有Git中的配置才是合法的任何直接修改集群的操作都会被自动纠正自动化同步有专门的工具如Argo CD、Flux自动监听Git仓库的变更将配置同步到目标集群闭环自愈当集群的实际状态和Git中的期望状态不一致时自动化工具会自动纠正确保状态一致2.2 GitOps vs 传统CI/CD很多人会混淆GitOps和传统CI/CD两者的核心区别传统CI/CD聚焦构建→测试→部署的流程部署是流程的终点部署后流程结束GitOps聚焦配置管理→自动同步→状态保持部署只是同步的一个环节之后会持续监控状态一致性两者不是替代关系而是互补CI/CD负责构建制品GitOps负责部署和管理制品的生命周期。2.3 核心工具选型目前主流的GitOps工具有两个Argo CDWeaveworks开源UI友好支持多集群可视化程度高社区活跃Flux CDCNCF毕业项目轻量级和K8s原生集成更好适合云原生深度用户我们选择了Argo CD主要是因为它的UI界面对非技术人员更友好且支持多租户管理。三、配置代码从零搭建GitOps体系3.1 部署Argo CD到K8s集群# 1. 创建专用命名空间kubectl create namespace argocd# 2. 部署Argo CD稳定版本kubectl apply-nargocd-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml# 3. 等待所有Pod就绪kubectlwait--forconditionready pod-lapp.kubernetes.io/nameargocd-server-nargocd--timeout300s# 4. 获取初始管理员密码kubectl-nargocd get secret argocd-initial-admin-secret-ojsonpath{.data.password}|base64-d# 5. 暴露Argo CD UI临时用NodePort生产建议用Ingresskubectl patch svc argocd-server-nargocd-p{spec: {type: NodePort}}3.2 配置Git仓库与Application我们的GitOps配置仓库结构采用base overlays的kustomize标准结构gitops-config/ ├── base/ │ ├── coupon-service/ │ │ ├── deployment.yaml │ │ ├── service.yaml │ │ └── kustomization.yaml │ └── order-service/ │ ├── deployment.yaml │ ├── service.yaml │ └── kustomization.yaml └── overlays/ ├── test/ │ ├── coupon-service/ │ │ ├── patch-replicas.yaml # 测试环境2副本 │ │ └── kustomization.yaml │ └── order-service/ │ ├── patch-replicas.yaml │ └── kustomization.yaml └── prod/ ├── coupon-service/ │ ├── patch-replicas.yaml # 生产环境5副本 │ ├── patch-resources.yaml # 生产环境资源限制更高 │ └── kustomization.yaml └── order-service/ ├── patch-replicas.yaml └── kustomization.yamlbase/coupon-service/kustomization.yaml示例apiVersion:kustomize.config.k8s.io/v1beta1kind:Kustomizationresources:-deployment.yaml-service.yamlcommonLabels:app:coupon-serviceoverlays/prod/coupon-service/kustomization.yaml示例apiVersion:kustomize.config.k8s.io/v1beta1kind:Kustomizationbases:-../../../base/coupon-servicepatches:-path:patch-replicas.yaml-path:patch-resources.yamlpatch-replicas.yaml示例apiVersion:apps/v1kind:Deploymentmetadata:name:coupon-servicespec:replicas:53.3 创建Argo CD Application我们通过Argo CD的CRD自定义资源来管理每个应用的同步规则创建coupon-service-prod.yamlapiVersion:argoproj.io/v1alpha1kind:Applicationmetadata:name:coupon-service-prodnamespace:argocdspec:project:default# 配置源Git仓库信息source:repoURL:https://gitlab.example.com/infra/gitops-config.gittargetRevision:mainpath:overlays/prod/coupon-service# 如果用kustomize需要指定kustomize版本kustomize:version:v1.27.0# 目标集群信息destination:server:https://kubernetes.default.svc# 默认是Argo CD所在的集群跨集群需要配置集群凭证namespace:prod# 同步策略syncPolicy:automated:prune:true# 自动删除Git中不存在的资源selfHeal:true# 当集群状态不一致时自动纠正syncOptions:-CreateNamespacetrue# 如果目标命名空间不存在则自动创建-PrunePropagationPolicyforeground# 健康检查ignoreDifferences:-group:appskind:DeploymentjsonPointers:-/spec/replicas# 忽略副本数的差异如果需要手动扩缩容的话部署这个Applicationkubectl apply-fcoupon-service-prod.yaml四、实战案例用GitOps管理23个微服务的完整流程我们的生产集群有23个微服务所有配置都存储在gitops-config仓库中完整流程如下4.1 日常变更流程以调整优惠券服务副本数为例运维或开发人员在gitops-config仓库中修改overlays/prod/coupon-service/patch-replicas.yaml的副本数从5调整为8提交PR到main分支经过团队code review后合并Argo CD每3分钟自动检测Git仓库变更也可配置Webhook即时触发检测到变更后Argo CD对比Git中的期望状态和集群中的实际状态发现副本数不一致Argo CD自动执行kubectl set replicas deployment/coupon-service 8 -n prod同步完成后Argo CD UI显示Healthy状态同时发送企业微信通知整个过程不需要登录任何服务器从提交代码到变更生效最快1分钟完成且所有的变更都有Git提交记录可审计、可回滚。4.2 紧急回滚场景有一次我们上线一个新版本的订单服务发现有一个严重的bug需要回滚到上一个版本在Git仓库中找到上一个版本的commit hasha1b2c3d执行git revert a1b2c3d或者直接git reset --hard a1b2c3d根据团队规范合并到main分支Argo CD自动同步将订单服务回滚到上一个版本整个过程5分钟完成比原来的kubectl rollout undo更可追溯因为Git中有明确的回滚记录4.3 多环境管理我们的配置仓库有test、pre-prod、prod三个环境的overlays修改配置时只需要同步修改三个目录下的文件或者用一个通用的base加环境特定的patch避免配置漂移。Argo CD中可以直观看到每个环境的应用状态一键同步某个环境的所有应用。五、踩坑实录GitOps落地过程中的那些坑5.1 Git仓库权限配置错误现象Argo CD同步时报permission denied错误无法拉取Git仓库原因Argo CD使用的SSH密钥没有Git仓库的读取权限解决在Argo CD中创建Secret存储SSH私钥kubectl create secret generic git-creds --from-filessh-privatekey~/.ssh/id_rsa -n argocd在Application中引用这个Secretsource:repoURL:gitgitlab.example.com:infra/gitops-config.gittargetRevision:mainpath:overlays/prod/coupon-servicehelm:# 如果是Helm的话kustomize:# 如果是kustomize的话# 配置凭证auth:sshPrivateKeySecret:name:git-credskey:ssh-privatekey5.2 同步时资源冲突现象同步时报object is being deleted错误无法更新资源原因之前手动删除了某个资源Argo CD还在处理删除流程新的同步请求冲突解决等待删除流程完成或者手动删除Argo CD中的资源缓存argocd app terminate-op coupon-service-prod5.3 镜像版本漂移问题现象有时候发现集群中的镜像版本和Git中的不一致Argo CD没有自动纠正原因我们在Application中配置了ignoreDifferences忽略了镜像版本的差异导致Argo CD不检测镜像变化解决去掉不必要的ignoreDifferences配置只忽略确实需要手动调整的部分如副本数5.4 Secret管理难题现象K8s的Secret是base64编码不是加密不能直接存在Git中解决引入Bitnami SealedSecrets将加密后的Secret存在Git中Argo CD同步时SealedSecrets控制器自动解密成正常的Secret# 安装SealedSecrets控制器kubectl apply-fhttps://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml# 加密Secretkubectl create secret generic db-secret --from-literalusernameadmin --from-literalpassword123456--dry-runclient-oyaml|kubeseal-oyamlsealed-db-secret.yaml把sealed-db-secret.yaml存在Git中即可安全且可追溯。5.5 跨集群同步问题现象Argo CD部署在集群A要同步配置到集群B报连接超时原因集群B的API Server地址是内网地址Argo CD所在的集群A无法访问解决在Argo CD中配置集群B的kubeconfig或者给集群B的API Server配置公网访问生产不建议或者用VPC对等连接打通两个集群的网络。六、总结与思考6.1 核心总结GitOps让我们实现了运维即代码核心价值可追溯所有变更都有Git提交记录谁改了什么、什么时候改的、为什么改一目了然可回滚改错了只需要git revert不需要手动操作集群回滚时间从原来的30分钟缩短到5分钟减少人为错误杜绝直接操作集群的行为所有变更都经过code review和自动化同步环境一致性测试、预发、生产环境的配置都来自同一个base避免配置漂移6.2 思考题GitOps适合所有场景吗比如有状态服务数据库、消息队列的配置是否适合用GitOps管理如果Git仓库被恶意篡改如何防止错误的配置同步到生产环境提示签名验证、分支保护规则GitOps和IaC基础设施即代码是什么关系如何结合使用6.3 个人观点GitOps不是什么高深的技术而是一种把运维当代码管的理念它让运维变得更优雅、更可控。但落地GitOps也不是一蹴而就的需要团队转变理念开发人员要学习写K8s YAML不能再只关注代码运维人员要从执行命令的人变成维护Git配置和自动化工具的人团队要建立完善的Git workflow比如分支保护、PR review、自动化测试另外GitOps工具不是万能的Argo CD和Flux各有优劣选择适合自己团队的才是最好的。对于小团队如果只有几个服务用Flux更轻量对于中大型团队Argo CD的UI和多租户能力更有优势。

相关文章:

【架构实战】GitOps实践:让运维更优雅

【架构实战】GitOps实践:让运维更优雅 字数统计:约3600字 一、真实故事引入:一次误删引发的运维革命 2024年春天,我们团队负责维护一个拥有23个微服务的K8s生产集群,当时的运维方式还停留在"半自动化"阶段&a…...

Atom CMS v2.0 SQL注入漏洞深度剖析与三层加固方案

1. 这不是“又一个SQL注入”,而是CMS底层架构失守的典型切片Atom CMS v2.0在2022年被公开披露的CVE-2022-24223漏洞,表面看是一处参数未过滤导致的SQL注入,但实际复现和分析后你会发现:它根本不是开发人员随手漏掉了一个mysql_rea…...

Windows安卓应用安装器终极指南:告别模拟器,轻松在电脑上运行手机应用

Windows安卓应用安装器终极指南:告别模拟器,轻松在电脑上运行手机应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想在Windows电脑…...

3步搞定日语Galgame翻译的终极方案:TsubakiTranslator完全指南

3步搞定日语Galgame翻译的终极方案:TsubakiTranslator完全指南 【免费下载链接】TsubakiTranslator 一款Galgame文本翻译工具,支持Textractor/剪切板/OCR翻译 项目地址: https://gitcode.com/gh_mirrors/ts/TsubakiTranslator 还在为看不懂日语Ga…...

让Office界面真正属于你:Office RibbonX Editor的个性化定制之道

让Office界面真正属于你:Office RibbonX Editor的个性化定制之道 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribb…...

神经网络幻觉的本质与四层防御实战指南

1. 这不是“胡说八道”,是模型在用概率拼图——神经网络幻觉的本质与真实战场 “神经网络会幻觉”这个说法,这几年在技术社区、媒体标题甚至投资人会议里出现的频率,已经快赶上“算力瓶颈”和“数据飞轮”了。但绝大多数人听到这个词的第一反…...

ncmdump:网易云NCM音乐解密转换终极指南

ncmdump:网易云NCM音乐解密转换终极指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐时代,网易云音乐的NCM加密格式成为众多音乐爱好者的使用障碍。ncmdump作为一款高效的开源解密工具&#xff…...

5分钟快速上手:TegraRcmGUI Switch注入图形化工具终极指南

5分钟快速上手:TegraRcmGUI Switch注入图形化工具终极指南 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Nintendo Switc…...

硬件性能突破:免费AMD处理器调试工具SMUDebugTool终极指南

硬件性能突破:免费AMD处理器调试工具SMUDebugTool终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...

如何快速掌握专业字体设计:开源Bebas Neue字体完全指南

如何快速掌握专业字体设计:开源Bebas Neue字体完全指南 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 你是否曾经在设计项目中被字体选择困扰?面对那些要么过于普通缺乏个性,…...

RK3568播放RTSP摄像头实测:软解1080P直接CPU跑满,降到360P才流畅,硬解到底怎么搞?

RK3568 RTSP摄像头解码实战:从软解瓶颈到硬解优化全解析 最近在调试RK3568开发板的RTSP摄像头播放功能时,遇到了一个典型问题:1080P软解直接让CPU跑满,降到360P才能勉强流畅。这让我开始深入探索瑞芯微平台的硬解方案&#xff0c…...

如何在5分钟内实现游戏手柄控制PC:Gopher360终极指南

如何在5分钟内实现游戏手柄控制PC:Gopher360终极指南 【免费下载链接】Gopher360 Gopher360 is a free zero-config app that instantly turns your Xbox 360, Xbox One, or even DualShock controller into a mouse and keyboard. Just download, run, and relax. …...

CMU localPlanner算法深度解析:从‘采样路径’到‘最优选择’的完整决策逻辑与代码实现

CMU localPlanner算法深度解析:从路径采样到最优决策的工程实现 在移动机器人导航领域,路径规划算法的实时性与可靠性直接决定了系统的整体性能。CMU团队开源的localPlanner以其独特的"采样-评估-选择"架构,在复杂环境中展现出卓越…...

AI工程化落地的五大技术坐标:Agent、MoE、端云协同与可观测性

1. 这份AI周刊到底在讲什么?一个从业十年的观察者视角你点开这份标题叫《This AI newsletter is all you need #91》的邮件,第一反应可能是:又一份信息过载的AI速报?别急,先放下“刷完就忘”的惯性。作为一个从2014年就…...

深度解析yuzu模拟器:Switch游戏跨平台运行的技术架构与实战应用

深度解析yuzu模拟器:Switch游戏跨平台运行的技术架构与实战应用 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu模拟器作为当前最先进的任天堂Switch开源模拟器,实现了在Windows、Linux…...

Bebas Neue 开源字体深度解析:几何美学的技术实现与实战应用

Bebas Neue 开源字体深度解析:几何美学的技术实现与实战应用 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue Bebas Neue 作为全球最受欢迎的开源几何无衬线字体,以其极简设计、高度统一的…...

告别串口调试烦恼:用MAX3221EUE+芯片搞定TTL转RS232的完整电路与PCB布局指南

告别串口调试烦恼:用MAX3221EUE芯片搞定TTL转RS232的完整电路与PCB布局指南 在嵌入式开发中,与老式工控设备或带DB9接口的PC通信时,TTL与RS232之间的电平转换是个绕不开的坎。不少开发者都遇到过这样的场景:代码调试一切正常&…...

微信小程序逆向工程深度突破:wxappUnpacker实战解密与架构解析

微信小程序逆向工程深度突破:wxappUnpacker实战解密与架构解析 【免费下载链接】wxappUnpacker forked from https://github.com/qwerty472123/wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 在移动应用开发领域&#xff0c…...

Vitis 2021.2自定义IP从Platform到App的完整避坑指南:头文件、宏定义与QEMU报错一网打尽

Vitis 2021.2自定义IP全流程开发实战:从Platform构建到多核调试的深度解析 在FPGA开发领域,Xilinx的Vitis统一软件平台为开发者提供了从硬件设计到软件开发的完整工具链。然而,当涉及到自定义IP集成时,即使是经验丰富的工程师也常…...

5分钟极速汉化:让Android Studio告别英文困扰的终极方案

5分钟极速汉化:让Android Studio告别英文困扰的终极方案 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Androi…...

后视摄像系统全解析:从CCD/CMOS到LVDS/以太网,选型安装避坑指南

1. 项目概述:从“选配”到“标配”的视觉革命如果你在最近五年内买过新车,或者关注过汽车配置单,一定会发现一个现象:那个曾经只在高端车型上出现,或者需要额外加钱选装的“倒车影像”功能,现在几乎成了所有…...

初创团队如何通过Taotoken模型广场选型并控制AI成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创团队如何通过Taotoken模型广场选型并控制AI成本 对于资源有限的初创团队而言,将大模型能力集成到产品中是加速创新…...

Windows 11终极优化指南:用开源神器Win11Debloat快速清理系统垃圾

Windows 11终极优化指南:用开源神器Win11Debloat快速清理系统垃圾 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declu…...

欧姆龙G9SP安全PLC与NB触摸屏串口通讯实战:从硬件接线到程序调试的保姆级避坑指南

欧姆龙G9SP安全PLC与NB触摸屏串口通讯实战:从硬件接线到程序调试的保姆级避坑指南 在工业自动化现场,安全PLC与人机界面(HMI)的可靠通讯是保障设备安全运行的关键环节。欧姆龙G9SP系列安全PLC以其卓越的安全性能和灵活的扩展能力…...

告别手动抓瞎:用vmp3-import-fix-x86和Universal Import Fixer搞定VMP3.5壳的IAT修复

VMP3.5壳IAT修复的高效工具链实践指南 逆向工程领域里,VMProtect始终是令人又爱又恨的存在。特别是3.5版本引入的IAT混淆机制,让不少安全研究员在深夜调试时抓狂。传统手动修复不仅耗时耗力,还容易遗漏关键调用。经过多次实战验证&#xff0…...

Unity GAS技能框架实战:客户端预测与策划配置系统

1. 这不是又一个“Hello World”式GAS教程——它解决的是你项目里真正卡住进度的骨架问题 如果你正在用Unity开发中大型动作游戏、RPG或ARPG,大概率已经听说过Gameplay Ability System(GAS),也大概率在某个深夜对着官方文档发呆&a…...

Linux服务器网络断了别慌!手把手教你用nmcli命令快速诊断与恢复连接(实战排错指南)

Linux服务器网络故障急救指南:nmcli命令实战排错全解析 凌晨三点,服务器监控突然告警,SSH连接中断,业务系统全面瘫痪——这是每位运维工程师都经历过的噩梦时刻。当远程连接彻底断开,仅剩控制台可用时,掌握…...

无监督聚类中的特征选择:原理、陷阱与工业级实践

1. 项目概述:为什么无监督聚类中的特征选择,比你想象中更难也更重要“Feature selection for unsupervised problems: the case of clustering”——这个标题乍看像一篇论文的副标题,但如果你真在工业场景里做过客户分群、设备异常模式挖掘、…...

从‘理想采样’到‘现实妥协’:聊聊三电阻电流采样方案里那些不得不做的优化(以FOC矢量控制为例)

从‘理想采样’到‘现实妥协’:三电阻电流采样方案的设计哲学与工程智慧 在电机控制领域,电流采样如同一位沉默的指挥家,用精确的数据引导着PWM交响乐章的每个音符。当我们从教科书走向真实工程现场时,会发现那些看似完美的理论方…...

告别拥塞:手把手优化Dragonfly网络性能,UGAL-LVC_H算法详解与配置

告别拥塞:手把手优化Dragonfly网络性能,UGAL-LVC_H算法详解与配置 在数据中心网络架构中,Dragonfly拓扑以其高度可扩展性和低直径特性脱颖而出,成为超大规模计算环境的理想选择。然而,当面对对抗性流量模式时&#xff…...