GitOps快速入門與實踐
導讀 | 也許你之前聽說過GitOps,但是對其並不瞭解。在本文中,我將對其進行簡單介紹,它其實是一個應用程式開發和管理中的一個術語,其核心思想是將應用系統的宣告性基礎架構和應用程式存放在Git的版本控制庫中。我們將介紹GitOps是什麼,它將如何影響組織以及如何與Kubernetes保持同步。 |
GitOps是一種實現持續交付的模型,利用Git開發工具對雲原生應用程式進行操作和管理。當將應用程式部署到Kubernetes時,Git應該是唯一的事實來源。當開發人員更改應用程式時,Git將自動把它們push到Kubernetes進行部署。而且,如果Kubernetes內的執行狀態發生變化但與Git內的狀態不一致,則它們會從Git內恢復到已知狀態。
GitOps和CI/CD是十分重要的工作夥伴。CI/CD可以讓開發人員持續迭代、開發和部署應用程式。而迭代通常透過一個Git配置倉庫進行(儘管也會有其他配置倉庫)。在部署/交付階段,構建的基於容器的應用程式被“push”到Kubernetes進行部署。GitOps會透過Kubernetes使用“pull”的方法來增強CI/CD模型,從而將運維層面帶入部署/交付中。
但是,如果有人更改了Kubernetes叢集中執行的某些內容,會發生什麼?我們將使用Git作為宣告性部署工具的主要事實來源,並利用其他工具在出現差異時向我們發出警報。此外,透過利用可以識別執行狀態和宣告狀態之間差異的工具,Kubernetes可以修復為已知/宣告的執行狀態。
注意:持續整合和持續開發是互補但獨立的過程。在理想狀態下,GitOps會將批處理規模拆分為單件流程,每次只處理一個單元。但是,由於CI和CD流程發生在不同的組中,因此組織之間的流程可能會有所不同。
讓我們從應用程式生命週期的視角來看一下GitOps的作用。在典型的生命週期中,應用程式會經歷多個狀態,包括:
程式碼
構建
建立映象
測試
釋出
而使用GitOps,這些狀態將會擴充套件為:
部署
在Git倉庫中監控更改
日誌更改和事件
發生更改時發出警報,並於現有的監控/告警系統整合
更新
在GitOps操作模型下,當應用程式釋出時,Kubernetes需要確保其按預期執行。同時,Kubernetes透過確保其穩定性和可用性來管理應用程式的運維工作。如果一個開發人員透過Git更改了該應用程式,Kubernetes將會接受宣告並根據需要應用它。
GitOps為應用程式提供一個操作模型,它可以確保Git提供一個框架來統一應用程式的執行、操作和持續開發。
作為CI/CD流水線的一部分,GitOps為應用程式構建/交付與執行它的位置之間提供了粘合劑。
在Kubernetes平臺中,Git為應用程式的開發和運維提供了唯一的事實來源。
應用程式交付和平臺管理都是宣告式的,同時還能透過Git進行版本控制
Git可以控制回滾、升級以及更改
開發人員不需要知道如何操作運維平臺(如Kubernetes),無需瞭解複雜的部署交付流程,僅需使用熟悉的工具釋出新功能即可。極大提升開發者體驗。
Git控制並修證差異或“漂移”
GitOps利用稽核、監控以及回滾功能來增加應用程式釋出的可靠性和穩定性
最後,儘管在GitOps模式下還有很多工作要做,但是GitOps、DevOps以及現有CI/CD模式之間存在十分明顯的協同作用。GitOps提供了一種用於將應用程式交付到Kubernetes平臺的模型,該模型確保了Git是唯一的事實來源並且充分利用Kubernetes平臺上的功能。但值得注意的是,GitOps不能替代工具。恰恰相反,GitOps透過宣告性的流程和工具來強化流程、提高其成熟度並幫助團隊交付應用程式。
FluxCD(或Flux)是一個很棒的工具,它可以將Git和Kubernetes整合起來。Flux本質上是一個Kubernetes Operator,這意味著,你作為一個管理員可以將其安裝到Kubernetes 以管理Git和原生Kubernetes之間的整合。
在Kubernetes中,Operator是Kubernetes原生平臺的擴充套件,是一種自定義資源的模式,該自定義資源主要用於管理應用程式及其元件。這意味著,在Kubernetes內部Operator的幫助下,所需狀態(如執行狀態)將不斷檢查和調整以符合Git倉庫宣告的內容。Flux可以整合到你現有的CI/CD工具集中,以進行其他工作流程、許可權批准和稽核。在Kubernetes中,Flux會監控你透過配置宣告的Git倉庫是否發生更改,並且如果 Kubernetes Pod上在本地發生了不應發生的更改,Flux將會把Kubernetes更新到所需的執行狀態。請記住,Git是事實來源。Flux Operator會檢測到這一點,並將正在執行的配置更改回宣告的狀態。
以下demo,我將會展示如何安裝和實現Flux。
一個Docker Hub映象倉庫,你可以將Flaskapp docker映象上傳到此處
一個Git Repo並連線它,然後你可以在整個演示過程中根據需要用你的設定替換“< >”中的任何內容
安裝Kubernetes
安裝並配置fluxctl,Flux部署的原生安裝程式
配置Flux以連線到Git Repo
在Git Repo中升級deployment manifest
升級容器映象並同步
配置漂移(drift)並同步
你可以使用以下配置進行測試或演示。它包括Flask應用程式的Docker file以及Kubernetes deployment/配置檔案。在演示中,你會需要它們,此外你還可以將它們上傳到你指定的Git倉庫中。
FROM python:3 RUN pip install flask RUN mkdir -p /corp/app WORKDIR /corp/app COPY main.py . ENV FLASK_APP=/corp/app/main.py ENV APP_NAME=MyApp.DevOps ENV APP_VERSION=v1.0.0 CMD ["flask", "run", "--host=127.0.0.1"]
import os from flask import Flask app = Flask(__name__) @app.route('/') def index(): appname = os.environ['APP_NAME'] appversion = os.environ['APP_VERSION'] response = "%s - %s.%s\n" %('Hello World', appname, appversion) return response
apiVersion: v1 kind: Namespace metadata: name: my-demo --- apiVersion: apps/v1 kind: Deployment metadata: name: fluxdemo namespace: my-demo annotations: flux.weave.works/tag.flask: glob:develop-v* flux.weave.works/automated: 'true' labels: role: fluxdemo env: demo app: flux spec: replicas: 1 selector: matchLabels: role: fluxdemo template: metadata: labels: role: fluxdemo spec: containers: - name: nginx image: nginx:1.16-perl imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 volumeMounts: - name: nginx-proxy-config mountPath: /etc/nginx/conf.d/default.conf subPath: nginx.conf - name: flask image: docker.io//flaskapp:develop-v1.8.0 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 5000 env: - name: APP_NAME value: myfluxdemo.K8s.GitOps - name: APP_VERSION value: v1.0.5 volumes: - name: nginx-proxy-config configMap: name: nginx-conf --- apiVersion: v1 kind: ConfigMap metadata: name: nginx-conf namespace: my-demo data: nginx.conf: |- #CODE1.0: #add the nginx.conf configuration - this will be referenced within the deployment.yaml server { listen 80; server_name localhost; location / { proxy_pass proxy_set_header Host "localhost"; } }
建立一個名稱空間
kubectl create nsexport FLUX_FORWARD_NAMESPACE=fluxctl list-workloads
安裝Fluxcd以建立與你的Git Repo的連線
export GHUSER="" export REPO="gitops-demo" export NS="flux" fluxctl install \ --git-user=${GHUSER} \ --git-email=${GHUSER}@users.noreply.github.com \ --git-url=git@github.com: Image download failed. {REPO} \ --namespace=${NS} | kubectl apply -f -
在你的terminal中輸入以下 ,以獲取下一步所需的金鑰:
fluxctl identity
開啟Github,導航到安裝Fluxcd時新增的倉庫,轉到設定-部署金鑰,單擊【新增部署金鑰】,為其指定title,選中【允許write access】,貼上公共金鑰,然後單擊【新增金鑰】。
開啟你的Git Repo,裡面應該有deployment.yaml檔案,向下滑動直到如下所示部分,然後更改APP_VERSION號碼
env: - name: APP_NAME value: myfluxdemo.K8s.GitOps - name: APP_VERSION value: v1.0.5
儲存並Commit更改到你的Repo。
Flux將在5分鐘之內升級你的deployment
要從localhost進行測試,請在Kubernetes中使用“Port-forward” :
kubectl get pods -n copy the pod name kubectl port-forward 8080:80 -n
開啟其他terminal:
curl -s -i
現在讓我們對Docker映象進行修改並將其上傳到我們的Docker Hub映象倉庫中。為此,我們將修改flaskapp目錄中的main.py檔案。
升級main.py檔案。將Hello World更改為其他內容
response = "%s - %s.%s\n" %('Flux World', appname, appversion)
建立一個新的Docker檔案並上傳到Docker(以及另一個增量版本號)。
等待5分鐘,Flux將會自動部署新映象
現在,我們來測試一下手動更改正在執行的配置會發生什麼。
kubectl scale deployment/fluxdemo --replicas=4 -n
現在,我們花幾分鐘來看看pod並觀察發生了什麼。我們將會在短時間內(5分鐘以內)看到其他的pod,此外我們還將看到許多pod終止。因此,Flux已使配置恢復到當前在Git中保留的已宣告的部署狀態。
kubectl get po -n --watch
重新執行相同的命令,並且你會看到目前僅有一個正在執行的pod。
別忘了清理和移除deployment和Git連線(如果你想移除它)。否則,你需要開始新增更多的倉庫並繼續進行構建。
本文中我們簡單介紹了GitOps概念、它與CI/CD的關係以及它對應用程式的生命週期的改變。最後我們還demo了GitOps中的一個小工具Flux,它可以幫助把Kubernetes和Git整合起來,從而最佳化CI/CD流程。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2684837/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kafka v2.3 快速入門與實踐Kafka
- GitOps 應用實踐系列 - Argo CD 從入門到核心GitGo
- TypeScript入門與實踐TypeScript
- locsut 入門與實踐
- Kafka 入門與實踐Kafka
- Docker 入門與實踐Docker
- SASS入門與實踐
- Spring Boot 最佳實踐(一)快速入門Spring Boot
- 實踐分享!GitLab CI/CD 快速入門Gitlab
- Apache Doris 輕鬆入門和快速實踐Apache
- Git與Github入門實踐(上)Github
- 微信小程式入門與實踐微信小程式
- Axon框架快速入門和DDD專案實踐框架
- KunlunDB 快速入門2.0(對等部署最佳實踐)
- 機器學習PAI快速入門與業務實戰機器學習AI
- GitOps 應用實踐系列 - Argo CD 上手實踐GitGo
- 效能診斷利器JProfiler快速入門和最佳實踐
- Kubeflow實戰: 入門介紹與部署實踐
- GitOps實踐指南:GitOps能為我們帶來什麼?Git
- 《Django入門與實踐教程》完整版Django
- 《Kafka入門與實踐》讀書筆記Kafka筆記
- 微信小程式開發入門與實踐微信小程式
- BoltDB 入門實踐
- MQ 入門實踐MQ
- Docker入門實踐Docker
- Pytorch DistributedDataParallel(DDP)教程二:快速入門實踐篇PyTorchParallel
- GitOps 應用實踐系列 - 綜述Git
- 入門看看?Chrome外掛初窺與實踐Chrome
- babel 修改抽象語法樹——入門與實踐Babel抽象語法樹
- redux 入門到實踐Redux
- GitHub Actions 入門實踐Github
- CoffeeScript入門實踐
- Docker實踐(1)—入門Docker
- Docker入門實踐(三)Docker
- Docker入門實踐(四)Docker
- Nginx入門實踐(二)Nginx
- 【機器學習入門與實踐】合集入門必看系列,含資料探勘專案實戰,適合新人入門機器學習
- 最火的容器技術|Docker入門與實踐Docker