前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >混沌工程工具:chaos-mesh在服务器上注入项原理分析(2)

混沌工程工具:chaos-mesh在服务器上注入项原理分析(2)

原创
作者头像
AIOPS
修改2023-10-10 15:12:08
6180
修改2023-10-10 15:12:08
举报
文章被收录于专栏:高可用高可用

背景

上篇文章,总体上分析了chaosmesh和chaosblade两个工具的对比和原理,本文继续分析chaosmesh的原理;几个常用的项dnsChaos、stressChaos、NetworkChaos和IOChaos注入项的原理。

混沌工程工具系列传送门:

1、 混沌工程工具:Chaos-mesh与Chaosblade技术实现与原理分析(1)-腾讯云开发者社区-腾讯云

2、 混沌工程工具:chaos-mesh注入项原理分析(2)-腾讯云开发者社区-腾讯云

3、 混沌工程工具:chaosblade在服务器上注入项原理分析(3)-腾讯云开发者社区-腾讯云

4、 混沌工程工具:业务代码注入原理(4)-腾讯云开发者社区-腾讯云

5、 混沌工程工具:Chaosblade Java业务代码注入原理(5)-腾讯云开发者社区-腾讯云

6、 混沌工程工具:混沌工程实施过程及持久价值(7)-腾讯云开发者社区-腾讯云

7、 混沌工程工具:混沌工程定位及原则梳理(8)-腾讯云开发者社区-腾讯云

8、 混沌工程工具:一个混沌工程设计的例子(9)-腾讯云开发者社区-腾讯云

chaosmesh系统概述

chaosmesh注入命令展示

代码语言:javascript
复制
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
  name: memory-stress-example
  namespace: chaos-testing
spec:
  mode: one
  selector:
    labelSelectors:
      'app': 'app1'
  stressors:
    memory:
      workers: 4
      size: '256MB'

架构图

chaos-controller,混沌实验的调度与管理,可以接受kubectl原生指令,做预处理后,分发给chaos-daemon进行处理。

chaos-daemon,混沌实验的具体执行机构,主要是进入目标进程的各种namespace,完成实际注入工作。

chaos-dashbord,混沌实验的控制面板,通过控制面板可以执行、观察、管理混沌实验。

代码语言:javascript
复制
[root@VM-16-13-centos ~]# kubectl get pods -n chaos-testing
NAME                                        READY   STATUS    RESTARTS   AGE
chaos-controller-manager-86c6bbd86b-thgm2   1/1     Running   1          34d
chaos-controller-manager-86c6bbd86b-wph62   1/1     Running   0          34d
chaos-controller-manager-86c6bbd86b-z2slm   1/1     Running   0          30d
chaos-daemon-5qxwf                          1/1     Running   0          34d
chaos-dashboard-55c4f9d56-8wmzz             1/1     Running   0          34d
chaos-dns-server-94dc8479f-zwmc8            1/1     Running   1          34d

dnsChaos--dns混沌工程

基础原理

基于pincap的pingcap/coredns镜像,构建混沌工程专用DNS,然后通过用k8s_dns_chaos这个coredns插件,取代原生的kubernetes插件,管理该dns配置。

注入故障时,根据故障信息,修改故障域名的dns解析。然后在chaos-daemon上面,进入目标pod的mnt namespace,将dns配置指向混沌工程专用DNS的IP

注意:如果K8s原生的coredns有特殊配置,记得要同步到上面的DNS。

具体过程

1、 预处理输入的yaml文件,根据action修改指定域名的解析行为

代码:通过自定义controller中setDNSServerRules实现的。

代码语言:javascript
复制
func (impl *Impl) setDNSServerRules(dnsServerIP string, port int, name string, pod *v1.Pod, action v1alpha1.DNSChaosAction, patterns []string) error {
       impl.Log.Info("setDNSServerRules", "name", name)

1、 劫持pod里面container的/etc/resolv.conf的配置,指向自建的dns。

疑问:pod内所有的container的dns配置都改了吗?

解答:没有,只搞了特定的container。先copy,copy不行再通过mount namespace的方式覆盖dns配置

代码:通过自定义的Daemon server中SetDNSServer方法,来实现特定container dns配置的修改及恢复。

代码语言:javascript
复制
func (s *DaemonServer) SetDNSServer(ctx context.Context,
       req *pb.SetDNSServerRequest) (*empty.Empty, error) {
       processBuilder := bpm.DefaultProcessBuilder("sh", "-c", fmt.Sprintf("ls %s.chaos.bak || cp %s %s.chaos.bak", DNSServerConfFile, DNSServerConfFile, DNSServerConfFile)).SetContext(ctx)
       ...
       processBuilder = bpm.DefaultProcessBuilder("sh", "-c", fmt.Sprintf("cp %s temp && sed -i 's/.*nameserver.*/nameserver %s/' temp && cat temp > %s", DNSServerConfFile, req.DnsServer, DNSServerConfFile)).SetContext(ctx)

3、真正修改域名解析记录的行为,是通过k8s_dns_chaos这个插件实现的。

stressChaos--cpu/mem混沌工程

基础原理

chaos-daemon和node节点共享pid命名空间,所以可以在该node节点上目标pod里面,通过chaos-daemon中的stress-ng程序,给目标pod施加压力。

具体过程

启动stressChaos

代码语言:javascript
复制
processBuilder := bpm.DefaultProcessBuilder("stress-ng", strings.Fields(req.CpuStressors)...).
       EnablePause()
if req.EnterNS {
       processBuilder = processBuilder.SetNS(pid, bpm.PidNS)
}
cmd := processBuilder.Build(ctx)

proc, err := s.backgroundProcessManager.StartProcess(ctx, cmd)

退出/暂停stressChaos

代码语言:javascript
复制
err = s.backgroundProcessManager.KillBackgroundProcess(ctx, req.CpuInstanceUid)
err = s.backgroundProcessManager.KillBackgroundProcess(ctx, req.MemoryInstanceUid)

NetworkChaos--网络混沌工程

基础原理

对于丢包、延迟场景,主要使用的是netem内核模块进行丢包、延迟控制,同时借助iptables的能力,简化tc的配置

注意:需保证chaos-daemon与controller之间的通信能力。

具体过程

1、 获取混沌工程类型

代码语言:javascript
复制
case v1alpha1.NetemAction, v1alpha1.DelayAction, v1alpha1.DuplicateAction, v1alpha1.CorruptAction, v1alpha1.LossAction:
       tcType = v1alpha1.Netem

1、 创建目标IP分组并生成流量控制原始命令

代码语言:javascript
复制
dstIpset := ipset.BuildIPSet(targetPods, externalCidrs, networkchaos, string(tcType[0:2])+ipSetPostFix, m.Source)
m.T.Append(dstIpset)
m.T.Append(v1alpha1.RawTrafficControl{
       Type:        tcType,
       TcParameter: spec.TcParameter,
       Source:      m.Source,
       IPSet:       dstIpset.Name,
       Device:      device,
}) #加入命令队列

1、 清空iptables规则

代码语言:javascript
复制
m.CreateNewPodNetworkChaos(ctx) # 获取相关pod的API对象
m.T.Apply(chaos) # 清空iptables规则,执行后续命令

1、 待续

IOChaos--IO混沌工程

基础原理

这里原理较简单,大概流程是在目标文件系统前面加了一层ChaosFS,目标系统调用->内核->ChaosFS->目标文件系统,但内核原理有点难以理解

目前遇到的问题是:容器内挂载的volume的目录,是可以注入latency故障的;rootfs内的目录,不可以注入latency故障,原因待查

https://pingcap.medium.com/how-to-simulate-i-o-faults-at-runtime-898daec51c90

具体过程

Chaosblade与ChaosMesh组件简单总结

分类

Chaosblade

Chaosmensh

daemonset

1、 针对pod,类似一个agent,做混沌工程工具的下载/清理 2、 针对node,类似一个普通进程,执行了node级别的混沌工程

只针对pod,类似一个superuser,通过进入其它pod相应的命名空间,执行相应的混沌工程。与sudo有点像

开源框架

具体到具体的组件方法级别,并可对具体的演练行为做精细化控制,精准。

只能在入口方法做粗糙的演练,没办法对演练行为做控制。

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 混沌工程工具系列传送门:
  • chaosmesh系统概述
    • chaosmesh注入命令展示
      • 架构图
      • dnsChaos--dns混沌工程
        • 基础原理
          • 具体过程
          • stressChaos--cpu/mem混沌工程
            • 基础原理
              • 具体过程
              • NetworkChaos--网络混沌工程
                • 基础原理
                  • 具体过程
                  • IOChaos--IO混沌工程
                    • 基础原理
                      • 具体过程
                        • Chaosblade与ChaosMesh组件简单总结
                        相关产品与服务
                        混沌演练平台
                        混沌演练平台(Chaotic Fault Generator)提供高效便捷、安全可靠的故障演习服务,除可视化故障注入服务外,还提供行业经验模板,监控护栏等核心功能,致力于帮助用户及时发现业务容灾隐患、验证高可用预案的有效性,从而提高系统的可用性和韧性。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档