GitOps核心思想是将应用系统的声明性基础架构和应用程序存放在Git版本库中。
将Git作为交付流水线的核心,每个开发人员都可以提交拉取请求(Pull Request)并使用Git来加速和简化应用程序部署和运维任务。通过使用Git,开发人员可以更高效地将注意力集中在创建新功能而不是运维相关任务上(例如,应用系统安装、配置、迁移等)。
同时,GitOps还是一整套CI/CD流水线方案。
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//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
创建一个命名空间
kubectl create ns
export 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 -
创建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流程。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !