溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是GitOps

發(fā)布時(shí)間:2021-11-15 14:03:52 來源:億速云 閱讀:155 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“什么是GitOps”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

什么是GitOps

GitOps是一種實(shí)現(xiàn)持續(xù)交付的模型,利用Git開發(fā)工具對(duì)云原生應(yīng)用程序進(jìn)行操作和管理。當(dāng)將應(yīng)用程序部署到Kubernetes時(shí),Git應(yīng)該是唯一的事實(shí)來源。當(dāng)開發(fā)人員更改應(yīng)用程序時(shí),Git將自動(dòng)把它們push到Kubernetes進(jìn)行部署。而且,如果Kubernetes內(nèi)的運(yùn)行狀態(tài)發(fā)生變化但與Git內(nèi)的狀態(tài)不一致,則它們會(huì)從Git內(nèi)恢復(fù)到已知狀態(tài)。

GitOps與CI/CD:它們之間有什么聯(lián)系?

GitOps和CI/CD是十分重要的工作伙伴。CI/CD可以讓開發(fā)人員持續(xù)迭代、開發(fā)和部署應(yīng)用程序。而迭代通常通過一個(gè)Git配置倉(cāng)庫(kù)進(jìn)行(盡管也會(huì)有其他配置倉(cāng)庫(kù))。在部署/交付階段,構(gòu)建的基于容器的應(yīng)用程序被“push”到Kubernetes進(jìn)行部署。GitOps會(huì)通過Kubernetes使用“pull”的方法來增強(qiáng)CI/CD模型,從而將運(yùn)維層面帶入部署/交付中。

但是,如果有人更改了Kubernetes集群中運(yùn)行的某些內(nèi)容,會(huì)發(fā)生什么?我們將使用Git作為聲明性部署工具的主要事實(shí)來源,并利用其他工具在出現(xiàn)差異時(shí)向我們發(fā)出警報(bào)。此外,通過利用可以識(shí)別運(yùn)行狀態(tài)和聲明狀態(tài)之間差異的工具,Kubernetes可以修復(fù)為已知/聲明的運(yùn)行狀態(tài)。

注意:持續(xù)集成和持續(xù)開發(fā)是互補(bǔ)但獨(dú)立的過程。在理想狀態(tài)下,GitOps會(huì)將批處理規(guī)模拆分為單件流程,每次只處理一個(gè)單元。但是,由于CI和CD流程發(fā)生在不同的組中,因此組織之間的流程可能會(huì)有所不同。

GitOps和應(yīng)用程序生命周期

讓我們從應(yīng)用程序生命周期的視角來看一下GitOps的作用。在典型的生命周期中,應(yīng)用程序會(huì)經(jīng)歷多個(gè)狀態(tài),包括:

代碼

構(gòu)建

創(chuàng)建鏡像

測(cè)試

發(fā)布

而使用GitOps,這些狀態(tài)將會(huì)擴(kuò)展為:

部署

在Git倉(cāng)庫(kù)中監(jiān)控更改

日志更改和事件

發(fā)生更改時(shí)發(fā)出警報(bào),并于現(xiàn)有的監(jiān)控/告警系統(tǒng)集成

更新

在GitOps操作模型下,當(dāng)應(yīng)用程序發(fā)布時(shí),Kubernetes需要確保其按預(yù)期運(yùn)行。同時(shí),Kubernetes通過確保其穩(wěn)定性和可用性來管理應(yīng)用程序的運(yùn)維工作。如果一個(gè)開發(fā)人員通過Git更改了該應(yīng)用程序,Kubernetes將會(huì)接受聲明并根據(jù)需要應(yīng)用它。

GitOps帶來了什么?

GitOps為應(yīng)用程序提供一個(gè)操作模型,它可以確保Git提供一個(gè)框架來統(tǒng)一應(yīng)用程序的運(yùn)行、操作和持續(xù)開發(fā)。

作為CI/CD流水線的一部分,GitOps為應(yīng)用程序構(gòu)建/交付與運(yùn)行它的位置之間提供了粘合劑。

在Kubernetes平臺(tái)中,Git為應(yīng)用程序的開發(fā)和運(yùn)維提供了唯一的事實(shí)來源。

應(yīng)用程序交付和平臺(tái)管理都是聲明式的,同時(shí)還能通過Git進(jìn)行版本控制

Git可以控制回滾、升級(jí)以及更改

開發(fā)人員不需要知道如何操作運(yùn)維平臺(tái)(如Kubernetes),無需了解復(fù)雜的部署交付流程,僅需使用熟悉的工具發(fā)布新功能即可。極大提升開發(fā)者體驗(yàn)。

Git控制并修證差異或“漂移”

GitOps利用審核、監(jiān)控以及回滾功能來增加應(yīng)用程序發(fā)布的可靠性和穩(wěn)定性

最后,盡管在GitOps模式下還有很多工作要做,但是GitOps、DevOps以及現(xiàn)有CI/CD模式之間存在十分明顯的協(xié)同作用。GitOps提供了一種用于將應(yīng)用程序交付到Kubernetes平臺(tái)的模型,該模型確保了Git是唯一的事實(shí)來源并且充分利用Kubernetes平臺(tái)上的功能。但值得注意的是,GitOps不能替代工具。恰恰相反,GitOps通過聲明性的流程和工具來強(qiáng)化流程、提高其成熟度并幫助團(tuán)隊(duì)交付應(yīng)用程序。

GitOps實(shí)踐:FluxCD Demo

FluxCD(或Flux)是一個(gè)很棒的工具,它可以將Git和Kubernetes集成起來。Flux本質(zhì)上是一個(gè)Kubernetes Operator,這意味著,你作為一個(gè)管理員可以將其安裝到Kubernetes 以管理Git和原生Kubernetes之間的集成。

在Kubernetes中,Operator是Kubernetes原生平臺(tái)的擴(kuò)展,是一種自定義資源的模式,該自定義資源主要用于管理應(yīng)用程序及其組件。這意味著,在Kubernetes內(nèi)部Operator的幫助下,所需狀態(tài)(如運(yùn)行狀態(tài))將不斷檢查和調(diào)整以符合Git倉(cāng)庫(kù)聲明的內(nèi)容。Flux可以集成到你現(xiàn)有的CI/CD工具集中,以進(jìn)行其他工作流程、權(quán)限批準(zhǔn)和審核。在Kubernetes中,F(xiàn)lux會(huì)監(jiān)控你通過配置聲明的Git倉(cāng)庫(kù)是否發(fā)生更改,并且如果 Kubernetes Pod上在本地發(fā)生了不應(yīng)發(fā)生的更改,F(xiàn)lux將會(huì)把Kubernetes更新到所需的運(yùn)行狀態(tài)。請(qǐng)記住,Git是事實(shí)來源。Flux Operator會(huì)檢測(cè)到這一點(diǎn),并將正在運(yùn)行的配置更改回聲明的狀態(tài)。

以下demo,我將會(huì)展示如何安裝和實(shí)現(xiàn)Flux。

前期準(zhǔn)備

一個(gè)Docker Hub鏡像倉(cāng)庫(kù),你可以將Flaskapp docker鏡像上傳到此處

一個(gè)Git Repo并連接它,然后你可以在整個(gè)演示過程中根據(jù)需要用你的設(shè)置替換“< >”中的任何內(nèi)容

具體步驟

安裝Kubernetes

安裝并配置fluxctl,F(xiàn)lux部署的原生安裝程序

配置Flux以連接到Git Repo

在Git Repo中升級(jí)deployment manifest

升級(jí)容器鏡像并同步

配置漂移(drift)并同步

你可以使用以下配置進(jìn)行測(cè)試或演示。它包括Flask應(yīng)用程序的Docker file以及Kubernetes deployment/配置文件。在演示中,你會(huì)需要它們,此外你還可以將它們上傳到你指定的Git倉(cāng)庫(kù)中。

Docker File

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"]

main.py Python  腳本文件

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

Kubernetes Deployment文件

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 http://localhost:5000/;
            proxy_set_header Host "localhost";
        }
    }

安裝Flux

https://docs.fluxcd.io/en/1.18.0/references/fluxctl.html

安裝Fluxcd

https://docs.fluxcd.io/en/1.18.0/tutorials/get-started.html

為Repo配置Flux

創(chuàng)建一個(gè)命名空間

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 -

創(chuàng)建SSH密鑰以添加到Github倉(cāng)庫(kù)

在你的terminal中輸入以下 命令,以獲取下一步所需的密鑰:

fluxctl identity

打開Github,導(dǎo)航到安裝Fluxcd時(shí)添加的倉(cāng)庫(kù),轉(zhuǎn)到設(shè)置-部署密鑰,單擊【添加部署密鑰】,為其指定title,選中【允許write access】,粘貼公共密鑰,然后單擊【添加密鑰】。

在Git Repo中升級(jí)Deployment Manifest

打開你的Git Repo,里面應(yīng)該有deployment.yaml文件,向下滑動(dòng)直到如下所示部分,然后更改APP_VERSION號(hào)碼

 env:
    - name: APP_NAME
      value: myfluxdemo.K8s.GitOps
    - name: APP_VERSION
      value: v1.0.5

保存并Commit更改到你的Repo。

Flux將在5分鐘之內(nèi)升級(jí)你的deployment

要從localhost進(jìn)行測(cè)試,請(qǐng)?jiān)贙ubernetes中使用“Port-forward” 命令:

kubectl get pods -n  copy the pod name kubectl port-forward  8080:80 -n

打開其他terminal:

curl -s -i http://localhost:8080

升級(jí)容器鏡像并同步

現(xiàn)在讓我們對(duì)Docker鏡像進(jìn)行修改并將其上傳到我們的Docker Hub鏡像倉(cāng)庫(kù)中。為此,我們將修改flaskapp目錄中的main.py文件。

升級(jí)main.py文件。將Hello World更改為其他內(nèi)容

response = "%s - %s.%s\n" %('Flux World', appname, appversion)

創(chuàng)建一個(gè)新的Docker文件并上傳到Docker(以及另一個(gè)增量版本號(hào))。

等待5分鐘,F(xiàn)lux將會(huì)自動(dòng)部署新鏡像

配置漂移并同步

現(xiàn)在,我們來測(cè)試一下手動(dòng)更改正在運(yùn)行的配置會(huì)發(fā)生什么。

kubectl scale deployment/fluxdemo --replicas=4 -n

現(xiàn)在,我們花幾分鐘來看看pod并觀察發(fā)生了什么。我們將會(huì)在短時(shí)間內(nèi)(5分鐘以內(nèi))看到其他的pod,此外我們還將看到許多pod終止。因此,F(xiàn)lux已使配置恢復(fù)到當(dāng)前在Git中保留的已聲明的部署狀態(tài)。

kubectl get po -n  --watch

重新運(yùn)行相同的命令,并且你會(huì)看到目前僅有一個(gè)正在運(yùn)行的pod。

別忘了清理和移除deployment和Git連接(如果你想移除它)。否則,你需要開始添加更多的倉(cāng)庫(kù)并繼續(xù)進(jìn)行構(gòu)建。

“什么是GitOps”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI