GitOps 體系學(xué)習(xí)和理解

什么是 GitOps 呢?
GitOps是一套使用Git來管理基礎(chǔ)架構(gòu)和應(yīng)用配置的實踐,而Git指的是一個開源版控制系統(tǒng)。GitOps在運行過程中以Git為聲明性基礎(chǔ)架構(gòu)和應(yīng)用的單一事實來源。GitOps使用Git拉取請求來自動管理基礎(chǔ)架構(gòu)的置備和部署。Git存儲庫包含系統(tǒng)的全部狀態(tài),因此系統(tǒng)狀態(tài)的修改痕跡既可查看也可審計。GitOps圍繞開發(fā)者經(jīng)驗而構(gòu)建,可幫助團隊使用與軟件開發(fā)相同的工具和流程來管理基礎(chǔ)架構(gòu)。除了Git以外,GitOps還支持您按照自己的需求選擇工具。

1. GitOps 到底是個什么呢
GitOps = 基礎(chǔ)設(shè)施即代碼(IaC) + 合并請求(MR) + 持續(xù)集成/持續(xù)交付(CI/CD)
GitOps 是一種運維框架,它采用了 DevOps 在應(yīng)用程序開發(fā)階段的最佳實踐(例如版本控制、協(xié)作、合規(guī)性和CI/CD工具),并將其應(yīng)用于基礎(chǔ)設(shè)施自動化。
與 GitOps 相比,傳統(tǒng)的 DevOps 盡管在軟件開發(fā)生命周期已實現(xiàn)自動化,但基礎(chǔ)架構(gòu)大體上仍然是一個需要專業(yè)團隊進行手動操作的過程。隨著對基礎(chǔ)架構(gòu)需求的不斷增長,實現(xiàn)基礎(chǔ)設(shè)施自動化變得越來越重要?,F(xiàn)代化的基礎(chǔ)設(shè)施需要彈性機制(速度和規(guī)模),以便能有效地管理持續(xù)部署所需的云資源。

GitOps 用于對基礎(chǔ)設(shè)施置備的過程進行自動化,采用以 配置文件 存儲為代碼(基礎(chǔ)設(shè)施即代碼),配置文件在每次部署時都會生成相同的基礎(chǔ)設(shè)施環(huán)境,來保證環(huán)境的一致性,完成整個運維流程的自動化。
三叉戟 - 基礎(chǔ)設(shè)施即代碼(IaC) - Terraform GitOps使用Git倉庫作為基礎(chǔ)設(shè)施定義的單一可信來源,將所有基礎(chǔ)設(shè)施以配置文件的方式存儲為起來,達到配置和管理應(yīng)用服務(wù)的問題。三叉戟 - 合并請求(MR) GitOps使用合并請求作為所有基礎(chǔ)設(shè)施更新的變更機制,合并請求是團隊通過評審和評論進行協(xié)作的地方,合并會被提交到您的主干分支并可作為審計日志。三叉戟 - 持續(xù)集成/持續(xù)交付(CI/CD) GitOps使用具有持續(xù)集成和持續(xù)交付的Git工作流來自動化執(zhí)行基礎(chǔ)架構(gòu)的更新,在新代碼合并后,CI/CD流水線將執(zhí)行環(huán)境中的更改,從而避免手動配置的錯誤等問題。
對于任何需要協(xié)作的工作,改變都是很棘手的,GitOps 也不例外。GitOps 需要所有參與者遵守紀律,它是一種采用全新的方式來工作的承諾。對于團隊來說,把所有的事情都記錄下來至關(guān)重要。
2. GitOps 的核心在于協(xié)助
可以覆蓋應(yīng)用程序從構(gòu)思到代碼再到部署全流程的協(xié)作
從核心上來說,GitOps 指的是將 Git 存儲庫作為構(gòu)建基礎(chǔ)設(shè)施和部署應(yīng)用程序所有代碼的唯一可信數(shù)據(jù)源,然后將代碼自動化部署到不同的云環(huán)境上面(可以借助Terraform完成資源編排)。
每個人都能夠在同一個系統(tǒng)中工作,并了解事情的進展情況。無論你是在基礎(chǔ)架構(gòu)中還是在應(yīng)用程序開發(fā)中,所有的更改都遵循同樣的流程,即定義工作主體,將其分配給個人,團隊協(xié)作,然后部署這些代碼,并將 Git 存儲庫作為唯一可信數(shù)據(jù)源使用。
GitOps 與代碼和協(xié)作都有緊密聯(lián)系
使用版本控制系統(tǒng)可以確保一切都被記錄且可見,審計跟蹤使團隊保持合規(guī)性。 針對于不同的項目和團隊,新建 issue來描述添加的目標(biāo)和任務(wù)(多云平臺)。在 issue中,記錄列出的任務(wù)列表的執(zhí)行程度和進展(通過ME合并請求)。

3. GitOps 的使用最佳實踐
這里推薦使用極狐 GitLab 云服務(wù)(費收費軟廣告)
良好的運維體系擁有一個無縫鏈接且完美的體驗,能夠增進基礎(chǔ)設(shè)施、運營和開發(fā)團隊之間的協(xié)作,在提高軟件環(huán)境的穩(wěn)定性、可靠性和安全性的同時,實現(xiàn)更快速部署,這能夠增強團隊的信心。比如:

[1] 版本控制 核心 - 配置文件 - 聲明式系統(tǒng) Git倉庫作為所有基礎(chǔ)設(shè)施和應(yīng)用部署代碼的單一事實來源通過受保護分支的獨特權(quán)限,限制可以部署到生產(chǎn)的用戶和團隊 [2] 代碼審查 團隊 - 方便后續(xù)追溯問題原因 提高代碼質(zhì)量,傳播最佳實踐,防止問題的出現(xiàn) [3] 持續(xù)集成/持續(xù)交付 部署 - 無縫體驗 - 與 Terraform緊密集成將其與敏捷管理和源代碼管理建立在同一個應(yīng)用程序中 支持從物理機、虛擬機、容器到云原生平臺的多種基礎(chǔ)環(huán)境的部署
4. GitOps 的大致運行流程
這里推薦使用極狐 GitLab 云服務(wù)(費收費軟廣告)
伴隨著 DevOps 在近些年的火爆,圍繞 xOps 產(chǎn)生了很多概念,諸如 DevSecOps,AIOps,MLOps,ChatOps 等等,當(dāng)然還有的主角 GitOps。而GitOps 這個詞出現(xiàn)于 2017 年,是由 Weaveworks 公司根據(jù)多年云計算基礎(chǔ)設(shè)施和應(yīng)用程序管理經(jīng)驗而提出的一個概念。

一般情況下,可以使用下面的持續(xù)交付系統(tǒng)(示意圖),來完成云原生應(yīng)用程序的部署與交付。這種 從左到右走到底 的 Push 模式,雖然很容易實現(xiàn)一鍵式部署,但也存在一些問題。

簡而言之,就是沒有辦法保證兩側(cè)的服務(wù)是一致的,這可能會導(dǎo)致 配置漂移 的發(fā)生和安全合規(guī)問題的出現(xiàn),而使用聲明式是解決這個問題的關(guān)鍵點。
[1] 很難保證 倉庫里清單文件的內(nèi)容是否和 k8s集群的實際情況是否一致[2] 不夠靈活 鏡像有更新時不能夠自動同步至集群,除非每次從頭到尾走一遍部署流程 [3] 安全合規(guī) 有可能需要操作人員通過 kubectl命令做一些集群操作
聲明式系統(tǒng)有個特點,其能夠幫我們自動完成應(yīng)用程序或基礎(chǔ)設(shè)施系統(tǒng)的描述狀態(tài)和實際狀態(tài)的自動同步,保證兩者能保持一致。比如,應(yīng)用部署清單里面應(yīng)用程序是一個副本(replicas=1),那么集群側(cè)應(yīng)用程序就會是一個 pod。

而 GitOps 以聲明式系統(tǒng)為基座,以 Git 為單一可信源,即一切皆代碼,從而我們可以將上述構(gòu)建流程改為下面這樣的 pull 模式。pull 模式的關(guān)鍵就是,單一可信源與 k8s 集群的集成,當(dāng)可信源側(cè)的文件清單發(fā)生變更的時候,集群側(cè)能夠及時捕捉到此變更,從而完成變更清單的部署。
這就需要使用的 Git工具支持與k8s打交道的能力。可以將 Git工具與Terraform集成,來完成云基礎(chǔ)設(shè)施的自動化管理。


# ------- 0.0 -------
# GitOps的倉庫代碼結(jié)構(gòu)
# -------------------
# 多云環(huán)境
? tree -a GitOps
GitOps
└── gitops
├── .gitlab-ci.yaml # CI/CD
└── environments
├── aliyun
│ ├── kubeconfig.yaml # k8s集群配置
│ ├── main.tf # 基礎(chǔ)設(shè)置配置
│ └── yaml
│ └── app.yaml # 集群服務(wù)配置
└── k3s
└── yaml
├── app.yaml # 集群服務(wù)配置
└── kubeconfig.yaml # k8s集群配置
以 Git 為單一可信源,所有與軟件開發(fā)相關(guān)流程中的代碼(包括基礎(chǔ)設(shè)施代碼、應(yīng)用程序源碼、配置等)都會存儲在 Git 倉庫中。所有管理過程都是通過合并請求(MR)來完成的,當(dāng)需要對基礎(chǔ)設(shè)施作某些變更時,只需要修改代碼,并提交 MR,在所有的修改都被審查和批準后,代碼可以被合并到主分支上。一旦代碼變化被合并,所有的變化將被部署到生產(chǎn)中。
GitOps 的優(yōu)點 快速進行變更 - 更新和回滾 人員工作體驗的提升 - 部署流程完美 安全性提高 - 倉庫進行權(quán)限分配 合規(guī)審計容易做 - 所見即所得 GitOps 的缺點 協(xié)作文化的建立 - 逐步培養(yǎng) Git Workflow的建立 - 混合云保證服務(wù)可用敏感信息的處理 - 敏感信息(與 Vault結(jié)合解決) -GitSecOps
5. GitOps 集成 ArgoCD 實踐
ArgoCD 只是一個持續(xù)交付工具,但其實核心功能點!
ArgoCD 是一款開源且主要針對 Kubernetes 來做 GitOps 的持續(xù)交付工具?,F(xiàn)在是 CNCF 的孵化項目。其整體架構(gòu)圖如下:

ArgoCD 是以 Kubernetes Controller 的形式來實現(xiàn)的,它會對運行在 Kubernetes 集群上的應(yīng)用程序進行監(jiān)聽,并將實際運行狀態(tài)和期望狀態(tài)(在部署清單文件中指定,且存儲在版本控制系統(tǒng)中)進行對比,當(dāng)兩者狀態(tài)不一致的時候,則提示 OutOfSync,此時可以通過自動或者手動的方式來完成同步操作,以讓兩者狀態(tài)再次保持一致。存儲在 Git 倉庫中的任何變更都會被自動同步至集群側(cè)。
這其實就是實現(xiàn) GitOps 的核心原理。所有對于應(yīng)用程序或者基礎(chǔ)設(shè)施的變更僅僅需對 Git 倉庫做一些 MR 或者 Push 操作即可實現(xiàn),變更會自動部署。所以,雖然 GitOps 的核心不是 Git,但是卻與 Git 息息相關(guān)。
Git 將作為存儲部署清單文件的版本控制系統(tǒng),與 ArgoCD 做集成,實現(xiàn) GitOps workflow。整體示意圖如下所示:
一個 Git實例一個 ArgoCD運行實例

[1] 安裝和啟動 ArgoCD 服務(wù)
# 安裝ArgoCD服務(wù)(官方)
# 使用Kustomize來完成對部署清單文件的編排
# 同時用sops來處理敏感信息在Git上的存儲問題
$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 暴露argocd的服務(wù)端口
$ kubectl -n argocd port-forward pods/argocd-server-6db46c865b-qqnbl 8080:8080
# 獲取登陸密碼
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
RDMpJRKRfsmkcgbP
# 訪問ArgoCD服務(wù)
http://localhost:8080
admin/RDMpJRKRfsmkcgbP
[2] 介紹 sops 的使用
# 這sops是一款開源的加密文件的編輯器(以GPG為例演示)
# 支持YAML、JSON、ENV、INI和BINARY格式,且支持多種加密方式
# 安裝
$ brew install gnupg
$ brew install sops
# 生成一對key
$ gpg --full-generate-key
# sops和gpg的結(jié)合 - 創(chuàng)建sops配置文件
# encrypted_regex: 加密規(guī)則;規(guī)定需要對哪些字段的值進行加密
# gpg: 加密所需要的fingerprint值
$ cat >> .sops.yaml << EOF
creation_rules:
- encrypted_regex: '^(username|title|)$'
pgp: 'ED2A6947C44F9228B39E65B705A11CD02E66FF4B'
EOF
# sops和gpg的結(jié)合 - 創(chuàng)建敏感信息的文件
$ cat >> secret.yaml << EOF
apiVersion: v1
data:
username: eGlhb21hZ2UK=
company: SmlIdShHaXRMYWIp=
kind: Secret
metadata:
labels:
app: demo
name: sops-demo
namespace: jihu-gitlab
type: Opaque
EOF
# sops和gpg的結(jié)合 - 敏感信息的文件加密
$ sops -e secret.yaml
[3] 配置 ArgoCD 的服務(wù)

[4] 使用 ArgoCD 的服務(wù)
# 在ArgoCD的Project下面添加application來讓GitOps飛起來
# 至此ArgoCD配置完成,且此ArgoCD實例已經(jīng)在監(jiān)聽配置的Git的倉庫
# 如果該倉庫的配置文件發(fā)生了變化,則變化會被自動同步至Kubernetes集群側(cè)
# 查看運行的應(yīng)用程序
$ kubectl -n gitops-argocd get pods
NAME READY STATUS RESTARTS AGE
deploy-766c4cbbfc-m8dz6 1/1 Running 0 53m
# 查看此應(yīng)用程序的輸出 - 映射端口出來
$ kubectl -n gitops-argocd port-forward pods/deploy-766c4cbbfc-m8dz6 9999:9999
$ curl localhost:9999/jihu
Hello JiHu GitLab,this is xiaomage,version is v6.1.0
6. GitOps 的相關(guān)參考鏈接
送人玫瑰,手有余香!
極狐 GitLab 一體化 DevOps 平臺[1] 極狐 GitLab for GitOps 實踐[2] 什么是 GitOps[3] 那么,DevOps 到底是什么?[4] 為什么協(xié)作技術(shù)對 GitOps 至關(guān)重要[5] 極狐 GitLab 和 ArgoCD 的集成實踐[6] 極狐 GitLab 與 Git 基礎(chǔ)試聽課[7] 漫談極狐 GitLab 如何助力 K8s 時代的 GitOps 實踐[8]
引用鏈接
極狐 GitLab 一體化 DevOps 平臺: https://about.gitlab.cn/
[2]極狐 GitLab for GitOps 實踐: https://about.gitlab.cn/solutions/gitops/
[3]什么是 GitOps: https://xie.infoq.cn/article/2ead2c1adfcf8ae577e75e085
[4]那么,DevOps 到底是什么?: https://www.redhat.com/zh/topics/devops
[5]為什么協(xié)作技術(shù)對 GitOps 至關(guān)重要: https://xie.infoq.cn/article/9966f42d62b89408d7be65352
[6]極狐 GitLab 和 ArgoCD 的集成實踐: https://xie.infoq.cn/article/1c54f8112c0b2e22aba87b469
[7]極狐 GitLab 與 Git 基礎(chǔ)試聽課: https://www.bilibili.com/video/BV1bw411Z7JN
[8]漫談極狐 GitLab 如何助力 K8s 時代的 GitOps 實踐: https://www.bilibili.com/video/BV1Gv411N7wc
原文鏈接:https://www.escapelife.site/posts/117cbee7.html


你可能還喜歡
點擊下方圖片即可閱讀

云原生是一種信仰 ??
關(guān)注公眾號
后臺回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點擊 "閱讀原文" 獲取更好的閱讀體驗!
發(fā)現(xiàn)朋友圈變“安靜”了嗎?


