云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
5442 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

22|如何使用 ArgoCD 快速打造生产可用的 GitOps 工作流?

你好,我是王炜。
在之前的课程中,我们学习了如何使用 Kustomize 和 Helm 和来定义应用。其中,Helm Chart 在实际工作中使用较多,它有两种存储方式,一种是以源码的方式存储在 Git 仓库中,另一种是以 tgz 压缩包的方式存储在专用的 OCI 仓库中。
此外,在自动化镜像构建部分,我还向你介绍了如何使用 GitHub Action、GitLab CI 以及自托管 Tekton 来自动构建镜像。
当我们具备这些 GitOps 的核心基础后,接下来我们就可以根据实际场景,选择合适的技术栈来构建 GitOps 流水线了。
在这节课,我仍然会以示例应用为例,使用 GitHub Action 和 Helm 分别作为自动构建镜像和应用定义的工具,并通过 ArgoCD 来构建一个完整的 GitOps 工作流。
在开始今天的学习之前,你需要准备好下面这几个条件。
按照第 2 讲的内容在本地配置好 Kind 集群,安装 Ingress-Nginx,并暴露 80 和 443 端口。
配置好 Kubectl,使其能够访问 Kind 集群。
克隆 kubernetes-example 示例应用代码并推送到自己的 GitHub 仓库中,然后按照第 16 讲的内容配置好 GitHub Action 和 DockerHub Registry。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • 邵涵
    对于思考题,CURRENT SYNC STATUS 从 Synced 变为 OutOfSync 可能是应用定义中的Deployment的replicas指定的数量与k8s集群中该Deployment下pod的实际数量不符造成的吗?因为集群中Deployment下的pod实际数量可能是HPA动态管控的 如果是这个原因的话,那是有什么方法可以声明忽略对这个数量的比对吗? 另外,还有两个问题,使用ArgoCD做自动的拉取、比对,和更新k8s集群中对象 1. 如何指定给某个环境使用的values-xxx.yaml文件? 2. 如果是要同时更新多个环境,是要为每个环境都创建一个ArgoCD应用吗?

    作者回复: 回答正确。解决方案也非常简单,把 Deployment 的 replicas 字段删除即可,这样该字段会由 HPA 的最小副本数控制。 另外两个问题提的非常好,你可以参考 27 讲的内容,多环境自动创建的方法。

    归属地:北京
    1
  • gyl1989113
    argocd repo add https://github.com/xxx/kubernetes-example.git --username xxx --password xxx 为什么我执行这句报错rpc error: code = Unknown desc = error testing repository connectivity: authentication required

    作者回复: 尝试用 git 协议,这个仓库是公开的。

    归属地:四川
    2
    1
  • Sophia-百鑫
    老师好,如果技术栈是 gitlabCI pipeline +ArgoCD,应用定义 helm chart, 如果修改 gitlab-ci.yaml文件,使CI 自动修改 helm values.yaml 文件 的 image tag ?

    作者回复: 是一种方案,另一种方案是使用 argo image updater 自动监听镜像版本的变化。

    归属地:上海
  • 辣条愛乃
    请教下,"连接GitOps工作流"这一步,我使用的gitlab,但是似乎没有找到,类似github的"valueFile"用来修改helm里面的tag id,不知道gitlab是怎么修改的

    作者回复: 把 gitlab ci 当做是一台机器,本质上可以通过 shell 命令实现任何操作,比如编辑 yaml 文件可以用 yq 命令行工具。

    归属地:湖北
  • 辣条愛乃
    自己搭建的gitlab,但是报错 FATA[0003] rpc error: code = Unknown desc = error testing repository connectivity: Get "https://www.gittest.com/root/kubernetes-example.git/info/refs?service=git-upload-pack": dial tcp 128.14.151.194:443: connect: connection refused

    作者回复: 看着是网络原因导致的,你可以尝试用托管的 GitLab 跑流程。

    归属地:湖北
  • 大圈
    感谢老师的解答,还有一个问题请教一下: 我们目前直接使用jenkins做CI/CD,然后我准备把CD工具替换为argocd。 关于"自动更新 Helm Chart values.yaml 文件镜像版本的部分"这块实践,看老师的教程可得github、gitlab-ci都可以实现。但是我暂时不想用gitlab-ci做CI工具,继续使用Jenkins做CI操作的话能否实现"自动更新 Helm Chart values.yaml 文件镜像版本的部分"呢? 我目前想到的方案就是通过自己写脚本来实现了。

    作者回复: 很容易实现,Jenkins 里通过 shell 命令调用 YQ 工具来更新 helm chart,核心原理不变,只要能更新 values.yaml 即可。

    归属地:北京
  • 大圈
    请教一下,假如我有3个java服务,每个服务对应3套环境,test,preview,product,那么我是不是就得给这3个服务分别创建3个application,在argocd上。 有什么好的方式来解决在argocd上重复创建application的问题吗?

    作者回复: 非常好的问题,你可以查看第27讲,这里面有提到多环境管理。

    归属地:北京
  • bob
    老师,您好!请问后端运行报错会是什么原因?谢谢! Traceback (most recent call last): File "/usr/local/lib/python3.8/runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File "/usr/local/lib/python3.8/runpy.py", line 87, in _run_code exec(code, run_globals) File "/usr/local/lib/python3.8/site-packages/flask/__main__.py", line 3, in <module> main() File "/usr/local/lib/python3.8/site-packages/flask/cli.py", line 1050, in main cli.main() File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1055, in main rv = self.invoke(ctx) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1657, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1404, in invoke return ctx.invoke(self.callback, **ctx.params) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 760, in invoke return __callback(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/click/decorators.py", line 84, in new_func return ctx.invoke(f, obj, *args, **kwargs) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 760, in invoke return __callback(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/flask/cli.py", line 911, in run_command raise e from None File "/usr/local/lib/python3.8/site-packages/flask/cli.py", line 897, in run_command app = info.load_app() File "/usr/local/lib/python3.8/site-packages/flask/cli.py", line 312, in load_app app = locate_app(import_name, None, raise_if_not_found=False) File "/usr/local/lib/python3.8/site-packages/flask/cli.py", line 218, in locate_app __import__(module_name) File "/app/app.py", line 18, in <module> db.init_app(app) File "/usr/local/lib/python3.8/site-packages/flask_sqlalchemy/extension.py", line 253, in init_app raise RuntimeError( RuntimeError: A 'SQLAlchemy' instance has already been registered on this Flask app. Import and use that instance instead.

    作者回复: 示例应用的后端服务的镜像版本 latest 和 1276e23 都是运行正常的,请问你使用的镜像版本是?

    归属地:广东
    4
  • 加菲老猫
    老师您好,我尝试根据您的范例,在github action中 Update helm values.yaml遇到以下错误,请您给个思路,谢谢! updateFile is deprected, the updated content will be written to the file by default from now on Error: HttpError: Resource not accessible by integration

    作者回复: 把 updateFile 参数删除即可。

    归属地:上海
  • Andrew
    是否可以通过export环境变量的方式 比如 定义values.yaml image: tag: _${IMAGE_TAG} 然后再deploy的时候通过脚本 export IMAGE_TAG=${DOCKER_IMAGE_ID}

    作者回复: Values.yaml 文件需要静态的内容。不支持这种方式。可以调研一下 helmfile 是否满足你的诉求。

    归属地:美国
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部