本实验将实现使用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变化。
官网快速安装的步骤: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:
kubectl edit deployment/metrics-server -nkube-system
. (这里edit默认用vi编辑,可以采用类似: $ KUBE_EDITOR="nano" kubectl edit svc/docker-registry
的方式换成nano编辑)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