前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TKE上玩混沌

TKE上玩混沌

原创
作者头像
鲍远林
修改2020-12-18 13:17:15
8820
修改2020-12-18 13:17:15
举报
文章被收录于专栏:泛互云原生泛互云原生

为了保障云上客户的系统稳定性,最近研究了混沌工程 Chaos Engineering 的历史和相关工具。本篇探讨下混沌工程的历史,社区给的实践原则,同时演示下混沌工具 Chaos-mesh 在腾讯云 TKE 上的使用。

1. 混沌工程的起源

混沌工程原则 principles of chaos engineering 里关于 Chaos Engineering 的定义如下:

Chaos Engineering is the discipline of experimenting on a system in order to build confidence in the system’s capability to withstand turbulent conditions in production.

混沌工程是在分布式系统上进行实验的学科, 目的是建立对系统抵御生产环境中失控条件的能力以及信心。

2010年,Netflix 迁移上 AWS 云时,为了保证 AWS 实例的故障不会给 Netflix 的用户体验造成影响,Netflix Eng Tools 团队开发了大名鼎鼎的 Chaos Monkey 工具,并用它来进行云上故障模拟测试。

2014年时,Netflix 的 Bruce Wong 设立了一个新的职位 — “混沌工程师”,接着 Dan Woods 在 Twitter 上向广大的工程社区推广。于是 混沌工程(Chaos Engineering) 这个牛B加时髦的名称从此诞生了。有关 Chaos Engineering 的发展史可参考这篇 blog:Chaos Engineering: the history, principles, and practice

2. 成熟度模型和混沌工程原则

在 Netflix 大佬们出的 Chaos Engineering(一本免费的电子书,注册了 O'Reilly 账户就可以阅读)一书中体系化的阐述了混沌工程,而且还搞出了一个高大上的混沌工程成熟度模型。简单来说,该模型从 Sophistication 和 Adoption 两个维度来衡量混沌工程的落地程度:

  • Sophistication

反映混沌工程项目的有效性和安全性,比如在生产环境做混沌实验的要比测试环境好;可以自动化开展混沌实验的要比手工操作好;能够进行复杂场景的混沌实验并能控制影响范围的要比简单的制造 CPU/IO 飙升来的好。

  • Adoption

混沌实验接纳程度,衡量混沌工程实验覆盖的广度和深度。其实就是衡量一家公司对混沌工程的接受程度。比如牛X的大厂会在所有核心系统都会经常进行混沌工程实验,那就混沌工程的接受程度就高。

此外,Chaso Community 在其 principles of chaos engineering 中也给出一些混沌工程原则和最佳实践,具体见下图。

3. TKE 上玩转 Chaos-mesh

接下来通过一个完整的在线商城系统,详细讲解下开源混沌工具 Chaos-mesh 的安装和使用。

3.1 在线商城系统

在线商城系统是由腾讯云的服务网格团队开发的一个基于 Istio 的 service mesh demo 例子,可以在 github 上下载 tcm-demo 。需要注意一点,在安装该商城系统前,需要先在 TKE 上建立好集群以及服务网格

下载完 tcm-demo 后,进入 install 目录,使用下面两条命令安装服务和路由。

代码语言:txt
复制
# Step 1:安装商城服务
kubectl apply -f base_apps.yaml

# Step 1:安装路由
kubectl apply -f base_routing.yaml

安装完成后,在控制台进入服务网格 -> Gateway,即可看到下图中展示的公网 IP,在浏览器中打开后就能看到在线商城的页面了。

3.2 Chaos-mesh 简介

Chaos-mesh 是 PingCAP 于2019 年 12 月 31 日开源的一款云原生的混沌测试平台。Chaos-mesh 按三层架构进行设计,整体非常清晰:

  • Controller Manager

Controller Manager 是 Chaos-mesh 的总控,为 Chaos-mesh 与 Kubernetes 交互模块,主要包括两部分,一部分为 CRD 结构定义,另一部分主要为接收 Kubernetes 事件以及对各类 Chaos 对象的调度与管理。

  • Daemon 节点

每个 K8S Node 都会安装一个实例,通过 gRPC 协议接收来自 Controllers 请求进行具体的混沌注入逻辑。

  • 注入层

以 sidecar 模式向真实运行的 Pod 注入混沌事件。

3.3 Chaos-mesh 安装和使用

Chaos-mesh 的安装很简单,官方文档也有详细说明。简单来说,执行下面命令即可在你的 k8s 集群中进行安装:

代码语言:txt
复制
curl -sSL [https://mirrors.chaos-mesh.org/v1.0.3/install.sh](https://mirrors.chaos-mesh.org/v1.0.3/install.sh) | bash

安装完成后,执行 kubectl get pod -n chaos-testing 可验证 chaos-mesh 是否正常运行,正常情况下会出现下面的输出:

代码语言:shell
复制
➜  ~ kubectl get pod -n chaos-testing

NAME                                        READY   STATUS    RESTARTS   AGE
chaos-controller-manager-7c79874597-fdkzr   1/1     Running   0          18m
chaos-daemon-ddgnt                          1/1     Running   0          18m
chaos-daemon-sssqv                          1/1     Running   0          18m
chaos-daemon-vqnkb                          1/1     Running   0          18m
chaos-dashboard-5dc4bfbd8b-sn7k7            1/1     Running   0          18m

接下来为 chaos-mesh dashboard 建立路由服务,具体如下图,在 TKE 控制台里选择 集群 -> 服务与路由 -> Ingress,然后为 chaos-mesh dashboard 建立一个 ingress。建立完成后,会出现下图所示的 Ingress 信息,其中后端服务会展示一个公网URL到 chaos-dashboard 的映射:http://xxx.xxx.xxx.xxx/-->chaos-dashboard:2333。直接点击该 URL 就可以看到 chaos-dashboard 了。

下图为 chaos-dashboard 界面。

3.4 使用 chaos-mesh 在 TKE 上进行混沌实验

Chaos-mesh 提供了很多故障注入功能,当前支持:

  • pod-kill:模拟 K8S Pod 被 kill
  • pod-failure:模拟 K8S Pod 持续不可用,可以用来模拟节点宕机不可用场景
  • network-delay:模拟网络延迟
  • network-loss:模拟网络丢包
  • network-duplication: 模拟网络包重复
  • network-corrupt: 模拟网络包损坏
  • network-partition:模拟网络分区
  • I/O delay : 模拟文件系统 I/O 延迟
  • I/O errno:模拟文件系统 I/O 错误
  • cpu-burn:模拟 CPU 使用率飚高
  • memory-burn:模拟内存用满

下面通过两个具体的例子 pod-failure,network-delay,来展示下 chaos-mesh 的使用。可在 github chaos-mesh 的 example 目录里找到更多的使用示例。

3.4.1 pod-failure

下面是 pod-failure 的 yaml,在命令行执行 kubectl apply -f pod-failure.yaml 即可。

代码语言:txt
复制
# pod-failure.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
  name: pod-failure    # Pod 故障
  namespace: base      # 目标 Pod 所在的命名空间
spec:
  action: pod-failure  # 故障注入类型
  mode: one            # 一次注入一个 pod
  value: ""
  duration: "30s"      # 故障持续时间
  selector:
    labelSelectors:
      "app": "products"  # 注入故障的服务
  scheduler:
    cron: "@every 1m"    # 每 1 分钟注入一次

由于该实验每分钟为 products 注入一次 pod-failure,且每次持续 30s。因而访问商城页面时,会间隔性的看不到任何商品信息。

通过 lens 也可以看到 products 的 pod 出现了告警。

Dashboard 里面可以看到 pod-failure 实验的详细信息。

如果想停止实验的话,直接 kubectl delete 即可。

代码语言:text
复制
➜  chaos-mesh kubectl delete -f pod-failure.yaml
podchaos.chaos-mesh.org "pod-failure" deleted

3.4.2 网络延迟

在进行网格相关的混沌实验时,如果出现 networkchaos-controller rpc error 的错误导致失败(本文中使用的是 chaos-mesh 1.0.3 版 出现过该问题),需要在 DaemonSet 的 deployment yaml 中添加以下配置。

代码语言:txt
复制
spec:
  template:
   spec:
     hostNetwork: true

也可以使用其它方式解决,具体见 chaos-mesh issue #391 中的描述。

下面是网络延迟的 yaml,每15秒为 discount 服务注入1次 100ms 的延迟,持续时间 10s。混沌事件注入后,访问商城页面时,商品信息会有明显的间隔性延迟。

代码语言:yaml
复制
# network-delay.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
  name: network-delay
  namespace: base
spec:
  action: delay # 故障注入类型
  mode: one
  selector:
    labelSelectors:
      "app": ”discount" # 注入故障的服务
  delay:
    latency: ”100ms“  # 网络延迟 100ms
    correlation: "25"
    jitter: "90ms"
  duration: “10s” # 持续 10s
scheduler:
  cron: “@every 15s” # 每15秒注入一次

3.4.3 Dashboard 上创建混沌实验

Dashboard 里也可以创建混沌实验,具体见下图,点击 NEW EXPERMENT 按钮即可。Dashboard 里会看到历史的混沌实验信息,因而可以从历史记录中选择一个,当然也可以全部新建。对于创建步骤中的输入信息不了解的,可参考 官方文档,里面有详细说明,这里不再赘述。

Chaos-mesh 还提供了一个在线的交互式入门教程 Interactive Tutorial,方便新手快速掌握和使用。

4. 小结

在大规模分布式微服环境下,混沌工程有个日常测试无法替代的价值。通过例行的混沌实验可以让重大风险在可控范围内提前暴露,从而避免或降低业务损失;也可以检验系统的容错和容灾能力,以及线上故障应急处理流程等多个方面。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 混沌工程的起源
  • 2. 成熟度模型和混沌工程原则
  • 3. TKE 上玩转 Chaos-mesh
    • 3.1 在线商城系统
      • 3.2 Chaos-mesh 简介
        • 3.3 Chaos-mesh 安装和使用
          • 3.4 使用 chaos-mesh 在 TKE 上进行混沌实验
            • 3.4.1 pod-failure
            • 3.4.2 网络延迟
            • 3.4.3 Dashboard 上创建混沌实验
        • 4. 小结
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档