当前位置: 首页 > 科技观察

如何优雅地使用GitOps实现运维自动化

时间:2023-03-15 09:17:08 科技观察

什么是GitOps?GitOps是一组使用开源版本控制系统Git管理基础架构和应用程序配置的实践。GitOps与Git一起作为声明性基础架构和应用程序的单一真实来源。GitOps使用Git拉取请求来自动化基础设施配置和部署的管理。Git存储库包含系统的整个状态,因此可以查看和审计系统状态更改的痕迹。GitOps围绕开发人员体验构建,可帮助团队使用与软件开发相同的工具和流程来管理基础设施。除了Git,GitOps还允许您根据需要选择工具。一、GitOps到底是什么GitOps=InfrastructureasCode(IaC)+MergeRequest(MR)+ContinuousIntegration/ContinuousDelivery(CI/CD)GitOps是一个运维框架,在应用开发阶段最佳实践(如版本控制、协作、合规性和CI/CD工具)并将它们应用于基础设施自动化。与GitOps相比,虽然传统的DevOps已经实现了软件开发生命周期的自动化,但基础架构在很大程度上仍然是一个需要专门团队的手动过程。随着对基础设施的需求不断增长,自动化基础设施变得越来越重要。现代基础设施需要弹性机制(速度和规模)来有效管理持续部署所需的云资源。GitOps系统学习理解GitOps用于自动化基础设施配置的过程,使用配置文件存储即代码(infrastructureascode),配置文件每次部署都会生成相同的基础设施环境,保证环境。一致性,完成整个运维过程的自动化。Trident-InfrastructureasCode(IaC)-TerraformGitOps使用Git存储库作为基础设施定义的单一真实来源,以配置文件的形式存储所有基础设施,并实现应用服务的配置和管理。Trident-合并请求(MR)GitOps使用合并请求作为所有基础设施更新的变更机制。合并请求是团队通过评论和评论进行协作的地方。合并提交到您的主干分支并用作审计日志。Trident-持续集成/持续交付(CI/CD)GitOps使用具有持续集成和持续交付的Git工作流来自动更新基础架构,在合并新代码后,CI/CD管道执行环境中的更改,这避免了手动配置错误等问题。与任何需要协作的工作一样,更改是棘手的,GitOps也不例外。GitOps需要所有相关人员的纪律,这是以新方式做事的承诺。团队记录一切至关重要。2.GitOps的核心是辅助协作,可以覆盖一个应用程序从概念到代码到部署的全过程。GitOps的核心是指将Git仓库作为构建基础设施的唯一可信数据,部署应用源码的所有代码,然后自动将代码部署到不同的云环境中(可以借助Terraform进行资源编排)。每个人都能够在同一个系统中工作,并了解事情的进展情况。无论您是从事基础设施开发还是应用程序开发,所有更改都遵循相同的流程:定义工作主体、将其分配给个人、团队协作,然后使用Git存储库作为唯一可用的数据源来部署该代码用来。GitOps就是关于代码和协作的。使用版本控制系统可确保所有内容均已记录且可见,并且审计跟踪可确保团队合规。对于不同的项目和团队,创建一个新的问题来描述添加的目标和任务(多云平台)。在一个问题中,记录所列任务列表的范围和进度(通过ME合并请求)。GitOps系统学习与理解3.GitOps使用良好实践一个好的运维系统拥有无缝完美的体验,可以增强基础设施、运维和开发团队之间的协作,提高软件环境的稳定性和可靠性,同时部署更快维护安全和保障,这会增强团队的信心。例如:GitOps系统学习与理解[1]版本控制核心-配置文件-声明式系统Git仓库作为所有基础设施和应用部署代码的单一真实来源,通过受保护分支的独特权限,限制用户和使用者谁可以部署到生产团队[2]代码审查团队-促进问题的后续追溯,提高代码质量,传播最佳实践,预防问题[3]持续集成/持续交付部署-无缝体验-与Terraform紧密集成以将其与敏捷管理和源代码管理集成在同一个应用中,支持从物理机、虚拟机、容器到云原生平台的多种基础环境的部署。概念很多,比如DevSecOps、AIOps、MLOps、ChatOps等等,当然还有主角GitOps。GitOps一词出现于2017年,是Weaveworks基于多年云计算基础设施和应用管理经验提出的概念。GitOps体系的学习与理解——乱七八糟的xOps造词运动总的来说,可以使用如下的持续交付体系(示意图)来完成云原生应用的部署和交付。这种从左到右到最后的Push模式虽然很容易实现一键部署,但是也存在一些问题。GitOps体系的学习和理解——完成云原生应用的部署和交付声明式是解决这个问题的关键点。[1]难以保证仓库中的manifest文件内容与k8s集群的实际情况一致[2]不够灵活,镜像更新时不能自动同步到集群,除非部署过程每次从头到尾执行[3]安全合规性可能要求运维人员通过kubectl命令进行一些集群操作。声明式系统有一个特点,可以帮助我们自动完成描述状态和应用或基础设施系统实际状态的自动同步,保证两者能够保持一致。.比如应用部署列表中的应用是一个replica(replicas=1),那么集群端的应用就会是一个pod。GitOps系统学习与理解——关于声明式理解和解决问题的思路GitOps是基于声明式系统,以Git作为单一信任源,即一切都是代码,所以我们可以将上面的构建过程改成如下拉模式。拉取模式的关键是单一可信源与k8s集群的集成。当可信源端的文件列表发生变化时,集群端可以及时捕获变化,完成变化列表的部署。这就需要使用的Git工具支持处理k8s的能力。Git工具可以与Terraform集成,以自动化云基础设施的管理。GitOps系统学习与理解——关于声明式的理解和解决问题的思路。GitOps体系的学习和理解——关于声明式理解和解题思路#--------0.0--------#GitOps仓库代码结构#------------------#多云环境?tree-aGitOpsGitOps└──gitops├──.gitlab-ci.yaml#CI/CD└──environments├──aliyun│├──kubeconfig.yaml#k8s集群配置│├──main.tf#基本设置配置│└──yaml│└──app.yaml#集群服务配置└──k3s└──yaml├──app.yaml#集群服务配置└──kubeconfig.yaml#k8s集群配置使用Git作为单一信任源,过程中所有与软件开发相关的代码(包括基础设施代码、应用源代码、配置等)都将存储在Git仓库中。所有的管理过程都是通过MergeRequests(MR)完成的。当需要对基础设施进行一些改动时,只需要修改代码提交给MR即可。在所有更改都经过审查和批准后,可以将代码合并到master分支上。合并代码更改后,所有更改都将部署到生产环境中。GitOps的优势快速做出改变——更新和回滚人员的工作经验——改进部署流程,提高安全性——仓库的权限分配和合规审计很容易做到——所见即所得GitOps的劣势建立协作文化——逐步培养Git工作流建立-混合云保障服务可用敏感信息处理-敏感信息(结合Vault)-GitSecOps五、GitOps集成ArgoCD实践ArgoCD只是一个持续交付工具,但其实是核心功能点!ArgoCD是一个开源的GitOps持续交付工具,主要面向Kubernetes。现在是CNCF的孵化项目。其整体架构图如下:GitOps系统学习与理解——ArgoCD集成实践ArgoCD以KubernetesController的形式实现,监控Kubernetes集群上运行的应用程序,并报告实际运行状态和预期状态(在是在部署清单文件中指定并存储在版本控制系统中)以供比较。当两种状态不一致时,会提示OutOfSync。此时可以自动或手动完成同步操作,使两种状态再次保持一致。存储在Git存储库中的任何更改都会自动同步到集群端。这其实就是实现GitOps的核心原则。对应用程序或基础设施的所有更改都可以通过对Git存储库进行一些MR或Push操作来实现,并且更改将自动部署。因此,GitOps的核心虽然不是Git,但却与Git息息相关。Git将用作存储部署清单文件的版本控制系统,并将与ArgoCD集成以实现GitOps工作流。整体示意图如下:一个Git实例,一个ArgoCD运行实例GitOps系统学习理解-结合ArgoCD实践【1】安装并启动ArgoCD服务#安装ArgoCD服务(官方)#使用Kustomize完成布局部署listfile#同时使用sops处理Git上敏感信息的存储$kubectlcreatenamespaceargocd$kubectlapply-nargocd-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml#暴露argocd的服务端口$kubectl-nargocdport-forwardpods/argocd-server-6db46c865b-qqnbl8080:8080#获取登录密码$kubectl-nargocdgetsecretargocd-initial-admin-secret-ojsonpath="{.data.password}"|base64-dRDMpJRKRfsmkcgbP#访问ArgoCD服务http://localhost:8080admin/RDMpJRKRfsmkcgbP[2]介绍sops的使用#这个sops是一个开源的加密文件编辑器(以GPG为例)#支持YAML、JSON、ENV、INI和BINARY格式,并支持多种格式加密ption方法#install$brewinstallgnupg$brewinstallsops#生成一对key$gpg--full-generate-key#sops和gpg的组合-创建sops配置文件#encrypted_regex:加密规则;指定哪些字段值需要加密#gpg:加密需要的指纹值$cat>>.sops.yaml<>secret.yaml<