在终端中测试 Kubernetes 集群故障和实验

Litmus 是一个有效的工具,用于制造混乱,以测试您的系统将如何响应故障。
54 位读者喜欢这个。
Science lab with beakers

您知道您的系统将如何响应任意故障吗?您的应用程序会失败吗?在损失之后,会有任何东西幸存下来吗?如果您不确定,那么现在是时候看看您的系统是否通过了 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 狩猎愉快!

接下来阅读什么
User profile image.
科技游民,从事我能找到的任何工作。IT 领域 silo 预防的倡导者,与所有团队共享信息的重要性。相信教育所有人并开源开发。热爱所有科技事物。关于 K8s、chaos 以及我能找到的任何新的和闪亮的东西!Mastodon ID

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.