介绍

Chaos mesh 是云原生时代的系统高可用演练平台,基于 Chaos mesh 可以无缝衔接 K8S,精准全面的覆盖问题场景,发现问题,为业务系统高可用保驾护航。

环境准备

  1. 操作系统:Mac 
  2. CPU:intel core i5
  3. 内存:8G 
  4. 硬盘:>50G

部署架构

  1. Virtual Box 建立 3 台虚拟机
  2. 3台虚拟机分别为:master、worker-1、worker-2
  3. master:部署 k8s 主节点(包括 api server、controller manager、scheduler、etcd)
  4. worker-1、worker-2:部署 kubelet、容器引擎(这里使用 containerd)

网络

节点IP
master192.168.33.13
worker-1192.168.33.14
worker-2192.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 

Logo

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

更多推荐