搭建VECROsim笔记

1. 相关资料:

搭建过程中有一些问题是镜像问题,除了第一次启动minikube需要设置proxy外,拉取完所有镜像后,请stop minikube,然后重新启动:minikube start --image-mirror-country=cn --registry-mirror https://dockerhub.azk8s.cn

2. 部署过程:

部署过程中如果遇到问题,但是一直摸不着头脑,不如minikube dashboard看一下(比如查看镜像名是否正确), 错误信息更加准确有效~

如果想进入minikube虚拟机: minikube ssh

如果想进入pod: kubectl exec -it <pod> -n <namespace> -- /bin/sh

如果觉得minikube给的资源太少:

1
2
3
minikube stop
minikube config set cpus 4
minikube start

2.1 安装minikube和Go:

https://minikube.sigs.k8s.io/docs/start/

1
2
3
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube version
1
2
3
4
wget https://golang.google.cn/dl/go1.19.4.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.19.4.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
go version

2.2 创建集群:

注意,创建集群时,如若需要VPN. 代理的配置请见笔记:Ubuntu下配置代理

minikube会创建一个网卡用于和主机通信,如果使用VPN务必将minikube的网卡IP忽略掉,这个IP地址在部署过程中会给出提示,所以不必担心不知道

minikube start --cpus=8 --memory 8196 --disk-size 32g --docker-env http_proxy=http://192.168.8.2:7890 --docker-env https_proxy=http://192.168.8.2:7890 --docker-env no_proxy=localhost,127.0.0.1,10.96.0.0/12,192.168.59.0/24,192.168.49.0/24,192.168.39.0/24,192.168.49.2 --image-mirror-country=cn

1
2
minikube start --cpus=8 --memory=8196 --disk-size 32g --image-mirror-country=cn
minikube ssh docker pull mongo

2.3 构建镜像:

推荐使用我修改后的仓库:

1
2
3
4
5
6
git clone https://github.com/etigerstudio/vecro-base
cd vecro-base
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o vecro-base .
docker build . -t fanqiliang/vecro-base:v1
# 或者这样,就不用push和改名了
minikube image build -t vecro-base:v1 .

!!!! 注意,请勿使用latest的mongo镜像,必然会失败!经过测试,mongo:4.2可正常运行。

1
2
3
4
5
6
git clone https://github.com/etigerstudio/vecro-mongodb
cd vecro-mongodb
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o vecro-mongodb .
docker build . -t fanqiliangvecro-mongodb:v1
# 或者这样,就不用push和改名了
minikube image build -t vecro-mongodb:v1 .

这里我已经build好并且把镜像上传了,大家要使用的话只需要加个前缀fanqiliang/或者直接使用我fork的仓库。

1
2
3
docker login
docker push fanqiliang/vecro-base:v1
docker push fanqiliang/vecro-mongodb:v1

2.4 部署monitoring infrastructure:

进入VECROsim源码根目录

1
2
cd metrics/setup/ 
sh ./setup.sh

2.5 部署microservice system:

进入VECROsim源码根目录

1
2
3
4
5
6
7
8
cd deploy
kubectl create namespace social
kubectl create configmap mongo-initjs -n social --from-file=mongo-init.js
# Deploy Social system in the cluster
go run . -deffile base/social.yaml
# Install Prometheus monitor for Social system
kubectl create namespace monitoring
kubectl apply -f base/social-monitor.yaml

注意,如果pod镜像拉取失败,如果想要删除pod可以这样,pod会自动重新生成

kubectl delete pods --all -n social

如果想要彻底删除这些pod只需要删除对应namespace即可

kubectl delete namespace social

如果想立即强制kill并删除容器可以这样
kubectl delete pods --all -n social --force --grace-period=0

有时是mongo镜像拉取失败,可以进入虚拟机拉取:

1
minikube ssh docker pull mongo

2.5 施加负载:

1
2
3
4
# Make 'text' service accessible at http://localhost:8080
cd ./load
kubectl port-forward -n social svc/social-text 8080:80 > /dev/null &
go run . -delay 100ms -duration 2h -users 5 -url "http://localhost:8080"

2.6 注入故障:

Inject the a network delay fault (3 minutes 500ms network delay to service posts-storage) to the system.

在注入故障过程中,作者借用了chaos-mesh工具, 这个工具是专门用来模拟微服务中故障注入的。 因此需要先安装chaos-mesh,推荐使用helm安装chaos-mesh: https://chaos-mesh.org/docs/production-installation-using-helm/

注意,如果helm安装chaos-mesh后pod启动失败,极有可能是网络不好。在搭建过程中我就反复失败,但是网络环境好时,就一下成功了。 (注意,特别需要设置好vpn~)

如果是因为拉取镜像失败,可以提前拉取:minikube ssh docker pull ghcr.io/chaos-mesh/chaos-mesh:v2.5.0

可以通过反复卸载安装chaos-mesh来重启:

1
2
helm uninstall chaos-mesh -n chaos-mesh
helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-mesh

或者这样重启:kubectl rollout restart deployment/chaos-controller-manager -n chaos-mesh

1
2
# Inject network delay fault to the deployed system
kubectl apply -f ./inject/social-delay.yaml

2.7 获取数据:

开放端口:

参考:https://blog.marcnuri.com/prometheus-grafana-setup-minikube

2.7.1: Grafana

其实这个没必要.

用户/密码都是admin

1
2
3
kubectl expose service grafana -n simple --type=NodePort --target-port=3000 --name=grafana-np
minikube service grafana-np -n simple
# kubectl delete service grafana-np -n simple

2.7.2: Promethues

1
2
kubectl expose service prometheus-k8s -n simple --type=NodePort --target-port=9090 --name=prometheus-np
minikube service prometheus-np -n simple

然后prometheus就会输出url,访问url就能获取指标了,这也是后面python脚本需要修改的地方:

这里部署了两个prometheus服务,所有有两

NAMESPACENAMETARGET PORTURL
simpleprometheus-npport-1/9090http://192.168.49.2:32165
port-2/8080http://192.168.49.2:32261

⚠️ vecrosim获取的指标都是在vecro-base中自定义的指标,因此需要了解Prometheus通过编程自定义指标的方式。

有一个小问题,minikube虚拟机创建时时区是UTC+0,和主机的时区不同导致时间不一样,因此需要更改系统时区。

1
2
cd metrics/
python3 collect_social.py

有一些参数需要配置:

1
2
3
4
5
6
# url 在暴露端口时minikube service会输出prometheus的ip和端口
prometheus_host_url = "http://127.0.0.1:9091/"
start_time = parse_datetime("2022-05-22 21:00:00")
end_time = parse_datetime("2022-05-22 22:00:00")
step = "60s"
filepath = "social-delay/jitter_high"

搭建VECROsim笔记
https://www.torch-fan.site/2023/01/03/搭建VECROsim笔记/
作者
Torch-Fan
发布于
2023年1月3日
更新于
2023年2月8日
许可协议