Chaos Mesh 实践
介绍Chaos mesh 是云原生时代的系统高可用演练平台,基于 Chaos mesh 可以无缝衔接 K8S,精准全面的覆盖问题场景,发现问题,为业务系统高可用保驾护航。环境准备操作系统:MacCPU:intel core i5内存:8G硬盘:>50G部署架构Virtual Box 建立 3 台虚拟机3台虚拟机分别为:master、worker-1、worker-2master:部署 k8s
介绍
Chaos mesh 是云原生时代的系统高可用演练平台,基于 Chaos mesh 可以无缝衔接 K8S,精准全面的覆盖问题场景,发现问题,为业务系统高可用保驾护航。
环境准备
- 操作系统:Mac
- CPU:intel core i5
- 内存:8G
- 硬盘:>50G
部署架构
- Virtual Box 建立 3 台虚拟机
- 3台虚拟机分别为:master、worker-1、worker-2
- master:部署 k8s 主节点(包括 api server、controller manager、scheduler、etcd)
- worker-1、worker-2:部署 kubelet、容器引擎(这里使用 containerd)
网络
节点 | IP |
master | 192.168.33.13 |
worker-1 | 192.168.33.14 |
worker-2 | 192.168.33.15 |
虚拟机部署
为了方便部署,使用 Vagrant 虚拟机编排软件,可以提供配置集中化的部署能力
下载 Vagrant
https://www.gagrantup.com/downloads
启动部署
git clone https://github.com/mbaykara/k8s-cluster.git
vagrant up
使用 vagrant 登陆虚拟机
set VAGRANT_PREFER_SYSTEM_BIN=0
vagrant ssh master
容器编排
启动 k8s master
kubeadm init --apiserver-advertise-address 192.168.33.13 --pod-network-cidr=10.244.0.0/16
执行最后会返回 join master 命令,记录一下,稍后会在客户端加入 k8s 时会用到
kubectl 权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
验证 master node 是否启动
kubectl get nodes
安装网络插件 flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
获取 component status
kubectl get cs
controller-manager 和 scheduler unhealthy 是正常的
修改 kube-scheduler 和 kube-controller-manager 配置,重启服务
$ sudo vim /etc/kubernetes/manifests/kube-scheduler.yaml
Clear the line (spec->containers->command) containing this phrase: -- port=0
$ sudo vim /etc/kubernetes/manifests/kube-controller-manager.yaml
Clear the line (spec->containers->command) containing this phrase: --- port=0
$ sudo systemctl restart kubelet.service
重启服务后,再次获取 component status 状态正常
worker 节点加入 kubernetes
登陆 worker-1,执行之前保存的 join 命令
vagrant ssh worker-1
kubeadm join 192.168.33.13:6443 --token bx86lo.agyszwr53ow5y53u \
--discovery-token-ca-cert-hash sha256:536b10417f411de9ff9f11cb83d286f9217f5031845df93355b3a6a5ed96c066
worker-2 也是类似的操作
在 Pod 上创建 Nginx 实例
回到 master 节点,创建 5 个 Nginx
kubectl create deployment webserver --image=nginx --port 80 --replicas=5
暴露服务
kubectl expose deployment webserver --port 80 --type=NodePort
获取 service 端口 30868
kubectl get services
验证并访问,在宿主机上访问 http://192.168.33.14:30868
Chaos mesh
安装 Chaos mesh
安装地址:https://helm.sh/docs/intro/install/
添加 chaos-mesh repo
helm repo add chaos-mesh https://charts.chaos-mesh.org
创建独立的实验所使用的 namespace
kubectl create ns chaos-testing
安装 chaos-mesh (containerd容器)
helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-testing --set chaosDaemon.runtime=containerd --set chaosDaemon.socketPath=/run/containerd/containerd.sock
验证安装
kubectl get po -n chaos-testing
chaos-controller-manager、chaos-daemon、chaos-dashboard 状态为 running
Chaos 实验
实验内容
停止 webserver 服务 120s
创建实验
获取 webserver pod 名称
kubectl get pods
根据 pod 名称获取 pod Label 信息
kubectl describe pods webserver-5cc69bf9c4-766fx
新建演练配置文件 chaos_pod.yaml
cat <<EOF > chaos_pod.yaml
kind: PodChaos
metadata:
name: pod-failure
namespace: chaos-testing
spec:
action: pod-failure
mode: all
duration: '120s'
selector:
labelSelectors:
app: webserver
pod-template-hash: 5cc69bf9c4
EOF
启动实验
kubectl apply -f chaos_pod.yaml
观察实验
通过 describe 观察实验情况
kubectl describe PodChaos pod-failure
如果出现 Experiment has started 说明实验已经启动
此时访问 http://192.168.33.14:30868 可以看到已经访问不通
等待 120s 后,再次访问,可以看到已经恢复
再通过 describe 命令查看实验状态,会看到 Finalizer has been inited 说明任务已经结束
其他问题
启动实验发现没有反应
一般是实验 apply 失败,可以通过 describe 命令确定是否任务失败,如果失败可以执行以下命令强制关闭实验
kubectl annotate PodChaos pod-failure chaos-mesh.chaos-mesh.org/cleanFinalizer=forced
如果没有失败,正常删除实验命令如下
kubectl delete PodChaos pod-failure
后续
通过自建 k8s + chaos mesh 建立独立演练平台
引用
https://medium.com/swlh/setup-own-kubernetes-cluster-via-virtualbox-99a82605bfcc
更多推荐
所有评论(0)