ChaosBlade:从零开始的混沌工程(三

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 本篇为系列文章第三篇,将使用 ChaosBlade Operator 对 Kubernetes Pod 进行混沌工程实验,实验包括:删除 POD 场景、Pod 网络延迟场景、Pod 网络丢包场景、Pod 域名访问异常场景和Pod 文件系统 I/O 故障场景。

前言

在上篇文章中,我们介绍了如何安装 ChaosBlade Operator,并进行了简单的使用。从本章开始,所有的实践章节,都会有配套的 katacode 交互式教程,读者可用通过 katacode,在浏览器上操作真实的 Kubernetes 和 ChaosBlade。

KataCoda 教程:《ChaosBlade Pod 实验场景》

实验对象:Pod

Pod 是 Kubernetes 应用程序的基本执行单元,即它是 Kubernetes 对象模型中创建或部署的最小和最简单的单元。Pod 表示在 集群 上运行的进程。

Pod 封装了应用程序容器(或者在某些情况下封装多个容器)、存储资源、唯一网络 IP 以及控制容器应该如何运行的选项。 Pod 表示部署单元:Kubernetes 中应用程序的单个实例,它可能由单个 容器 或少量紧密耦合并共享资源的容器组成。

Pod 实验场景

Pod 作为 Kubernetes 最基本的执行单元,对于 Kubernetes 集群来说十分重要。那么对于混沌工程,从 Pod 入手实践就再合适不过了。

本篇默认已安装 guestbook 应用和 ChaosBlade Operator。

删除 Pod 场景

实验目标:删除 chaosblade 命名空间下标签是 role=master 的 pod。

执行观测

开始观察需要删除的 pod:

$ kubectl get pod -l "role=master" -n chaosblade -w

开始实验

delete_pod_by_labels.yaml 内容:

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
  name: delete-two-pod-by-labels
spec:
  experiments:
  - scope: pod
    target: pod
    action: delete
    desc: "delete pod by labels"
    matchers:
    - name: labels
      value:
      - "role=master"
    - name: namespace
      value:
      - "chaosblade"
    - name: evict-count
      value:
      - "2"

新建终端,并开始实验:

$ kubectl apply -f delete_pod_by_labels.yaml

查看实验状态

执行命令:kubectl get blade delete-two-pod-by-labels -o json,查看实验状态。

查看实验结果

通过上面的观测命令,可以看到 pod 被删除并重启,结果符合预期。

停止实验

执行命令:kubectl delete -f delete_pod_by_labels.yaml

或者直接删除 blade 资源:kubectl delete blade delete-two-pod-by-labels

Pod 网络延迟场景

实验目标:在 chaosblade 命名空间中,对 redis-master-68857cd57c-dzbs9 Pod 的本地 6379 端口添加 3000 毫秒访问延迟,延迟时间上下浮动 1000 毫秒。

开始实验

delay_pod_network_by_names.yaml 内容:

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
  name: delay-pod-network-by-names
spec:
  experiments:
  - scope: pod
    target: network
    action: delay
    desc: "delay pod network by names"
    matchers:
    - name: names
      value:
      - "redis-master-68857cd57c-dzbs9"
    - name: namespace
      value:
      - "chaosblade"
    - name: local-port
      value: ["6379"]
    - name: interface
      value: ["eth0"]
    - name: time
      value: ["3000"]
    - name: offset
      value: ["1000"]

获取 Pod 名称:

$ kubectl get pod -l app=redis,role=master -o jsonpath={.items..metadata.name}

修改 delay_pod_network_by_names.yaml 中的 name 字段的值。

执行命令,开始实验:

$ kubectl apply -f delay_pod_network_by_names.yaml

查看实验状态

执行 kubectl get blade delay-pod-network-by-names -o json 命令,查看实验状态。

观测结果

# 获取实验 pod ip
$ kubectl get pod -l app=redis,role=master -o jsonpath={.items..status.podIP}
10.42.69.44
# 进入观测 pod
$ kubectl exec -it redis-slave-6dd975d4c8-2zrkb bash
# 在 pod 中安装 telnet
$ apt-get update && apt-get install -y telnet
# 测试时间
$ time echo "" | telnet 10.42.69.44 6379
Trying 10.42.69.44...
Connected to 10.42.69.44.
Escape character is '^]'.
Connection closed by foreign host.

real    0m3.790s
user    0m0.007s
sys     0m0.001s

可以看到访问实验 pod 6379 端口的延迟为 3s 左右,结果符合预期。

delay-pod-network

停止实验

执行命令:kubectl delete -f delay_pod_network_by_names.yaml

或者直接删除 blade 资源:kubectl delete blade delay-pod-network-by-names

Pod 网络丢包场景

实验目标:在 chaosblade 命名空间中,对 redis-master-68857cd57c-dzbs9 Pod 注入丢包率 100% 的故障,只针对 IP 为 10.42.69.42 的 pod 生效,也就是除 10.42.69.42 以外的 pod 都能正常访问 redis-master-68857cd57c-dzbs9

开始实验

获取 pod 名称内容同上。

loss_pod_network_by_names.yaml 内容:

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
  name: loss-pod-network-by-names
spec:
  experiments:
  - scope: pod
    target: network
    action: loss
    desc: "loss pod network by names"
    matchers:
    - name: names
      value:
      - "redis-master-68857cd57c-dzbs9"
    - name: namespace
      value:
      - "chaosblade"
    - name: interface
      value: ["eth0"]
    - name: percent
      value: ["100"]
    - name: timeout
      value: ["60"]
    - name: destination-ip
      value: ["10.42.69.42"]

执行命令,开始实验:

$ kubectl apply -f loss_pod_network_by_names.yaml

查看实验状态

执行 kubectl get blade loss-pod-network-by-names -o json 命令,查看实验状态。

观测结果

# 获取实验 pod ip
$ kubectl get pod -l app=redis,role=master -o jsonpath={.items..status.podIP}
10.42.69.44
# 进入观测 pod,IP为:10.42.69.42(被设置丢包率 100%)
$ kubectl exec -it redis-slave-6dd975d4c8-lm8jz bash
# Ping 实验Pod ip
$ ping 10.42.69.44
PING 10.42.69.44 (10.42.69.44) 56(84) bytes of data.
# 无响应

# 进入观测 pod,该 pod 未被指定丢包
$ kubectl exec -it redis-slave-6dd975d4c8-2zrkb bash
# Ping 实验Pod ip
$ ping 10.42.69.44
PING 10.42.69.44 (10.42.69.44) 56(84) bytes of data.
64 bytes from 10.42.69.44: icmp_seq=1 ttl=63 time=0.128 ms
64 bytes from 10.42.69.44: icmp_seq=2 ttl=63 time=0.128 ms
64 bytes from 10.42.69.44: icmp_seq=3 ttl=63 time=0.092 ms
...
# 响应正常

可以看到观测 pod 访问实验 pod 丢包率 100%(无法访问),而其他 pod 不受影响,结果符合预期。

loss-pod-network

这里在配置中将 timeout 设置为 60 秒,60 秒后 100% 丢包的情况将会消失,这个配置是为了防止因丢包率设置太高,造成机器无法连接的情况。与其有相似功能的还有 exclude-port,该配置指定一些端口不会丢包,以免该 pod 失联。

停止实验

执行命令:kubectl delete -f loss_pod_network_by_names.yaml

或者直接删除 blade 资源:kubectl delete blade loss-pod-network-by-names)

Pod 域名访问异常场景

实验目标:Pod 内访问指定域名异常。

开始实验

获取 pod 名称内容同上。

dns_pod_network_by_names.yaml 内容:

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
  name: dns-pod-network-by-names
spec:
  experiments:
  - scope: pod
    target: network
    action: dns
    desc: "dns pod network by names"
    matchers:
    - name: names
      value:
      - "redis-slave-6dd975d4c8-lm8jz"
    - name: namespace
      value:
      - "chaosblade"
    - name: domain
      value: ["www.baidu.com"]
    - name: ip
      value: ["10.0.0.1"]

执行命令,开始实验:

$ kubectl apply -f dns_pod_network_by_names.yaml

查看实验状态

执行 kubectl get blade dns-pod-network-by-names -o json 命令,查看实验状态。

观测结果

# 进入实验 pod
$ kubectl exec -it redis-slave-6dd975d4c8-lm8jz bash
# Ping www.baidu.com
$ ping www.baidu.com
# 无响应

可以看到访问指定域名 www.baidu.com 异常,结果符合预期。

dns-pod-network

停止实验

执行命令:kubectl delete -f dns_pod_network_by_names.yaml

或者直接删除 blade 资源:kubectl delete blade dns-pod-network-by-names

Pod 文件系统 I/O 故障场景

实验目标:给 kubernetes 的 pod 注入文件系统I/O故障。

注意:此场景需要激活 --webhook-enable 参数,如需使用此功能,请在 chaosblade-operator 参数中添加 --webhook-enable,或者在安装时指定:例如 helm 安装时添加 --set webhook.enable=true 指定。

前提条件

  • 集群中部署了 chaosblade-admission-webhook
  • 需要注入故障的 volume 设置 mountPropagationHostToContainer
  • pod上面添加了如下annotations:
chaosblade/inject-volume: "data" //需要注入故障的volume name
chaosblade/inject-volume-subpath: "conf" //volume挂载的子目录

部署测试 pod

chaosblade webhook 会根据 pod 的 annotation,注入 fuse 的 sidecar 容器:

  1. chaosblade/inject-volume 指明需要注入故障的 volume name,比如例子中的 data
  2. chaosblade/inject-volume-subpath 指明 volume 挂载路径的子目录。上面的例子中,volume 的挂载路径是 /data,子目录是 conf,则在 pod 内,注入I/O异常的目录是 /data/conf
  3. 指定需要注入故障的 volume 需要指定 mountPropagation:HostToContainer,这个字段的含义可以参考官方文档 Volumes
# 部署测试 pod
$ kubectl apply -f io-test-pod.yaml
# 查看 sidecar 是否注入成功
$ kubectl get pod test-7c9fc6fd88-7lx6b -n chaosblade
NAME                    READY   STATUS    RESTARTS   AGE
test-7c9fc6fd88-7lx6b   2/2     Running   0          4m8s

开始实验

pod_io.yaml 内容:

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
  name: inject-pod-by-labels
spec:
  experiments:
  - scope: pod
    target: pod
    action: IO
    desc: "Pod IO Exception by labels"
    matchers:
    - name: labels
      value:
      - "app=test"
    - name: namespace
      value:
      - "chaosblade"
    - name: method
      value:
      - "read"
    - name: delay
      value:
      - "1000"
    - name: path
      value:
      - ""
    - name: percent
      value:
      - "60"
    - name: errno
      value:
      - "28"

执行命令,开始实验:

$ kubectl apply -f pod_io.yaml

查看实验状态

执行 kubectl get blade inject-pod-by-labels -o json 命令,查看实验状态。

观测结果

# 进入实验 pod
$ kubectl exec -it test-7c9fc6fd88-7lx6b bash
# 在 pod 内读取指定目录中的文件,如果没有可以新建一个
$ time cat /data/conf/test.yaml
cat: read error: No space left on device

real    0m3.007s
user    0m0.002s
sys     0m0.002s
# 因为有重试,显示有 3s 的延迟
# 因为设置了 60% 的异常,所有还是有成功的情况
$ time cat /data/conf/test.yaml
123

real    0m0.004s
user    0m0.002s
sys     0m0.000s

文件读取异常,结果符合预期。

io-pod-read

在本例中,我们对 read 操作注入两种异常,异常率为百分之60:

  • read 操作增加 1s 的延迟。
  • read 操作返回错误 28

这里只是做了一种类型的实验,更多的实验类型详见官方文档

停止实验

执行命令:kubectl delete -f pod_io.yaml

或者直接删除 blade 资源:kubectl delete blade inject-pod-by-labels

删除测试 pod:kubectl delete -f io-test-pod.yaml

结语

本篇我们使用 ChaosBlade Operator 对 Kubernetes Pod 资源进行混沌工程实验,可以看到 ChaosBlade 的操作简单易懂且功能强大,通过模拟不同的故障,可以检验我们系统监控报警的时效性,也可以检验我们系统在遇到故障时的情况,根据这些情况对系统进行调整,从而完善系统架构,增加可用性。

这里只是对于每种场景进行了简单的实验,而每个场景不止有一种实验方式,用户可以通过调整参数进行不同的实验。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
Web App开发 监控 Kubernetes
容器技术入门3:chaos混沌工程
参加冬季实战营第四期:零基础容器技术实战。参加学习一下,教程很好,做笔记记录一下。本文记录冬季实战营第四期:零基础容器技术实战动手实战-Chaos带你快速上手混沌工程。
1368 0
容器技术入门3:chaos混沌工程
|
6月前
|
tengine 算法 安全
ChaosBlade 是阿里巴巴开源的混沌工程工具
【2月更文挑战第23天】ChaosBlade 是阿里巴巴开源的混沌工程工具
135 1
|
Dubbo Java 应用服务中间件
无论多忙,都要掌握混沌工程入门方法
无论多忙,都要掌握混沌工程入门方法
|
监控 安全 Devops
学习笔记之初识混沌工程
最早由Netflix的技术团队提出,现已经演变成计算机科学的一门新兴学科,即“混沌工程”。
学习笔记之初识混沌工程
|
缓存 Kubernetes Cloud Native
混沌实施工具ChaosBlade实践
项目介绍 ChaosBlade 是阿里巴巴开源的混沌工程原理和混沌实验模型的实验注入工具。 ChaosBlade 使用比较简单,而且支持丰富的实验场景,场景包括: 基础资源:比如 CPU、内存、网络、磁盘、进程等实验场景; Java 应用:比如数据库、缓存、消息、JVM 本身、微服务等,还可以指定任意类方法注入各种复杂的实验场景; C++ 应用:比如指定任意方法或某行代码注入延迟、变量和返回值篡改等实验场景; Docker 容器:比如杀容器、容器内 CPU、内存、网络、磁盘、进程等实验场景; 云原生平台:比如 Kubernetes 平台节点上 CPU、内存、网络、磁盘、进程实验场景,Pod
229 0
|
Devops 测试技术
【混沌工程】混沌工程原理
混沌工程是在系统上进行实验的学科,目的是建立对系统承受生产中动荡条件的能力的信心。 大规模分布式软件系统的进步正在改变软件工程的游戏规则。作为一个行业,我们迅速采用提高开发灵活性和部署速度的做法。紧随这些好处之后的一个紧迫问题是:我们对投入生产的复杂系统有多少信心?
|
容器 Cloud Native Perl
面向云原生的混沌工程工具-ChaosBlade
作者 | 肖长军(穹谷)阿里云智能事业群技术专家   导读:随着云原生系统的演进,如何保障系统的稳定性受到很大的挑战,混沌工程通过反脆弱思想,对系统注入故障,提前发现系统问题,提升系统的容错能力。ChaosBlade 工具可以通过声明式配置执行混沌实验,简单高效。
|
自然语言处理 Kubernetes 监控
ChaosBlade:从混沌工程实验工具到混沌工程平台
ChaosBlade 是阿里巴巴 2019 年开源的混沌工程项目,已加入到 CNCF Sandbox 中。起初包含面向多环境、多语言的混沌工程实验工具 ChaosBlade,到现在发展到面向多集群、多环境、多语言的混沌工程平台 chaosblade-box,平台支持实验工具托管和工具自动化部署,通过统一用户实验界面,将用户的精力聚焦在通过混沌工程解决云原生过程中高可用问题上。本文从混沌实验模型抽象、混沌实验工具开源和混沌工程平台升级项目三阶段出发,详细介绍 ChaosBlade。
687 6
ChaosBlade:从混沌工程实验工具到混沌工程平台
|
Web App开发 数据安全/隐私保护 容器
Chaos带你快速上手混沌工程实验报告
Chaos带你快速上手混沌工程实验报告
207 0
Chaos带你快速上手混沌工程实验报告
|
Web App开发 存储 Kubernetes
带你快速上手混沌工程
容器服务Kubernetes版(简称ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理;是国内唯一入选2020年Gartner公共云容器报告的产品,并在2019年Forrester容器报告中获国内排名第一;整合了阿里云虚拟化、存储、网络和安全能力,助力企业高效运行云端Kubernetes容器化应用。
222 0
带你快速上手混沌工程
下一篇
无影云桌面