跳至主内容

chaos-mesh-action:将混沌工程集成到您的 CI 中

· 1 分钟阅读
Xiang Wang
Committer of Chaos Mesh
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

chaos-mesh-action - 将混沌工程集成到您的 CI 中
chaos-mesh-action - 将混沌工程集成到您的 CI 中

Chaos Mesh 是一款面向 Kubernetes 环境的云原生混沌测试平台。尽管该平台凭借丰富的故障注入类型和易用的仪表板广受社区欢迎,但此前难以将其与端到端测试或持续集成(CI)流程结合使用。这导致系统开发过程中引入的问题无法在发布前被发现。

本文将分享如何通过 chaos-mesh-action(一个 GitHub Action)将 Chaos Mesh 集成到 CI 流程中。

chaos-mesh-action 已在 GitHub 市场 上架,源代码托管于 GitHub

chaos-mesh-action 的设计

GitHub Actions 是 GitHub 原生支持的 CI/CD 功能,通过它我们可在 GitHub 仓库中轻松构建自动化、可定制的软件开发工作流。

结合 GitHub Actions,Chaos Mesh 能更便捷地融入系统日常开发和测试,确保每次 GitHub 代码提交既无缺陷也不会破坏现有功能。下图展示了 chaos-mesh-action 在 CI 工作流中的集成方式:

CI 工作流中的 chaos-mesh-action 集成
CI 工作流中的 chaos-mesh-action 集成

在 GitHub 工作流中使用 chaos-mesh-action

chaos-mesh-action 运行于 GitHub 工作流中。GitHub 工作流是可配置的自动化流程,可用于构建、测试、打包、发布或部署 GitHub 项目。要将 Chaos Mesh 集成到 CI 中,请执行以下操作:

  1. 设计工作流

  2. 创建工作流

  3. 运行工作流

设计工作流

设计工作流前需考虑以下问题:

  • 我们需要在此工作流中测试哪些功能?

  • 将注入哪些类型的故障?

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

例如,我们设计一个简单的测试工作流,包含以下步骤:

  1. 在 Kubernetes 集群中创建两个 Pod

  2. 从一个 Pod 向另一个 Pod 执行 Ping 操作

  3. 使用 Chaos Mesh 注入网络延迟混沌,测试 ping 命令是否受影响

创建工作流

设计工作流后,下一步是创建它。

  1. 导航至包含待测软件的 GitHub 仓库

  2. 点击 Actions,然后点击 New workflow 按钮开始创建工作流:

创建工作流
创建工作流

工作流本质上是按顺序自动执行的任务配置。请注意,所有任务都在单个文件中配置。为清晰演示,我们将脚本拆分为不同任务组,如下所示:

  • 设置工作流名称和触发规则

    此任务将工作流命名为"Chaos"。当代码被推送到 master 分支或有拉取请求提交到 master 分支时,此工作流将被触发。

    name: Chaos

    on:
    push:
    branches:
    - master
    pull_request:
    branches:
    - master
  • 安装 CI 相关环境

    此配置指定使用 Ubuntu 操作系统,并通过 helm/kind-action 创建 Kind 集群。随后输出集群相关信息,最后检出 GitHub 仓库供工作流访问。

    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
  • 部署应用程序

    在我们的示例中,此任务部署了一个创建两个 Kubernetes Pod 的应用程序。

    - name: Deploy an application
    run: |
    kubectl apply -f https://raw.githubusercontent.com/chaos-mesh/apps/master/ping/busybox-statefulset.yaml
  • 使用 chaos-mesh-action 注入混沌实验

    - name: Run chaos mesh action
    uses: chaos-mesh/chaos-mesh-action@v0.5
    env:
    CHAOS_MESH_VERSION: v1.0.0
    CFG_BASE64: YXBpVmVyc2lvbjogY2hhb3MtbWVzaC5vcmcvdjFhbHBoYTEKa2luZDogTmV0d29ya0NoYW9zCm1ldGFkYXRhOgogIG5hbWU6IG5ldHdvcmstZGVsYXkKICBuYW1lc3BhY2U6IGJ1c3lib3gKc3BlYzoKICBhY3Rpb246IGRlbGF5ICMgdGhlIHNwZWNpZmljIGNoYW9zIGFjdGlvbiB0byBpbmplY3QKICBtb2RlOiBhbGwKICBzZWxlY3RvcjoKICAgIHBvZHM6CiAgICAgIGJ1c3lib3g6CiAgICAgICAgLSBidXN5Ym94LTAKICBkZWxheToKICAgIGxhdGVuY3k6ICIxMG1zIgogIGR1cmF0aW9uOiAiNXMiCiAgc2NoZWR1bGVyOgogICAgY3JvbjogIkBldmVyeSAxMHMiCiAgZGlyZWN0aW9uOiB0bwogIHRhcmdldDoKICAgIHNlbGVjdG9yOgogICAgICBwb2RzOgogICAgICAgIGJ1c3lib3g6CiAgICAgICAgICAtIGJ1c3lib3gtMQogICAgbW9kZTogYWxsCg==

    通过 chaos-mesh-action,Chaos Mesh 的安装和混沌实验注入将自动完成。您只需准备好要使用的混沌实验配置,并获取其 Base64 编码值。这里我们计划向 Pod 注入网络延迟故障,原始配置如下:

    apiVersion: chaos-mesh.org/v1alpha1
    kind: NetworkChaos
    metadata:
    name: network-delay
    namespace: busybox
    spec:
    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

    可通过以下命令获取该配置文件的 Base64 编码值:

    $ base64 chaos.yaml
  • 验证系统正确性

    在此任务中,工作流从一个 Pod ping 另一个 Pod 并观察网络延迟变化:

    - name: Verify
    run: |
    echo "do some verification"
    kubectl exec busybox-0 -it -n busybox -- ping -c 30 busybox-1.busybox.busybox.svc

运行工作流

工作流配置完成后,可通过向 master 分支提交 pull request 触发执行。工作流完成后,验证任务会输出类似以下结果:

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

输出显示存在持续约 5 秒的 10 毫秒规律性延迟,这与我们通过 chaos-mesh-action 注入的混沌实验配置完全吻合。

当前进展与后续计划

目前,我们已将 chaos-mesh-action 应用于 TiDB Operator 项目。工作流中注入了 PodChaos 故障,用于验证 Operator 指定实例的重启功能,目的是确保当 Operator 的 Pod 被注入的故障随机删除时,tidb-operator 仍能正常工作。您可以在 TiDB Operator 页面 查看更多详情。

未来,我们计划将 chaos-mesh-action 应用于更多测试场景,以确保 TiDB 及相关组件的稳定性。欢迎您使用 chaos-mesh-action 创建自己的工作流。

如果您发现错误或认为缺少某些功能,欢迎提交 issue、提交 pull request (PR),或加入 CNCF Slack 工作区的 #project-chaos-mesh 频道与我们交流。