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

2023-10-10 15:12:08 浏览数 (1)

背景

上篇文章,总体上分析了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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞