前置
- CRD: Custom Resource Definition, 用户自定义资源类型。 详细: www.jianshu.com/p/f68b04026…
背景
不知道为什么不过审
这是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 等具有系统权限。
目前实现的 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
混沌测试
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.orgCRD 的 PodChaos对象
官网有丰富的demo可参考 chaos-mesh.org/zh/docs/sim…
执行我们设置好的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
现在,让我们在终端上使用 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上添加实验执行:
PodFail
mysql集群搭建:kubernetes.io/zh-cn/docs/…