GitOps入门与实践:若何集成Git和K8S?

也许你之前听说过GitOps,然则对其并不领会。在本文中,我将对其举行简朴先容,它其实是一个应用程序开发和治理中的一个术语,其焦点头脑是将应用系统的声明性基础架构和应用程序存放在Git的版本控制库中。我们将先容GitOps是什么,它将若何影响组织以及若何与Kubernetes保持同步。

GitOps入门与实践:若何集成Git和K8S?

什么是GitOps

GitOps是一种实现连续交付的模子,行使Git开发工具对云原生应用程序举行操作和治理。当将应用程序部署到Kubernetes时,Git应该是唯一的事实泉源。当开发人员更改应用程序时,Git将自动把它们push到Kubernetes举行部署。而且,若是Kubernetes内的运行状态发生变化但与Git内的状态不一致,则它们会从Git内恢复到已知状态。

GitOps与CI/CD:它们之间有什么联系?

GitOps和CI/CD是十分重要的事情同伴。CI/CD可以让开发人员连续迭代、开发和部署应用程序。而迭代通常通过一个Git设置堆栈举行(只管也会有其他设置堆栈)。在部署/交付阶段,构建的基于容器的应用程序被“push”到Kubernetes举行部署。GitOps会通过Kubernetes使用“pull”的方法来增强CI/CD模子,从而将运维层面带入部署/交付中。

然则,若是有人更改了Kubernetes集群中运行的某些内容,会发生什么?我们将使用Git作为声明性部署工具的主要事实泉源,并行使其他工具在泛起差异时向我们发出警报。此外,通过行使可以识别运行状态和声明状态之间差异的工具,Kubernetes可以修复为已知/声明的运行状态。

注重:连续集成和连续开发是互补但自力的历程。在理想状态下,GitOps会将批处置规模拆分为单件流程,每次只处置一个单元。然则,由于CI和CD流程发生在差别的组中,因此组织之间的流程可能会有所差别。

GitOps和应用程序生命周期

让我们从应用程序生命周期的视角来看一下GitOps的作用。在典型的生命周期中,应用程序会履历多个状态,包罗:

  • 代码

  • 构建

  • 确立镜像

  • 测试

  • 公布

而使用GitOps,这些状态将会扩展为:

  • 部署

  • 在Git堆栈中监控更改

  • 日志更改和事宜

  • 发生更改时发出警报,并于现有的监控/告警系统集成

  • 更新

在GitOps操作模子下,当应用程序公布时,Kubernetes需要确保其按预期运行。同时,Kubernetes通过确保其稳定性和可用性来治理应用程序的运维事情。若是一个开发人员通过Git更改了该应用程序,Kubernetes将会接受声明并根据需要应用它。

GitOps带来了什么?

  • GitOps为应用程序提供一个操作模子,它可以确保Git提供一个框架来统一应用程序的运行、操作和连续开发。

  • 作为CI/CD流水线的一部门,GitOps为应用程序构建/交付与运行它的位置之间提供了粘合剂。

  • 在Kubernetes平台中,Git为应用程序的开发和运维提供了唯一的事实泉源。

  • 应用程序交付和平台治理都是声明式的,同时还能通过Git举行版本控制

  • Git可以控制回滚、升级以及更改

  • 开发人员不需要知道若何操作运维平台(如Kubernetes),无需领会庞大的部署交付流程,仅需使用熟悉的工具公布新功效即可。极大提升开发者体验。

  • Git控制并修证差异或“漂移”

  • GitOps行使审核、监控以及回滚功效来增添应用程序公布的可靠性和稳定性

最后,只管在GitOps模式下另有许多事情要做,然则GitOps、DevOps以及现有CI/CD模式之间存在十分显著的协同作用。GitOps提供了一种用于将应用程序交付到Kubernetes平台的模子,该模子确保了Git是唯一的事实泉源而且充分行使Kubernetes平台上的功效。但值得注重的是,GitOps不能替换工具。恰恰相反,GitOps通过声明性的流程和工具来强化流程、提高其成熟度并辅助团队交付应用程序。

GitOps实践:FluxCD Demo

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堆栈中。

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/<your docker repo>/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

  • 安装Fluxctl

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

确立一个命名空间

kubectl create ns <namespace>
export FLUX_FORWARD_NAMESPACE= <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 -

确立SSH密钥以添加到Github堆栈

在你的terminal中输入以下下令,以获取下一步所需的密钥:

fluxctl identity

打开Github,导航到安装Fluxcd时添加的堆栈,转到设置-部署密钥,单击【添加部署密钥】,为其指定title,选中【允许write access】,粘贴公共密钥,然后单击【添加密钥】。

在Git Repo中升级Deployment Manifest

打开你的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 http://localhost:8080

升级容器镜像并同步

现在让我们对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流程。

本文仅仅是一个GitOps的引子,希望你可以通过它更好地入门GitOps,进而提升你的开发部署体验。

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/182.html