Principles of GitOps
【本文内容】
- 什么是GitOps?
- 为什么GitOps受欢迎?GitOps好处。
1. 什么是GitOps
Infrastructure as Code
并不只是程序的源代码才叫Code
。相应的,网络配置、Configuration配置(如Kubernetes yaml文件)、Policy配置(如Webserver跳转Policy)、Security配置,都是Code的一种 --> 即X as Code
。
比如:创建Kubernetes组件,一般情况下会定义一系列的yaml配置文件,然后将配置应用到生产环境。
【传统的做法】
- DevOps人员在他的本地电脑上创建上述文件,并在本地测试。
- DevOps人员把配置上传到了Git Repository上,以便可以保留历史版本。
每个人都能查看并且提交修改,通常会直接提交到main branch下。
每次配置的提交没有自动化测试,有可能提交上来的yaml文件是不可用的,或者这个版本的改动会影响到已经存在的配置。 - 那么这个配置怎么生效呢?DevOps人员通过登陆到Kubernetes集群中,通过kubectl命令(如
kubectl apply -f <filename>
)使这些配置生效。
即每个Team member可能都有登陆Kubernetes集群并修改这些配置的权限。 - 这会导致不知道谁在什么时候run过上述的命令。也无法追踪是不是在run命令的时候使用了错误的配置。
即尽管我们遵循着X as Code
的理念,即把一切都变成了Code,并上传到Git Repo上,但因为手工的execute过程依然无法把整个流程串起来。
【GitOps做法】
即把Infrastructure Code当做Project Code来对待,也有CI/CD的过程,而不是人工的在生产环境中apply/execute。
image.png
- 首先上述的Kubernetes yaml文件,依然会上传到Git Repository中,和传统的不一样的是,任何人都不能随意的在Main Branch上直接改,而是需要先拉一个分支,在自己的分支上做修改。
- 在这个分支上,有CI Pipeline(可以验证这些配置文件,自动化测试等)。
- 等这些改动都测试完毕后,另些一些组员可以Approve这些改动。
- 最后才Merge到Main branch上,在Main branch上有CD Pipeline,即部署到相应的环境中(比如Kubernetes集群配置的改动)。
这些流程听上去是不是很熟悉?因为我们的程序代码就是这样被部署到Production中的(即完全的CI/CD)。
GitOps的优点:
-
Automated Process
:自动化的配置部署流程。 -
More Transparent
:更透明,而不是Ops人员手工敲命令。 -
High Quality Infrastructure Code
:让配置文件的代码质量变的更高。
2. CD Pipeline: Push vs Pull Model
所同上述所介绍的,当配置文件Merge到Main Branch后,就自动触发了CD Pipeline(即自动将配置部署到目标机器上,而不是通地Ops人员手动远程输命令配置)。
【GitOps提供了两种方式来触发】:
-
Push Deployment
:这个方式比较熟悉,因为传统的DevOps中就经常用到,比如通过Jenkins
build,再通过post的方式,PUSH到目标的Server中。 -
Pull Deployment
:在目标Server中预先安装了Agent,再从Git Repository中PULL配置文件,Agent会隔一段时间去check下代码是否有改动,如果发现Git Repo中的代码有改动,那么就会拉取代码开始部署。
通过Pull模式做部署的工具有:flux
,argo
。
-
flux
:https://fluxcd.io/docs/ -
argo
:https://argo-cd.readthedocs.io/en/stable/
image.png
3. GitOps的其它好处
-
Easy Rollback
:通过Git版本控制,加上全自动的部署可以让回滚变的很容易。 -
Single Source of Truth
:相比于存放在Ops人员本地电脑的配置文件,我们改用了Git仓库来管理配置文件,然后生产环境只从Git Repo中拉取代码,这会让所有的配置改动都在Git Repo中有记录。 -
Increasing Security
:因为有了全自动的CD流程,所以Ops人员不再需要每个人都拥有生产环境执行命令的权限了。
4.总结
image.png
image.png
GitOps主要由4部分组件:
-
Infrastructure as Code
(可能是yaml文件) -
Version Control
(Git) Pull / Merge Requests
-
CI / CD Pipeline
(flux cd, argo cd)
参考:
https://www.youtube.com/watch?v=f5EpcWp0THw
https://gitops-community.github.io/
https://www.gitops.tech/#what-is-gitops