本文我们将通过一个简单的项目,了解如何设置典型的 CI/CD 流水线,而后通过修改将 GitOps 添加到其中。同时,我们还将演示 Flux——GitOps 的核心组件。几周之前,Flux 已经被 CNCF 正式接纳为沙箱培养项目。
下面,我们先来看看整个流程中的具体操作步骤:
对 GitOps 进行简单介绍
设置一个简单的项目,并在 GitLab 之内进行管理
集成一个 Kubernetes 集群
设置一条典型的 CI/CD 流水线
利用 GItOps 处理其中的 CD 部分
GitOps 是一种持续交付实现方式。其将 Git 作为声明基础设施与应用程序的事实来源。当对 Git 进行变更时,自动交付流水线也会对您的基础设施进行相应变更。
在一条典型的 CI/CD 流水线当中,CI 工具负责运行测试、构建镜像、检查 CVE 并将新镜像重新部署至集群当中,具体如下图所示。
典型的 CI/CD 流水线(图片来源:Weaveworks)
GitOps 方法的区别在于,其中的部署部分不再由 CI 工具完成,而是由操作程序通过集群内 Pod 中的运行进程完成(由 Flux 负责实现)。
包含 GitOps 的 CI/CD 流水线 (图片来源:Weaveworks)
下图所示为在 Kubernetes 集群当中使用 GitOps 时所需要用到的各组件。
在 Kubernetes 集群当中的各 GitOps 组件 (图片来源:Weaveworks)
为了简单起见,Flux 守护程序会不断运行并检查是否存在新的 Docker 镜像。检测到新镜像之后,它会调用 API Server 对当前正在运行的部署加以更新。
在本文的最后一部分中,我们将设置 Flux 并利用它部署一款简单的应用程序。
在这里,我们使用一个非常简单的 Flask 应用程序。项目的复杂程度并不重要,真正重要的是理解整个 CI/CD 流程的实现方式。
我们只需要考虑以下文件:
app.py 用于公开一个单独的 HTTP 端点并返回一个字符串
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8000)
- requirements.txt 用于定义 app.py 所需要的依赖性,即 Flask 库
Flask==1.0.2
Dockerfile 用于通过源代码构建起一套镜像
FROM python:3-alpine
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD python /app/app.py
我们先通过以下命令为我们的应用程序创建第一套 Docker 镜像:
$ docker image build -t hello:1.0 .
在镜像构建完毕之后,我们可以运行容器以使用该镜像。
$ docker container run -p 8000:8000 hello:1.0
* Serving Flask app “app” (lazy loading)
* Environment: production
注意:不要在生产环境当中使用该开发服务器,请使用生产 WSGI 服务器作为替代。
* Debug mode: off
* Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
我们的服务器在监听端口 8000,如下图所示。
我们将利用 GitLab 管理这款应用程序,下面创建一个名为 hello 的新项目:
在 GitLab 当中创建一个新项目
接下来,我们可以为该应用程序文件夹进行 git 初始化,并将一切 push 至 GitLab 项目当中:
$ git init
$ git remote add origin git@gitlab.com:lucj/hello.git
$ git add .
$ git commit -m "Initial commit"
$ git push -u origin master
几秒之后,我们可以通过 GitLab 的 Web 界面看到该项目中的三个文件。