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

04|如何借助GitOps实现应用秒级自动发布和回滚?

你好,我是王炜。
在上一节课,我为你介绍了 K8s 在自愈和自动扩容方面的强大能力,它们对提升业务稳定性有非常大的帮助。
其实,除了保障业务稳定以外,在日常软件研发的生命周期中,还有非常重要的一环:发布和回滚。发布周期是体现研发效率的一项重要指标,更早更快的发布有利于我们及时发现问题。
在我们有了关于容器化、K8s 工作负载的基础之后,这节课,我们来看看 K8s 应用发布的一般做法,此外,我还会带你从零开始构建 GitOps 工作流,体验 GitOps 在应用发布上为我们带来的全新体验。
在正式开始之前,你需要做好以下准备:
准备一台电脑(首选 Linux 或 macOS,Windows 系统注意操作差异);
按照上一节课的内容在本地 Kind 集群安装 Ingress-Nginx。

传统 K8s 应用发布流程

还记得在上节课学习的如何创建 Deployment 工作负载吗?下面这段 Deployment Manifest 可以帮助你复习一下:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: hello-world-flask
name: hello-world-flask
spec:
replicas: 2
selector:
matchLabels:
app: hello-world-flask
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: hello-world-flask
spec:
containers:
- image: lyzhang1999/hello-world-flask:latest
name: hello-world-flask
resources: {}
status: {}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • includestdio.h
    我们目前是通过gitlab-ci和自己搭建的CD平台实现流水线,代码变更后ci发起镜像构建,并推送到镜像仓库,CD平台通过hook监听到CI流水线完成,重建Pod并拉取最新的镜像。 缺点是#我们的镜像版本号只区分了 dev mirror prod,回滚不是很优雅,只能是通过gitlab回滚代码重新构建镜像,重新触发CD,效率低,对开发同学也不太友好。最近正在着手看怎么调整,实现通过镜像版本号回滚。

    作者回复: 欢迎你关注后续的课程,你的问题在第 17 讲中有提到。 我建议你先使用 git commit id 作为镜像版本号,这样可以把代码版本和镜像对应起来,回滚的话只要找到 commit id 就可以了。对于生产镜像,则可以采用额外的策略,例如 prod-commit_id 把他和常规开发镜像区分开。

    归属地:广东
    5
    9
  • Noel ZHANG
    我们用的是spinnaker, 配置不难,完全可以terraform创建,里面集成了helm和customize,可以用Jenkins job,docker repository, pub/sub 自动触发。用惯了觉得挺好用,但是听孟凡杰说用的人不多。。

    作者回复: Spinnaker 在国内确实用的比较少,不过它在国外很流行,也是老牌的持续部署工具,整体相对比较重。 如果对 Spinnaker 感兴趣,可以看看我写的 《Soinnaker 实战》这本书。

    归属地:江苏
    3
  • Y
    我本地windows实验成功了,感谢大佬

    作者回复: 加油,后续课程还有更好玩的实验。

    归属地:广东
    3
  • JianXu
    老师,你能介绍一下为什么flux 能成功吗?他比其他gitops 方案到底强在哪里

    作者回复: FluxCD 在 11 月底刚通过 CNCF 的评审,进入了毕业阶段。 这意味着社区已经在生产环境下大规模采用了 FluxCD,它的稳定性得到了充分的验证。 GitOps 领域目前两大工具中,FluxCD 的强项在于做集成,而 ArgoCD 更适合工程实践。这两款工具都非常优秀,所以在专栏里我都有进行介绍。 关于 ArgoCD,在后续第 22 讲中会深入介绍,期待我们再见面。

    归属地:广东
    2
    3
  • 陈斯佳
    我们现在使用的是在Jenkins上通过Terraform部署Helm chart,只要修改Terraform里的镜像版本号就能部署或回滚应用。类似这个lab: https://github.com/chance2021/devopsdaydayup/blob/main/004-TerraformDockerDeployment/README.md

    作者回复: 也是一种方案。 不过在工程实践中不建议在 CI(Jenkins)里干持续部署的活,本质上持续部署需要更多的能力支持。比如在界面上应该能够很方便看出应用版本、健康状态、应用资源拓扑等,在部署能力支持上,可能还需要蓝绿部署、灰度和金丝雀发布,甚至是结合人工审核定制发布工作流。 这部分的内容可以在第 22、24、25 和 26 将深入了解。

    归属地:广东
    2
    3
  • IF-Processing
    我目前使用的方案是Gitlab-ci将代码检查,编译,制作docker镜像一套走完后,自动推送到生产的镜像仓库,之后进行手工部署和回滚操作。目前有痛点,主要是目前运行的应用是SpringCloud体系的应用程序,每次发版时,需要手工维护Nacos配置,数据变更脚本等功能。请教下,如果使用GitOps体系进行操作时,是否对于运行的目标体系有要求呢?我理解如果是使用K8S的configmap之类的信息进行配置,使用Service进行负载均衡的话,应该很好实现配置与代码一起部署。但是如果是这种依赖Nacos配置注册中心的微服务体系,GitOps体系也能很好的支撑吗?

    作者回复: 可以考虑使用 Helm 来封装应用,利用 Helm pre-install 在部署前执行特定的变更配置的 Job,这样就可以做到和 GitOps 工作流进行结合了。

    归属地:广东
    2
  • 浅浅
    老师好,内容太棒了!请问什么时候更新后面的内容呀

    作者回复: 今天已经更新了哦,每周一、三、五更新,期待和你再见面~

    归属地:广东
    2
  • includestdio.h
    “接下来,执行 kubectl apply -f new-hello-worlad-flask.yaml 来更新应用” world写错了 ,还有下面的命令

    作者回复: 感谢指正

    归属地:广东
    1
  • BertGeek
    代码使用阿里云code,jenkins pipeline,手动构建 1. 开发提交代码到仓库,告知代码已经提交, 2. 运维人员或者开发/测试人员登陆jenkins构建对应的项目模块 3. pipeline作业构建分多个stage阶段,拉取代码--> mvn build --> docker build&push --> kubectl set image 最近领导要求改造发布模式,github action + argocd,自动触发式 发布应用到华为cce 集群

    作者回复: 这个场景可以用 gitops 实现。

    归属地:陕西
  • Dexter
    ello-world-flask https://github.com/dexter-liu/fluxcd-demo.git 14m False failed to checkout and determine revision: unable to clone 'https://github.com/dexter-liu/fluxcd-demo.git': Get "https://github.com/dexter-liu/fluxcd-demo.git/info/refs?service=git-upload-pack": dial tcp: lookup github.com on 10.96.0.10:53: server misbehaving ----这个会是什么问题? [root@master01 ~]# dig -t A github.com ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> -t A github.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7514 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 8, ADDITIONAL: 17 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;github.com. IN A ;; ANSWER SECTION: github.com. 11 IN A 20.207.73.82

    作者回复: 无法克隆 github 仓库,看起来是网络原因。

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