实战K8S集群毁灭性测试

WHAT:生产中总会遇到突然宕机等情况,我们需要来模拟一下

生产上,保证服务都是起两份以上,所有我们给consumer和service都起两份

我们可以看到21和22分别都有两台,这是schedule做的资源分配。接下来,我们模拟一台服务器炸了

# 21机器:
~]# halt

再去demo网址,发现已经进不去了,dashboard已经503了

宿主机爆炸,我们的第一件事情,就是把离线的主机删了(如果不删掉,那么k8s会认为是网络抖动或者什么问题,会不断的重连)

# 22机器,删除离线主机:
~]# kubeclt delete node hdss7-21.host.com
# out: node "hdss7-21.host.com" deleted

删除了后,k8s有自愈机制,会在22节点自己起来

我们在去网址查看(时间可能慢一些,当然你不断刷新的时候可能发现偶尔会有报错,然后又刷新就又好了,下面会讲到)

此时可以看到dashboard已经在起来的状态,我们的配置比较差,所以起来的比较慢。现在看到已经起来了,但是下面还有一个backoff状态pod,应该是负载的问题,也就是引发上面的网址有时候刷新是报错状态,因为nginx的负载

我们去改一下nginx

# 11机器,去到最下面把21节点注释掉:
vi /etc/nginx/nginx.conf
# server.10.4.7.21:6443

# 11机器,traefik的21节点也注释掉:
~]# Vi /etc/ningx/conf.d/od.com.conf
# server 10.4.7.21.81     max_fails=3 fail_timeout=10s;
~]# nginx -s reload

这时候你去刷新网址,已经不会出现偶尔报错的状况了,容器也已经起来了

现在,我们已经完成了服务器(主机)炸了后的应急解决

集群恢复:

# 21机器,重新连接21机器:
~]# supervisorctl status
~]# kubectl get nodes
~]# kubectl label node hdss7-21.host.com node-role.kubernetes.io/master=
# out: node/hdss7-21.host.comt labeled
~]# kubectl label node hdss7-21.host.com node-role.kubernetes.io/node=
# out: node/hdss7-21.host.com labeled

所有已经起来了,我们在把负载的注释改回来

# 11机器,修改负载:
~]# vi /etc/nginx/nginx.conf
server.10.4.7.21:6443
~]# vi /etc/ningx/conf.d/od.com.conf
server 10.4.7.21.81     max_fails=3 fail_timeout=10s;
nginx -s reload

这时候我们看一下dubbo服务都起在哪里

# 21机器:
~]# kubectl get pods -n app -o wide

可以看到都是在22机器上运行,我们有计划的做一下调度(资源平衡)

# 删掉一个consumer和一个service,21机器:
~]# kubectl delete pods dubbo-demo-consumer-5874d7c89d-8dmk4 -n app
~]# kubectl delete pods dubbo-demo-service-7754d5cb8b-78bhf -n app

# 21机器,可以看到21机器和22机器都分别是两个了:
~]# kubectl get pods -n app -o wide

此时我们去dashboard看一下,发现不可用

# 21机器,把dashboard删掉让k8S重新调度:
~]# kubectl get pods -n kube-system
~]# kubectl delete pods kubernetes-dashboard-76dcdb4677-kv8mq -n kube-system

成功,是不是比较简单,这就是分布式的能力

# 21机器,查看一下iptables规则有没有问题
zookeeper]# iptables-save |grep -i postrouting
# 把有问题的规则删了
zookeeper]# iptables -t nat -D POSTROUTING -s 172.7.21.0/24 ! -o docker0 -j MASQUERADE
# 修改规则并启动
zookeeper]# iptables -t nat -I POSTROUTING -s 172.7.21.0/24 ! -d 172.7.0.0/16 ! -o docker0 -j MASQUERADE
zookeeper]# iptables-save |grep -i postrouting