您知道您的系统将如何响应任意故障吗?您的应用程序会失败吗?在损失之后,会有任何东西幸存下来吗?如果您不确定,那么现在是时候看看您的系统是否通过了 Litmus 测试,这是一种详细的方法,可以通过许多实验随机制造混乱。
在本系列的第一篇文章中,我解释了什么是混沌工程,在第二篇文章中,我演示了如何获得您的系统的稳态,以便您可以将其与混沌状态进行比较。第三篇文章将向您展示如何安装和使用 Litmus 来测试 Kubernetes 集群中的任意故障和实验。在本演练中,我将使用 Pop!_OS 20.04、Helm 3、Minikube 1.14.2 和 Kubernetes 1.19。
配置 Minikube
如果您尚未安装,请以适合您环境的方式安装 Minikube。如果您有足够的资源,我建议给您的虚拟机比默认内存和 CPU 功率稍多的资源
$ minikube config set memory 8192
❗ These changes will take effect upon a minikube delete and then a minikube start
$ minikube config set cpus 6
❗ These changes will take effect upon a minikube delete and then a minikube start
然后启动并检查您的系统状态
$ minikube start
? minikube v1.14.2 on Debian bullseye/sid
? minikube 1.19.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.19.0
? To disable this notice, run: 'minikube config set WantUpdateNotification false'
✨ Using the docker driver based on user configuration
? Starting control plane node minikube in cluster minikube
? Creating docker container (CPUs=6, Memory=8192MB) ...
? Preparing Kubernetes v1.19.0 on Docker 19.03.8 ...
? Verifying Kubernetes components...
? Enabled addons: storage-provisioner, default-storageclass
? Done! kubectl is now configured to use "minikube" by default
jess@Athena:~$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
安装 Litmus
正如 Litmus 的主页上概述的那样,安装 Litmus 的步骤是:将您的仓库添加到 Helm,创建您的 Litmus 命名空间,然后安装您的图表
$ helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
"litmuschaos" has been added to your repositories
$ kubectl create ns litmus
namespace/litmus created
$ helm install chaos litmuschaos/litmus --namespace=litmus
NAME: chaos
LAST DEPLOYED: Sun May 9 17:05:36 2021
NAMESPACE: litmus
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
验证安装
如果您想验证所有需要的组件都已正确安装,则可以运行以下命令。
检查用于 chaos 的 api-resources 是否可用:
root@demo:~# kubectl api-resources | grep litmus
chaosengines litmuschaos.io true ChaosEngine
chaosexperiments litmuschaos.io true ChaosExperiment
chaosresults litmuschaos.io true ChaosResult
检查 Litmus chaos operator 部署是否成功运行
root@demo:~# kubectl get pods -n litmus
NAME READY STATUS RESTARTS AGE
litmus-7d998b6568-nnlcd 1/1 Running 0 106s
开始运行 chaos 实验
有了这些,您就可以开始了!请参阅 Litmus 的 chaos 实验文档 以开始执行您的第一个实验。
要确认您的安装工作正常,请检查 pod 是否已启动并正确运行
jess@Athena:~$ kubectl get pods -n litmus
NAME READY STATUS RESTARTS AGE
litmus-7d6f994d88-2g7wn 1/1 Running 0 115s
确认自定义资源定义 (CRD) 也已正确安装
jess@Athena:~$ kubectl get crds | grep chaos
chaosengines.litmuschaos.io 2021-05-09T21:05:33Z
chaosexperiments.litmuschaos.io 2021-05-09T21:05:33Z
chaosresults.litmuschaos.io 2021-05-09T21:05:33Z
最后,确认您的 API 资源也已安装
jess@Athena:~$ kubectl api-resources | grep chaos
chaosengines litmuschaos.io true ChaosEngine
chaosexperiments litmuschaos.io true ChaosExperiment
chaosresults litmuschaos.io true ChaosResult
这就是我所说的简单安装和确认。下一步是为 chaos 设置部署。
为破坏做准备
要测试 chaos,您需要一些东西来测试。添加一个新的命名空间
$ kubectl create namespace more-apps
namespace/more-apps created
然后将部署添加到新的命名空间
$ kubectl create deployment ghost --namespace more-apps --image=ghost:3.11.0-alpine
deployment.apps/ghost created
最后,扩展您的部署,以便您在部署中有多个 pod 可用于测试
$ kubectl scale deployment/ghost --namespace more-apps --replicas=4
deployment.apps/ghost scaled
为了让 Litmus 引起 chaos,您需要在您的部署中添加一个注解,以将其标记为已准备好进行 chaos。目前,注解可用于部署、StatefulSets 和 DaemonSets。将注解 chaos=true
添加到您的部署
$ kubectl annotate deploy/ghost litmuschaos.io/chaos="true" -n more-apps
deployment.apps/ghost annotated
确保您将安装的实验具有在“more-apps”命名空间中工作的正确权限。
为 prepper 绑定和权限创建一个新的 rbac.yaml 文件
$ touch rbac.yaml
然后通过复制并粘贴下面的代码到您的 rbac.yaml 文件中来添加通用测试的权限。这些只是基本的、最小的权限,用于杀死您的命名空间中的 pod,并授予 Litmus 权限来删除您提供的命名空间的 pod
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-delete-sa
namespace: more-apps
labels:
name: pod-delete-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-delete-sa
namespace: more-apps
labels:
name: pod-delete-sa
rules:
- apiGroups: [""]
resources: ["pods","events"]
verbs: ["create","list","get","patch","update","delete","deletecollection"]
- apiGroups: [""]
resources: ["pods/exec","pods/log","replicationcontrollers"]
verbs: ["create","list","get"]
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create","list","get","delete","deletecollection"]
- apiGroups: ["apps"]
resources: ["deployments","statefulsets","daemonsets","replicasets"]
verbs: ["list","get"]
- apiGroups: ["apps.openshift.io"]
resources: ["deploymentconfigs"]
verbs: ["list","get"]
- apiGroups: ["argoproj.io"]
resources: ["rollouts"]
verbs: ["list","get"]
- apiGroups: ["litmuschaos.io"]
resources: ["chaosengines","chaosexperiments","chaosresults"]
verbs: ["create","list","get","patch","update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-delete-sa
namespace: more-apps
labels:
name: pod-delete-sa
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pod-delete-sa
subjects:
- kind: ServiceAccount
name: pod-delete-sa
namespace: more-apps
应用 rbac.yaml 文件
$ kubectl apply -f rbac.yaml
serviceaccount/pod-delete-sa created
role.rbac.authorization.k8s.io/pod-delete-sa created
rolebinding.rbac.authorization.k8s.io/pod-delete-sa created
下一步是准备您的 chaos 引擎来删除 pod。chaos 引擎将通过创建一个 chaosengine.yaml 文件并将以下信息复制到 .yaml 文件中,将您需要的实验连接到您的应用程序实例。这将您的实验连接到您的命名空间和具有您上面创建的角色绑定的服务帐户。
此 chaos 引擎文件仅指定在 chaos 测试期间要删除的 pod
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: moreapps-chaos
namespace: more-apps
spec:
appinfo:
appns: 'more-apps'
applabel: 'app=ghost'
appkind: 'deployment'
# It can be true/false
annotationCheck: 'true'
# It can be active/stop
engineState: 'active'
#ex. values: ns1:name=percona,ns2:run=more-apps
auxiliaryAppInfo: ''
chaosServiceAccount: pod-delete-sa
# It can be delete/retain
jobCleanUpPolicy: 'delete'
experiments:
- name: pod-delete
spec:
components:
env:
# set chaos duration (in sec) as desired
- name: TOTAL_CHAOS_DURATION
value: '30'
# set chaos interval (in sec) as desired
- name: CHAOS_INTERVAL
value: '10'
# pod failures without '--force' & default terminationGracePeriodSeconds
- name: FORCE
value: 'false'
在您在下一节中安装实验之前,请勿应用此文件。
为引起 chaos 添加新实验
现在您有了一个全新的环境,其中包含部署、角色和 chaos 引擎来测试,您需要一些实验来运行。由于 Litmus 拥有庞大的社区,您可以在 Chaos Hub 中找到一些很棒的实验。
在本演练中,我将使用杀死 pod的通用实验。
运行 kubectl 命令以将通用实验安装到您的集群中。将其安装在您的 more-apps
命名空间中;当您运行时,您将看到创建的测试
$ kubectl apply -f https://hub.litmuschaos.io/api/chaos/1.13.3?file=charts/generic/experiments.yaml -n more-apps
chaosexperiment.litmuschaos.io/pod-network-duplication created
chaosexperiment.litmuschaos.io/node-cpu-hog created
chaosexperiment.litmuschaos.io/node-drain created
chaosexperiment.litmuschaos.io/docker-service-kill created
chaosexperiment.litmuschaos.io/node-taint created
chaosexperiment.litmuschaos.io/pod-autoscaler created
chaosexperiment.litmuschaos.io/pod-network-loss created
chaosexperiment.litmuschaos.io/node-memory-hog created
chaosexperiment.litmuschaos.io/disk-loss created
chaosexperiment.litmuschaos.io/pod-io-stress created
chaosexperiment.litmuschaos.io/pod-network-corruption created
chaosexperiment.litmuschaos.io/container-kill created
chaosexperiment.litmuschaos.io/node-restart created
chaosexperiment.litmuschaos.io/node-io-stress created
chaosexperiment.litmuschaos.io/disk-fill created
chaosexperiment.litmuschaos.io/pod-cpu-hog created
chaosexperiment.litmuschaos.io/pod-network-latency created
chaosexperiment.litmuschaos.io/kubelet-service-kill created
chaosexperiment.litmuschaos.io/k8-pod-delete created
chaosexperiment.litmuschaos.io/pod-delete created
chaosexperiment.litmuschaos.io/node-poweroff created
chaosexperiment.litmuschaos.io/k8-service-kill created
chaosexperiment.litmuschaos.io/pod-memory-hog created
验证实验是否正确安装
$ kubectl get chaosexperiments -n more-apps
NAME AGE
container-kill 72s
disk-fill 72s
disk-loss 72s
docker-service-kill 72s
k8-pod-delete 72s
k8-service-kill 72s
kubelet-service-kill 72s
node-cpu-hog 72s
node-drain 72s
node-io-stress 72s
node-memory-hog 72s
node-poweroff 72s
node-restart 72s
node-taint 72s
pod-autoscaler 72s
pod-cpu-hog 72s
pod-delete 72s
pod-io-stress 72s
pod-memory-hog 72s
pod-network-corruption 72s
pod-network-duplication 72s
pod-network-latency 72s
pod-network-loss 72s
运行实验
现在一切都已安装和配置,使用您的 chaosengine.yaml 文件来运行您定义的 pod-deletion 实验。应用您的 chaos 引擎文件
$ kubectl apply -f chaosengine.yaml
chaosengine.litmuschaos.io/more-apps-chaos created
通过获取您的命名空间中的所有 pod 来确认引擎已启动;您应该看到正在创建 pod-delete
$ kubectl get pods -n more-apps
NAME READY STATUS RESTARTS AGE
ghost-5bdd4cdcc4-blmtl 1/1 Running 0 53m
ghost-5bdd4cdcc4-z2lnt 1/1 Running 0 53m
ghost-5bdd4cdcc4-zlcc9 1/1 Running 0 53m
ghost-5bdd4cdcc4-zrs8f 1/1 Running 0 53m
moreapps-chaos-runner 1/1 Running 0 17s
pod-delete-e443qx-lxzfx 0/1 ContainerCreating 0 7s
接下来,您需要能够使用 Litmus 观察您的实验。以下命令使用 ChaosResult CRD 并提供大量输出
$ kubectl describe chaosresult moreapps-chaos-pod-delete -n more-apps
Name: moreapps-chaos-pod-delete
Namespace: more-apps
Labels: app.kubernetes.io/component=experiment-job
app.kubernetes.io/part-of=litmus
app.kubernetes.io/version=1.13.3
chaosUID=a6c9ab7e-ff07-4703-abe4-43e03b77bd72
controller-uid=601b7330-c6f3-4d9b-90cb-2c761ac0567a
job-name=pod-delete-e443qx
name=moreapps-chaos-pod-delete
Annotations: <none>
API Version: litmuschaos.io/v1alpha1
Kind: ChaosResult
Metadata:
Creation Timestamp: 2021-05-09T22:06:19Z
Generation: 2
Managed Fields:
API Version: litmuschaos.io/v1alpha1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:labels:
.:
f:app.kubernetes.io/component:
f:app.kubernetes.io/part-of:
f:app.kubernetes.io/version:
f:chaosUID:
f:controller-uid:
f:job-name:
f:name:
f:spec:
.:
f:engine:
f:experiment:
f:status:
.:
f:experimentStatus:
f:history:
Manager: experiments
Operation: Update
Time: 2021-05-09T22:06:53Z
Resource Version: 8406
Self Link: /apis/litmuschaos.io/v1alpha1/namespaces/more-apps/chaosresults/moreapps-chaos-pod-delete
UID: 08b7e3da-d603-49c7-bac4-3b54eb30aff8
Spec:
Engine: moreapps-chaos
Experiment: pod-delete
Status:
Experiment Status:
Fail Step: N/A
Phase: Completed
Probe Success Percentage: 100
Verdict: Pass
History:
Failed Runs: 0
Passed Runs: 1
Stopped Runs: 0
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pass 104s pod-delete-e443qx-lxzfx experiment: pod-delete, Result: Pass
当您运行 chaos 引擎定义时,您可以看到来自测试的通过或失败输出。
祝贺您完成第一次(并且希望不是最后一次)chaos 工程测试!现在您有了一个强大的工具可以使用,并帮助您的环境成长。
最后的想法
您可能会想,“我不能每次想运行 chaos 时都手动运行它。我可以把它带到多远,以及如何为长期设置它?”
Litmus 最好的部分(除了 Chaos Hub)是它的调度器功能。您可以使用它来定义时间和日期、重复或零星地运行实验。对于已经使用 Kubernetes 一段时间并准备好创建一些 chaos 的细致管理员来说,这是一个很棒的工具。我建议及时了解 Litmus 以及如何使用此工具进行常规 chaos 工程。祝您 pod 狩猎愉快!
评论已关闭。