
|前言|
在现代软件开发中,GitOps 作为管理基础架构和应用程序的单一真相自动化的方法可以提高效率和减少人为错误方面发挥着关键作用,目前广泛流行于云原生等领域。但是关于 GitOps 相关的实践示例并不多见,本文将以 KCL 、Github 、ArgoCD 和 GitOps 作为一个使用示例来详细介绍,希望可以帮助大家实践自己的 GitOps 自动化流程并简化 DevOps 。
|什么是 GitOps |
GitOps 是一种实现持续交付的现代方式。它的核心思想是拥有一个包含环境和应用程序配置的 Git 存储库。通过更改应用存储库中的文件,可以自动部署应用程序。应用 GitOps 的好处包括:
|什么是 KCL |
KCL 是一个开源的基于约束的记录及函数语言并通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 Kubernetes 配置场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更简单的自动化和生态工具集成。
|将 KCL 与 GitOps 一起使用|
将 KCL 与 GitOps 工具一起使用具有如下好处:
使用 GitOps ,开发人员和运维团队可以通过分别修改应用和配置代码来管理应用程序的部署,GitOps 工具链将自动同步对配置的更改,从而实现持续部署并确保一致性。如果出现问题,可以使用 GitOps 工具链快速回滚。
|工作流程|
在此示例中,我们使用一个 Python Flask 应用和 Github Actions 作为 CI 示例,使用 ArgoCD 作为 CD 示例,使用 KCL 定义需要部署的 Kubernetes 资源
注意:你可以在此方案中使用任何容器化应用以及不同的 CI 和 CD 系统如 Gitlab CI ,Jenkins CI ,FluxCD 等,后续我们会出更多的示例文章来进行说明
我们将 Python Flask 应用代码和配置代码分成两个仓库,以实现不同角色如开发人员和运维团队的关注点分离
整体工作流程如下:
|具体步骤|
k3dclustercreatemycluster 注意:你可以在此方案中使用其他方式创建您自己的 Kubernetes 集群,如 kind, minikube 等。
k3dclusterdeletemycluster&&k3dclustercreatemycluster 注意:你可以在此方案中使用其他方式创建您自己的 Kubernetes 集群,如 kind, minikube 等。
kubectlcreatenamespaceargocd kubectlapply-nargocd-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml kubectlapply-f./install/kcl-cmp.yaml&&kubectl-nargocdpatchdeploy/argocd-repo-server-p"$(cat./install/patch-argocd-repo-server.yaml)" kubectl get命令查看 argocd 控制器容器是否初始化完成进入运行( Running )状态。kubectlgetpod-nargocd-lapp.kubernetes.io/name=argocd-repo-server kubectlport-forwardsvc/argocd-server-nargocd8080:443 https://localhost:8080输入用户名 "admin" 和密码登录ArgoCD UI ,密码可以通过如下命令得到:kubectl-nargocdgetsecretargocd-initial-admin-secret-ojsOnpath="{.data.password}"|base64-d argocdloginlocalhost:8080 通过如下命令创建一个 ArgoCD KCL 应用
argocdappcreateflaskdemo\ --repohttps://github.com/kcl-lang/flask-demo-kcl-manifests\ --path.\ --dest-namespacedefault\ --dest-serverhttps://kubernetes.default.svc\ --config-management-pluginkcl-v1.0 如果创建成功,您可以看到如下输出:
application'flaskdemo'created 如果您使用的是私有存储库,则在执行 create 命令之前,需要使用私钥凭据配置专用私有存储库访问权限。请参阅https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/ 以获取更多详细信息。
通过 ArgoCD UI ,您可以看到创建的应用程序尚未同步,您可以手动进行配置同步或设置为自动同步。
有关同步策略的更多信息,可以请参阅 https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/
gitclonehttps://github.com/kcl-lang/flask-demo.git/ cdflask-demo 这是一个使用 Python 编写的 Web 应用,我们可以使用应用目录的Dockerfile来生成这个应用的容器镜像,同时可以通过 Github CI 自动构建flask_demo镜像,CI 配置如下
#ThisisabasicworkflowtohelpyougetstartedwithActions name:CI #Controlswhentheworkflowwillrun on: #Triggerstheworkflowonpushorpullrequesteventsbutonlyforthemainbranch push: branches:[main] pull_request: branches:[main] #AllowsyoutorunthisworkflowmanuallyfromtheActionstab workflow_dispatch: #Aworkflowrunismadeupofoneormorejobsthatcanrunsequentiallyorinparallel jobs: #Thisworkflowcontainsasinglejobcalled"build" build: #Thetypeofrunnerthatthejobwillrunon runs-on:ubuntu-latest #Stepsrepresentasequenceoftasksthatwillbeexecutedaspartofthejob steps: #Checks-outyourrepositoryunder$GITHUB_WORKSPACE,soyourjobcanaccessit -uses:actions/checkout@v2 -name:DockerLogin uses:docker/< href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f4989b939d9ad99597809d9b9ab482c5dac5c4dac4">[email protected] with: username:${{secrets.DOCKER_USERNAME}} password:${{secrets.DOCKER_PASSWORD}} logout:true #Runsasetofcommandsusingtherunnersshell -name:buildimage run:| makeimage dockertagflask_demo:latest${{secrets.DOCKER_USERNAME}}/flask_demo:${{github.sha}} dockerpush${{secrets.DOCKER_USERNAME}}/flask_demo:${{github.sha}} #TriggerKCLmanifest -name:TriggerCI uses:InformaticsMatters/[email protected] with: ci-owner:kcl-lang ci-repository:flask-demo-kcl-manifests ci-ref:refs/heads/main ci-user:kcl-bot ci-user-token:${{secrets.DEPLOY_ACCESS_TOKEN}} ci-name:CI ci-inputs:>- image=${{secrets.DOCKER_USERNAME}}/flask_demo sha-tag=${{github.sha}} 我们需要源码仓库的工作流自动触发部署清单仓库中的工作流,此时需要创建具有 Github CI 操作权限的secrets.DEPLOY_ACCESS_TOKEN以及 Docker Hub 镜像推送的账号信息secrets.DOCKER_USERNAME和secrets.DOCKER_PASSWORD, 这些可以在 Github 仓库的Secrets and variables设置中进行配置,如下图所示
flask-demo 仓库提交代码后,Github 会自动构建容器镜像,并将制品推送到 Docker hub 中,会再触发 flask-demo-kcl-manifests 仓库的 Action ,通过 KCL 自动化 API 修改部署清单仓库中的镜像地址。现在让我们为 flask-demo 仓库创建一个提交,我们可以看到代码提交后触发业务仓库 Github CI 流程
当业务仓库 Github CI 流程执行完成后,会自动在存放 KCL 资源配置的仓库触发一个 CI 自动更新配置并提交到 flask-demo-kcl-manifests main 分支,commit 信息如下
gitclonehttps://github.com/kcl-lang/flask-demo-kcl-manifests.git/ cdflask-demo-kcl-manifests gitcheckoutmain&&gitpull&&kcl 输出 YAML 为
apiVersion:apps/v1 kind:Deployment metadata: name:flask_demo labels: app:flask_demo spec: replicas:1 selector: matchLabels: app:flask_demo template: metadata: labels: app:flask_demo spec: containers: -name:flask_demo image:"kcllang/flask_demo:6428cff4309afc8c1c40ad180bb9cfd82546be3e" ports: -protocol:TCP containerPort:5000 --- apiVersion:v1 kind:Service metadata: name:flask_demo labels: app:flask_demo spec: type:NodePort selector: app:flask_demo ports: -port:5000 protocol:TCP targetPort:5000 从上述配置可以看出资源的镜像确实自动更新为了新构建的镜像内容。
此外,我们可以在 ArgoCD UI 界面中将同步策略设置为自动同步,这样就可以实现业务代码提交并部署 Kubernetes 的 e2e 完整自动化流程。
|总结|
通过本篇文章,我们可以使用 Github, ArgoCD 和 KCL 等创建 GitOps 自动化流水线,可以高效稳定地构建容器化应用,同时自动化更新最新的 Dcoker 镜像标签,并保持 Git 配置与集群配置一致。此外,通过将 KCL 和 ArgoCD 相结合可以帮助我们更好地实现基础设施即代码( IaC ),提高部署效率,实现不同角色的关注点分离并简化应用程序的配置管理。