AICon全球人工智能与机器学习技术大会周四开幕,点击查看完整日程>> 了解详情
写点什么

Chaos Mesh® X GitHub Actions —— 把混沌工程集成到你的 CI 中

  • 2020 年 9 月 06 日
  • 本文字数:3273 字

    阅读完需:约 11 分钟

Chaos Mesh® X GitHub Actions —— 把混沌工程集成到你的 CI 中

本文将介绍如何在 GitHub Actions 的 workflow 中使用 Chaos Mesh,从而将混沌工程集成到系统开发的 CI 中。


阅读本文前,需要对 Chaos Mesh 和 GitHub Actions 有一定的了解:


  • Chaos Mesh 是一个云原生的混沌测试平台,提供在 Kubernetes 上进行混沌测试的能力,可以说 Chaos Mesh 是分布式系统的试金石,可以通过官网 https://chaos-mesh.org 了解更多。

  • GitHub Actions 是 GitHub 原生支持的 CI/CD 功能,通过它我们可以轻松地在 GitHub 仓库中构建自动化、自定义的软件开发工作流程。可以阅读 GitHub Actions 了解具体的说明和使用。


那么我们为什么要将 Chaos Mesh 和 GitHub Actions 结合起来呢?原因很简单,在此之前并没有比较好的在 e2e 或者 CI 中使用 Chaos Mesh 的方案,用户往往在系统开发到某一阶段(版本)时才使用 Chaos Mesh 进行一次集中的混沌测试,在漫长的系统开发过程中引入的问题往往不能及时发现。因此我们开发了 chaos-mesh-action 这个项目,让 Chaos Mesh 运行在 GitHub Actions 的 workflow 中,让 Chaos Mesh 可以更方便地集成到系统的日常开发、测试中,为 GitHub 上每一次代码的提交保驾护航。



chaos-mesh-action 的使用

下面以一个简单的示例来介绍 chaos-mesh-action 在 GitHub Actions 中的使用。


设计 workflow

首先我们需要设计整个 workflow,需要考虑的问题:


  • 测试系统的哪些功能?

  • 在 workflow 中进行哪些 chaos 实验?

  • 如何验证系统的正确性?


本文设计一个简单的测试场景:在 Kubernetes 集群中创建两个 Pod,在其中一个 Pod 中 Ping 另外一个 Pod,使用 Chaos Mesh 注入网络延迟的 chaos,测试 Ping 是否受影响。


创建 workflow

在你需要测试的 GitHub 的仓库中点击 “Actions”,然后点击按钮 “New workflow” 即可创建 workflow,如下图所示:



配置 workflow

设置规则


设置该 workflow 的名称、触发规则等,例如:


name: Chaos on: push:   branches:     - master pull_request:   branches:     - master
复制代码


workflow 的名称为 “Chaos”,在有代码 push 到 master 分支或者提交 pull request 到 master 分支时触发。


安装环境


在 workflow 中安装 CI 相关的环境,例如:


jobs: build:   runs-on: ubuntu-latest   steps:    - name: Creating kind cluster     uses: helm/kind-action@v1.0.0-rc.1    - name: Print cluster information     run: |       kubectl config view       kubectl cluster-info       kubectl get nodes       kubectl get pods -n kube-system       helm version       kubectl version    - uses: actions/checkout@v2
复制代码


该配置指定该 workflow 运行在 Ubuntu 系统中,使用 Action helm/kind-action 创建 Kind 集群,然后输出集群的相关信息;再 checkout 该 GitHub 仓库,这样 workflow 就可以使用仓库中的代码。


部署应用


使用 Chaos Mesh 中提供的一个简单的示例应用:


- name: Deploy an application     run: |       kubectl apply -f https://raw.githubusercontent.com/chaos-mesh/apps/master/ping/busybox-statefulset.yaml
复制代码


该应用会创建两个 Pod。


使用 chaos-mesh-action 注入 chaos


我们知道 Chaos Mesh 支持的功能较多,如果在 chaos-mesh-action 中支持所有的配置项会比较复杂,且用户使用起来也比较困难,因此 chaos-mesh-action 支持直接设置 chaos 配置文件的 base64 值来简化配置。


首先需要在本地环境中准备好 chaos 的配置文件,例如:


apiVersion: chaos-mesh.org/v1alpha1kind: NetworkChaosmetadata: name: network-delay namespace: busyboxspec: action: delay # the specific chaos action to inject mode: all selector:   pods:     busybox:       - busybox-0 delay:   latency: "10ms" duration: "5s" scheduler:   cron: "@every 10s" direction: to target:   selector:     pods:       busybox:         - busybox-1   mode: all
复制代码


该配置将注入 NetworkChaos 类型的 chaos,增加 pod 间的网络延迟,每 10s 注入一次,每次持续 5s。更多的 chaos 类型及配置说明参考 user_guides/run_chaos_experiment。


然后通过如下命令获取 chaos 配置文件的 base64 值:


$ base64 chaos.yamlYXBpVmVyc2lvbjogY2hhb3MtbWVzaC5vcmcvdjFhbHBoYTEKa2luZDogTmV0d29ya0NoYW9zCm1ldGFkYXRhOgogIG5hbWU6IG5ldHdvcmstZGVsYXkKICBuYW1lc3BhY2U6IGJ1c3lib3gKc3BlYzoKICBhY3Rpb246IGRlbGF5ICMgdGhlIHNwZWNpZmljIGNoYW9zIGFjdGlvbiB0byBpbmplY3QKICBtb2RlOiBhbGwKICBzZWxlY3RvcjoKICAgIHBvZHM6CiAgICAgIGJ1c3lib3g6CiAgICAgICAgLSBidXN5Ym94LTAKICBkZWxheToKICAgIGxhdGVuY3k6ICIxMG1zIgogIGR1cmF0aW9uOiAiNXMiCiAgc2NoZWR1bGVyOgogICAgY3JvbjogIkBldmVyeSAxMHMiCiAgZGlyZWN0aW9uOiB0bwogIHRhcmdldDoKICAgIHNlbGVjdG9yOgogICAgICBwb2RzOgogICAgICAgIGJ1c3lib3g6CiAgICAgICAgICAtIGJ1c3lib3gtMQogICAgbW9kZTogYWxsCg==
复制代码


再使用 chaos-mesh-action 注入该 chaos,配置如下:


- name: Run chaos mesh action     uses: chaos-mesh/chaos-mesh-action@xiang/refine_script     env:       CFG_BASE64: YXBpVmVyc2lvbjogY2hhb3MtbWVzaC5vcmcvdjFhbHBoYTEKa2luZDogTmV0d29ya0NoYW9zCm1ldGFkYXRhOgogIG5hbWU6IG5ldHdvcmstZGVsYXkKICBuYW1lc3BhY2U6IGJ1c3lib3gKc3BlYzoKICBhY3Rpb246IGRlbGF5ICMgdGhlIHNwZWNpZmljIGNoYW9zIGFjdGlvbiB0byBpbmplY3QKICBtb2RlOiBhbGwKICBzZWxlY3RvcjoKICAgIHBvZHM6CiAgICAgIGJ1c3lib3g6CiAgICAgICAgLSBidXN5Ym94LTAKICBkZWxheToKICAgIGxhdGVuY3k6ICIxMG1zIgogIGR1cmF0aW9uOiAiNXMiCiAgc2NoZWR1bGVyOgogICAgY3JvbjogIkBldmVyeSAxMHMiCiAgZGlyZWN0aW9uOiB0bwogIHRhcmdldDoKICAgIHNlbGVjdG9yOgogICAgICBwb2RzOgogICAgICAgIGJ1c3lib3g6CiAgICAgICAgICAtIGJ1c3lib3gtMQogICAgbW9kZTogYWxsCg==
复制代码


chaos-mesh-action 中会自动完成 Chaos Mesh 的安装和 chaos 的注入,简化了用户的使用。


测试验证


如上所示的步骤已经安装了环境,部署了应用,并注入了 chaos,接下来就要验证系统的正确性了。本文示例的验证比较简单,仅仅是在一个 Pod 中 Ping 另外一个 Pod,观察网络延迟的变化,配置如下:


- name: Verify     run: |       echo "do some verify"       kubectl exec busybox-0 -it -n busybox -- ping -c 30 busybox-1.busybox.busybox.svc
复制代码


这样就完成了 workflow 的配置,以上这些配置的完整内容参见示例配置文件。


运行 workflow

通过提交 pr 到 master 分支来触发该 workflow,然后观察 workflow 的运行结果。其中验证部分的输出如下:


do some verifyUnable to use a TTY - input is not a terminal or the right kind of filePING busybox-1.busybox.busybox.svc (10.244.0.6): 56 data bytes64 bytes from 10.244.0.6: seq=0 ttl=63 time=0.069 ms64 bytes from 10.244.0.6: seq=1 ttl=63 time=10.136 ms64 bytes from 10.244.0.6: seq=2 ttl=63 time=10.192 ms64 bytes from 10.244.0.6: seq=3 ttl=63 time=10.129 ms64 bytes from 10.244.0.6: seq=4 ttl=63 time=10.120 ms64 bytes from 10.244.0.6: seq=5 ttl=63 time=0.070 ms64 bytes from 10.244.0.6: seq=6 ttl=63 time=0.073 ms64 bytes from 10.244.0.6: seq=7 ttl=63 time=0.111 ms64 bytes from 10.244.0.6: seq=8 ttl=63 time=0.070 ms64 bytes from 10.244.0.6: seq=9 ttl=63 time=0.077 ms……
复制代码


可以看出,延迟大约会持续 5 次在 10ms 以上,之后又恢复到 0.1 ms 左右,符合 chaos 配置的预期。


案例

目前我们已经把 chaos-mesh-action 应用在了 tidb-operator 项目中,可以查看 tidb-operator/actions/workflow/chaos,该 workflow 注入了 pod-failure 类型的 chaos,来验证 operator 指定实例的重启功能,在 operator 的 pods 被 chaos 随机删除的情况下是否可以正常工作。我们计划将更多的测试迁移到 GitHub Actions 中,并使用 chaos-mesh-action 进行混沌测试,确保我们系统的稳定性。


本文转载自公众号 PingCAP(ID:pingcap2015)。


原文链接


Chaos Mesh® X GitHub Actions —— 把混沌工程集成到你的 CI 中


2020 年 9 月 06 日 14:031429

评论

发布
暂无评论
发现更多内容

【设计思想解读开源框架】android享学课堂vip课程下载

android 程序员 移动开发

Java hashCode() 指南

信码由缰

Java hashcode

Adts 解析及AAC 编码

糖米唐爹

ffmpeg aac,

handlermapping作用,扔物线朱凯

android 程序员 移动开发

凌晨 12 点突发 Istio 生产事故!一顿操作猛如虎解决了

青云技术社区

云原生 Istio, kubenetes

kotlin协程原理,动脑学院vip

android 程序员 移动开发

一线互联网移动架构师360°全方面性能调优,Android开发面试题目

android 程序员 移动开发

一起看看这些大厂面试真题查漏补缺吧,Android面试题中高级

android 程序员 移动开发

从不一样的角度描述Android事件传递,字节跳动面试官

android 程序员 移动开发

鸿蒙小游戏-数字华容道 自定义组件的踩坑记录

爱吃土豆丝的打工人

鸿蒙 HarmonyOS 自定义组件 小型游戏

一个月成功收割腾讯、阿里、字节offer,食堂大妈看完都会了

android 程序员 移动开发

个人开发者做一款App需要知道的事情,推荐

android 程序员 移动开发

作为程序员一定不要仅仅追求物质,做了6年Android开发

android 程序员 移动开发

flutter技术解析与实战!动脑学院视频百度云

android 程序员 移动开发

GitHub标星1w的安卓架构师必备技能,腾讯T2手把手教你

android 程序员 移动开发

一线互联网大厂中高级Android面试真题收录,android音视频开发面试

android 程序员 移动开发

千言-情感分析2.0发布,三大数据集升级打造中文情感分析影响力

科技热闻

从三流Android外包到秒杀阿里P7,从理论到实践

android 移动开发

flutter音视频开发,动脑学院vip2019

android 程序员 移动开发

万字长文,扔物线课程怎么样

android 程序员 移动开发

了解Android架构组件后构建APP超简单,阿里P7大牛手把手教你

android 程序员 移动开发

五面阿里拿下飞猪事业部offer,思维导图+源代码+笔记+项目

android 程序员 移动开发

架构训练营第3期模块一作业

吴霏

架构实战营 #架构实战营 「架构实战营」

作为一个程序员你觉得最大的悲哀是什么,安卓音视频开发

android 程序员 移动开发

模块一学习笔记、总结

吴霏

架构实战营 「架构实战营」

不可多得的干货!动脑学院vip2019百度网盘

android 程序员 移动开发

为了跳槽强刷1000道Android真题,研发4面真题解析(Android岗)

android 程序员 移动开发

hashmap为什么是线程不安全的,动脑学院百度网盘

android 程序员 移动开发

一个回答引发热烈讨论,2021程序员进阶宝典

android 程序员 移动开发

一线互联网架构师筑基必备技能之Android篇,2021年安卓开发者跳槽指南

android 程序员 移动开发

事件分发流程图,扔物线课程怎么样

android 程序员 移动开发

数据cool谈(第2期)寻找下一代企业级数据库

数据cool谈(第2期)寻找下一代企业级数据库

Chaos Mesh® X GitHub Actions —— 把混沌工程集成到你的 CI 中-InfoQ