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

也许你之前听说过GitOps,但是对其并不了解。在本文中,我将对其进行简单介绍,它其实是一个应用程序开发和管理中的一个术语,其核心思想是将应用系统的声明性基础架构和应用程序存放在Git的版本控制库中。我们将介绍GitOps是什么,它将如何影响组织以及如何与Kubernetes保持同步。
 

什么是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 [email protected]:
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,进而提升你的开发部署体验。

原文地址:https://blog.51cto.com/12462495/2476792

时间: 2024-08-30 15:59:19

GitOps入门与实践:如何集成Git和K8S?的相关文章

精通Git(第2版)+Git团队协作+GitHub入门与实践+Git版本控制管理(第2版)

资源链接:https://pan.baidu.com/s/1FElckzWH6sqyugNK5o8b7w搜集并整理了网上有关GitHub学习的9本书籍,如下:<精通Git (第2版)>中英文PDF<Git团队协作>中英文PDF<Git权威指南(第2版)>和第1版PDF<Git版本控制管理 (第2版)>中英文PDF<GitHub入门与实践>PDF,以及Git桌面Win64bit版最新安装包目录及截图如下: 原文地址:http://blog.51ct

Eclipse集成Git的实践

最近一直在研究爬虫的相关技术,网上关于爬虫的教程实在是太少了,只能靠一些零零散散的博客资料做一个浅度的学习,我们已经学习了webcollector,htmlparser,Jsoup这些爬虫技术,并也成功爬取了一些网站的数据,多多少少也算是有一些小的成就,今天又学习了一下crawlScript,这是一种专门用作爬虫的一个类似script语言的爬虫技术,而且代码精简,可以用最少的代码实现强大的功能.相关技术我们下次再做介绍.今天我们要做的就是把我们最近写的一些爬虫项目上传到GitHub上. GitH

妙味课堂git 入门与实践

1874338268 xuexichengxu 1git 入门与实践 0-课程介绍(必看!!!) 1-git简介与工具安装 2-git常用命令上手操作 3-git文件状态.工作目录及工作流程 4-git入门命令扩展 5-git入门命令:删除文件 6-git入门命令:移动文件 7-强大的查看命令:status 8-强大的查看命令:diff和log 9-提交对象及master 10-创建分支 11-merge的两种合并:正常合并.快速前移 12-分支的操作:解决冲突.删除分支.取消分支合并 13-撤

spring boot 1.5.4 从入门到实践

Spring Boot四个重要核心: 自动配置:针对很多Sping应用程序常见的应用功能,Spring Boot能自动提供相关配置: 起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库: 命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建(实际开发中,可用性小): Actuator:让你能够深入运行中的SpringBoot应用程序的开发,一探究竟. spring-boot相关项目源码, 码云地址:https://git.o

GitHub入门与实践

这篇是计算机类的优质预售推荐>>>><GitHub入门与实践> 与全世界程序员分享你的代码! 编辑推荐 代码审查不到位,审查效率低下 只有编程者本人能看懂的代码直接被部署至正式环境中 因低级代码错误导致BUG频繁出现 没有机会和其他人互相交流代码,共享知识 没有一个简单高效.能在一天之内添加多个功能的开发流程 GitHub 为我们提供了解决这些问题的机会和功能. 本书旨在指导读者使用GitHub进行高效开发. 内容全面,系统讲解GitHub的功能和实用技巧 图文直观,一

《Github入门与实践》读书笔记 蟲咋先生的追求之旅(上)

<Github入门与实践>作者: [日] 大塚弘记 译者:支鹏浩/刘斌 简介 本书从Git的基本知识和操作方法入手,详细介绍了GitHub的各种功能,GitHub与其他工具或服务的协作,使用GitHub的开发流程以及如何将GitHub引入到企业中.在讲解GitHub的代表功能Pull Request时,本书专门搭建了供各位读者实践的仓库,邀请各位读者进行Pull Request并共同维护. 豆瓣地址:https://book.douban.com/subject/26462816/ 本以为对于

Django入门与实践 17-26章总结

Django入门与实践-第17章:保护视图 Django 有一个内置的视图装饰器 来避免它被未登录的用户访问: 现在如果用户没有登录,将被重定向到登录页面: 现在尝试登录,登录成功后,应用程序会跳转到原来所在的位置. Django入门与实践-第18章:访问已登录用户 现在我么可以改进 new_topic 视图,将发布主题的用户设置当前登录的用户,取代之前直接从数据库查询出来的第一个用户, 之前这份代码是临时的,因为那时候还没有方法去获取登录用户,但是现在可以了: 有两个关键字参数,pk用于唯一标

《Python编程从入门到实践》高清中文版带标签可复制PDF学习下载

最近发现一本无敌好的python书籍,真的非常不错,叫<Python编程:从入门到实践>. 高清中文版487页,带目录和书签,文字可以复制粘贴,下面发现一个可以下载的链接 百度网盘下载链接:<Python编程:从入门到实践>中文高清可复制PDF版 本书是一本针对所有层次的Python读者而作的Python入门书.全书分两部分:首部分介绍用Python 编程所必须了解的基本概念,包括matplotlib.NumPy和Pygal等强大的Python库和工具介绍,以及列表.字典.if语句

【Git入门之十四】Git GUI

[Git入门之十四]Git GUI - JackyStudio - 博客频道 - CSDN.NET 文章都快写完了,Git GUI才浮出水面,很多人要骂我,这么方便的东西怎么不早拿出来. 当然命令行和图形界面各有千秋,个人觉得命令行更能让人清楚的掌握整个项目的代码线.当然萝卜青菜各有所爱,Windows,Linux也是一样.喜欢什么客官您挑.本文只做简单介绍. 1.Git GUI有什么? 霸气测漏的右键菜单和可视化管理界面. 2.初始化仓库 新建一个文件夹叫JackyGUI,右键点击Git In