本实验将实现使用chaosblade工具对k8s集群下的某pod中的container增加CPU或内存负载,以作为故障测试。

实验环境:

1. 在k8s集群中部署Guestbook application

https://github.com/cloudnativeapp/guestbook?spm=5176.2020520152.0.0.7c5f16ddH8myx6

这里部署v1版本做混沌测试对象。

2.安装chaosblade-operator最新版本,作为实现测试的工具,建议helm安装

GitHub - chaosblade-io/chaosblade-operator: chaosblade operator for kubernetes experiments

3.安装Kubernetes Dashboard。因为本实验是CPU负载测试,需要使用Kubernetes Dashboard来可视化容器中的CPU变化。

Kubernetes Dashboard 文档:dashboard/docs at master · kubernetes/dashboard · GitHub

官网快速安装的步骤:https://github.com/kubernetes/dashboard/blob/master/README.md​​​​​

 可以用kubectl apply -f安装,也可以用helm,建议用helm,这样install,uninstall都容易些。

安装完后,在access dashboard时,需要输入token,此时需要参考creating sample user来获取access token。dashboard/creating-sample-user.md at master · kubernetes/dashboard · GitHub

首先创建service account(如下保存成.yaml并kubectl apply):

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

然后对其进行角色绑定(如下保存成.yaml并kubectl apply):

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

创建完成后获取secret中token的值。

$ kubectl -n kubernetes-dashboard get secret

$ kubectl -n kubernetes-dashboard describe secret admin-user-token-vmkzx

输入token即接入dashboard。

此时的dashboard还并不能看到CPU,memory等指标值,因为还没有安装Metrics Server。

GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.

这里还是建议用helm安装,但是如果已经用

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

来安装了,可能会遇到如下问题:

kubectl top pods

Error from server (ServiceUnavailable): the server is currently unable to handle the request

 解决办法参考:

kubernetes - Metrics server is currently unable to handle the request - Stack Overflow

我采用的是如下方式:

It appears the --kubelet-insecure-tls flag was not configured correctly for the pod template in the deployment. The following should fix this:

  1. Edit the existing deployment in the cluster with kubectl edit deployment/metrics-server -nkube-system. (这里edit默认用vi编辑,可以采用类似:
    $ KUBE_EDITOR="nano" kubectl edit svc/docker-registry
    的方式换成nano编辑)
  2. Add the flag to the spec.containers[].args list, so that the deployment looks like this:
...
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls      <=======ADD IT HERE.
        image: k8s.gcr.io/metrics-server/metrics-server:v0.6.1
...

 若kubectl top pods能正常显示,说明Metrics Server安装好了。

再次进入kubernetes-dashboard,可看到CPU,memory等信息。

开始实验:

参考:ChaosBlade:从零开始的混沌工程(五)_Kubernetes_郭旭东_InfoQ写作社区

 实验中遇到的问题:

1.containerID,这个是在node节点上用docker ps查出来的那个ID,而不是kubectl describe pod里面显示的那个特别长的container ID,docker ps查出来的短一些,是kubectl describe pod输出中Conditions:字段下的那个长ID的前几位。

2.使用yaml文件做混沌实验会报错:Error:cgroups load failed, cgroups: cgroup deleted

目前是使用./blade 命令能成功。

./blade create k8s container-cpu fullload --cpu-percent 100 --container-ids 8be7a3520062 --names redis-slave-86dcb569bf-7jncv --namespace default --kubeconfig $HOME/.kube/config
实验前后可在dashboard中看container的CPU负载变化。

同理,对于memory注入故障,可以用类似的命令:

./blade create k8s container-mem load --mem-percent 80 --mode ram --rate 50 --container-ids 8be7a3520062 --names redis-slave-86dcb569bf-7jncv --namespace default --kubeconfig $HOME/.kube/config

 在实验完成后,一定记得destroy实验:

./blade destroy 581a8dacbbb94e6b

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐