混沌系统(ChaoMesh

611 阅读5分钟

前置

背景

 不知道为什么不过审
 这是IT博文

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

大规模分布式软件系统的发展正在改变软件工程,作为一个行业,我们很快采用了提高开发灵活性和部署速度的实践。紧随着这些优点的一个迫切问题是:我们对投入生产的复杂系统有多少信心?

即使分布式系统中的所有单个服务都正常运行, 这些服务之间的交互也会导致不可预知的结果。这些不可预知的结果, 由影响生产环境的罕见且破坏性的事件复合而成,令这些分布式系统存在内在的混沌。

我们需要在异常行为出现之前,在整个系统内找出这些弱点。这些弱点包括以下形式:

  • 当服务不可用时的不正确回滚设置;
  • 不当的超时设置导致的重试风暴;
  • 由于下游依赖的流量过载导致的服务中断;
  • 单点故障时的级联失败等。

我们必须主动的发现这些重要的弱点,在这些弱点通过生产环境暴露给我们的用户之前。我们需要一种方法来管理这些系统固有的混沌, 通过增加的灵活性和速率以提升我们对生产环境部署的信心, 尽管系统的复杂性是由这些部署所导致的。

我们采用基于经验和系统的方法解决了分布式系统在规模增长时引发的问题,并以此建立对系统抵御这些事件的能力和信心,通过在受控实验中观察分布式系统的行为来了解它的特性,我们称之为混沌工程。

什么是 Chos Mesh?

Chaos Mesh®是云原生计算基金会(CNCF)托管的项目。

“Chaos Mesh 是一个云原生混沌工程平台,提供了在 Kubernetes 平台上进行混沌测试的能力。 ”

Chaos Mesh 是一个通用的混沌工程解决方案,它的特点是对Kubernetes 上的复杂系统进行全方位的故障注入方法,涵盖了 Pod、网络、文件系统甚至内核的故障。Chaos Mesh 主要包括下面两个组件:

  • Chaos Operator:混沌编排的核心组件。
  • Chaos Dashboard:用于管理、设计、监控混沌实验的 Web UI。

Chaos Mesh 使用 CRD 来定义混沌对象。Chaos Mesh 的整体架构非常简单,组件部署在 Kubernetes 之上,我们可以使用 YAML 文件或者使用 Chaos mesh Dashboard 上的 Form 来指定场景。其中会有一个 Chaos Daemon,以 Daemonset 的形式运行,对特定节点的网络、Cgroup 等具有系统权限。

img

目前实现的 CRD 对象支持6种类型的故障注入,分别是 PodChaos、NetworkChaos、IOChaos、TimeChaos、StressChaos 和 KernelChaos,对应的主要动作如下所示:

  • pod-kill:模拟 Kubernetes Pod 被 kill。
  • pod-failure:模拟 Kubernetes Pod 持续不可用,可以用来模拟节点宕机不可用场景。
  • network-delay:模拟网络延迟。
  • network-loss:模拟网络丢包。
  • network-duplication: 模拟网络包重复。
  • network-corrupt: 模拟网络包损坏。
  • network-partition:模拟网络分区。
  • I/O delay : 模拟文件系统 I/O 延迟。
  • I/O errno:模拟文件系统 I/O 错误 。

安装

  # 验证环境
  { clear && \
    echo -e "\n=== Kubernetes Status ===\n" && \
    kubectl get --raw '/healthz?verbose' && \
    kubectl version --short && \
    kubectl get nodes && \
    kubectl cluster-info; 
  } | grep -z 'Ready| ok|passed|running'
  
  +]ping ok
  [+]log ok
  [+]etcd ok
  [+]poststarthook/start-kube-apiserver-admission-initializer ok
  [+]poststarthook/generic-apiserver-start-informers ok
  [+]poststarthook/start-apiextensions-informers ok
  [+]poststarthook/start-apiextensions-controllers ok
  [+]poststarthook/crd-informer-synced ok
  [+]poststarthook/bootstrap-controller ok
  [+]poststarthook/rbac/bootstrap-roles ok
  [+]poststarthook/scheduling/bootstrap-system-priority-classes ok
  [+]poststarthook/start-cluster-authentication-info-controller ok
  [+]poststarthook/start-kube-aggregator-informers ok
  [+]poststarthook/apiservice-registration-controller ok
  [+]poststarthook/apiservice-status-available-controller ok
  [+]poststarthook/kube-apiserver-autoregistration ok
  [+]autoregister-completion ok
  [+]poststarthook/apiservice-openapi-controller ok
  healthz check passed
  Client Version: v1.18.0
  Server Version: v1.18.0
  NAME           STATUS   ROLES    AGE   VERSION
  controlplane   Ready    master   11m   v1.18.0
  node01         Ready    <none>   11m   v1.18.0
  Kubernetes master is running at https://10.0.0.31:6443
  KubeDNS is running at https://10.0.0.31:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
  
  To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  
  
  [devshen@VM-0-9-centos ~]$ sudo curl -sSL https://mirrors.chaos-mesh.org/v2.0.2/install.sh | bash
  Install Chaos Mesh chaos-mesh
  ......
  chaos-daemon-rqpnn   0/1   ContainerCreating   0     2m22s
  Waiting for pod running
  Chaos Mesh chaos-mesh is installed successfully
  
  # 验证组件是否在 Kubernetes Cluster 上运行成功
  # 我们可以看到有3个组件处于运行状态,controller、dashboard 以及作为 Daemonset 的运行混沌 daemon 进程。
  [devshen@VM-0-9-centos ~]$ kubectl get pods -n chaos-testing
  NAME                                        READY   STATUS    RESTARTS   AGE
  chaos-controller-manager-84666554fb-8sldd   1/1     Running   0          9m24s
  chaos-daemon-rqpnn                          1/1     Running   0          9m24s
  chaos-dashboard-5857c588b5-8d6mq            1/1     Running   0          9m24s
  
  # 接着检查下 CRD 是否在集群上创建成功。
  # 这些 CRD 就代表了上面详细提到的各种故障注入的使用对象。
  [devshen@VM-0-9-centos ~]$ kubectl get crds
  NAME                             CREATED AT
  awschaos.chaos-mesh.org          2022-06-27T15:27:31Z
  dnschaos.chaos-mesh.org          2022-06-27T15:27:31Z
  gcpchaos.chaos-mesh.org          2022-06-27T15:27:31Z
  httpchaos.chaos-mesh.org         2022-06-27T15:27:31Z
  iochaos.chaos-mesh.org           2022-06-27T15:27:31Z
  jvmchaos.chaos-mesh.org          2022-06-27T15:27:31Z
  kernelchaos.chaos-mesh.org       2022-06-27T15:27:31Z
  networkchaos.chaos-mesh.org      2022-06-27T15:27:31Z
  podchaos.chaos-mesh.org          2022-06-27T15:27:31Z
  podhttpchaos.chaos-mesh.org      2022-06-27T15:27:31Z
  podiochaos.chaos-mesh.org        2022-06-27T15:27:31Z
  podnetworkchaos.chaos-mesh.org   2022-06-27T15:27:31Z
  schedules.chaos-mesh.org         2022-06-27T15:27:32Z
  stresschaos.chaos-mesh.org       2022-06-27T15:27:32Z
  timechaos.chaos-mesh.org         2022-06-27T15:27:32Z
  workflownodes.chaos-mesh.org     2022-06-27T15:27:33Z
  workflows.chaos-mesh.org         2022-06-27T15:27:33Z
  
  
  

Dashboard

  # 使用 kube-proxy,或者你可以直接在Loadbalancer 上暴露它。
  # 显示获取 Chaos mesh Dashbaord 上的[容器](https://cloud.tencent.com/product/tke?from=10680)端口。
  [devshen@VM-0-9-centos ~]$ kubectl get deploy chaos-dashboard -n chaos-testing -o=jsonpath="{.spec.template.spec.containers[0].ports[0].containerPort}{'\n'}"
  2333
  
  # 输出显示 Dashboard 正在监听的端口。
  # 然后紧接着我们把本地端口转发到 Pod 上的端口,我们可以从上面得到 pod 名称得到 pod 输出。
  [devshen@VM-0-9-centos ~]$ kubectl port-forward -n chaos-testing chaos-dashboard-5857c588b5-8d6mq 8002:2333 --address=0.0.0.0
  Forwarding from 0.0.0.0:8002 -> 2333
  

打开 http://162.14.75.136:8002 仪表盘 可以设置为中文, Great

image-20220628001405648.png

混沌测试

PodKill

这里我们定义一个测试场景,在这个场景中,我们将为一个命名空间中的 Pod 配置 Chaos,它将被安排每1分钟杀死一个 Pod。本例中 App 没有标签选择器,所以在多副本部署的情况下,它可以杀死任何 Pod。我们可以在配置中拥有不同的作用域。

创建 pod-namespace-selector.yml YAML 资源清单文件

  apiVersion: v1
  kind: Namespace
  metadata:
    name: appns
  
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    labels:
      app: nginx
    name: nginx
    namespace: appns
  spec:
    replicas: 3
    selector:
      matchLabels:
        app: nginx
    template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - image: nginx
          name: nginx
  
  ---
  apiVersion: chaos-mesh.org/v1alpha1
  kind: PodChaos
  metadata:
    name: pod-kill-example
    namespace: chaos-testing
  spec:
    action: pod-kill
    mode: one
    selector:
      namespaces:
        - appns
    scheduler:
      cron: "@every 1m"

然后使用 Kubectl 应用命名空间选择器定义的文件,这将创建3个资源对象。

  • 命名空间的名称为 appns
  • 使用 nginx 镜像部署3个副本
  • 使用 podchaos.chaos-mesh.org CRD 的 PodChaos对象

官网有丰富的demo可参考 chaos-mesh.org/zh/docs/sim…

image-20220628233823341.png

执行我们设置好的yml

  [devshen@VM-0-9-centos ~]$ kubectl apply -f pod-namespace-selector.yml
  namespace/appns created
  deployment.apps/nginx created
  error: error validating "pod-namespace-selector.yml": error validating data: ValidationError(PodChaos.spec): unknown field "scheduler" in org.chaos-mesh.v1alpha1.PodChaos.spec; if you choose to ignore these errors, turn validation off with --validate=false
  [devshen@VM-0-9-centos ~]$ kubectl apply -f pod-namespace-selector.yml --validate=false
  namespace/appns unchanged
  deployment.apps/nginx unchanged
  podchaos.chaos-mesh.org/pod-kill-example created
  

image-20220628231607730.png

image-20220628231752550.png

现在,让我们在终端上使用 kubectl 来验证 pod 故障:

  • 执行后
  [devshen@VM-0-9-centos pod-chaos]$ kubectl get pods -n appns -w
  NAME                     READY   STATUS              RESTARTS   AGE
  nginx-6799fc88d8-fskkd   0/1     ContainerCreating   0          23m
  nginx-6799fc88d8-pj77h   0/1     ContainerCreating   0          22m
  nginx-6799fc88d8-tfh68   0/1     ImagePullBackOff    0          23m
  • 中间状态
  nginx-86c57db685-mf2m9   1/1     Terminating   0          6m
  nginx-86c57db685-26cs9   0/1     Pending       0          0s
  nginx-86c57db685-26cs9   0/1     Pending       0          0s
  nginx-86c57db685-mf2m9   1/1     Terminating   0          6m
  nginx-86c57db685-26cs9   0/1     ContainerCreating   0          0s
  nginx-86c57db685-26cs9   1/1     Running             0          4s

我们可以清楚地看到,nginx-86c57db685-mf2m9 正在被终止,nginx-86c57db685-26cs9 正在被创建。

  • 最终状态
  [devshen@VM-0-9-centos pod-chaos]$ kubectl get pods -n appns -w
  NAME                     READY   STATUS    RESTARTS   AGE
  nginx-6799fc88d8-fskkd   1/1     Running   0          28m
  nginx-6799fc88d8-pj77h   1/1     Running   0          27m
  nginx-6799fc88d8-tfh68   1/1     Running   0          28m
  

其实以上实验还可通过dashboard上添加实验执行:

image-20220628233214035.png

PodFail

mysql集群搭建:kubernetes.io/zh-cn/docs/…

console.cloud.tencent.com/lighthouse/…

cloud.tencent.com/developer/a…