搭建本地开发环境
本地编译 Chaos-mesh
当必要的工具都准备完毕后,并且将 ChaosMesh 仓库 fork 并 clone 到本地后。我们可以开始尝试本地编译 ChaosMesh 并打成 docker 镜像,最后部署在 kind Kubernetes 集群后运行。
为了编译整个 chaos-mesh 项目,可以通过在根目录执行
make build
。
在这里我们只选择 chaos-mesh manager 组件进行编译并打镜像。通过在 chaos-mesh 项目根目录下执行如下命令,最终会在 ./bin
下编译出 chaos-controller-manager
make manager
$ make manager
GO15VENDOREXPERIMENT="1" CGO_ENABLED=0 GOOS="" GOARCH="" go get sigs.k8s.io/controller-tools/cmd/controller-gen
/Users/yisa/Downloads/Github/GoProject/bin/controller-gen
............. 以下省略
本地构建 Chaos-mesh 镜像
Chaos-mesh 的镜像构建需要两步,第一步构建出构建目标组件所需要的目标镜像环境。通过在 chaosmesh 项目根目录下执行
docker build -t pingcap/binary .
注意: 由于在构建 binary 镜像过程中会拉取 k8s.io 等依赖,在网络环境较为困难的情况下可以通过修改 ./Dockerfile
, 增加如下语句即可有效缓解:
ENV GOPROXY "https://goproxy.cn"
当上述语句执行完毕以后,我们可以通过 docker images 命令来查看是否 build 成功。
$ docker images | grep pingcap/binary
pingcap/binary latest f8915ee8d257 42 seconds ago 2.06GB
当 pingcap/binary 构建成功以后,我们终于可以给 manager 组件开始构建镜像。在这里我们通过手动给 Chaos-mesh manager 构建镜像的方式:
docker build -t localhost:5000/pingcap/chaos-mesh images/chaos-mesh
$ docker build -t localhost:5000/pingcap/chaos-mesh images/chaos-mesh
Sending build context to Docker daemon 37.32MB
Step 1/5 : FROM alpine:3.10
---> af341ccd2df8
Step 2/5 : ARG HTTPS_PROXY
---> Using cache
---> 20d2cb2306ee
Step 3/5 : ARG HTTP_PROXY
---> Using cache
---> 919a7089085f
Step 4/5 : RUN apk add tzdata --no-cache
---> Using cache
---> ff324fe7103e
Step 5/5 : COPY --from=pingcap/binary /src/bin/chaos-controller-manager /usr/local/bin/chaos-controller-manager
---> 53e0aca7dc92
Successfully built 53e0aca7dc92
Successfully tagged localhost:5000/pingcap/chaos-mesh:latest
部署 Chaos-mesh 到本地集群
当我们成功在本地构建完成镜像以后,我们可以尝试自己部署刚刚构建完成的镜像到本地 Kubernetes 集群中。
通过 hack
文件夹下的脚本,我们可以快速启动一个本地 Kubernetes 集群:
hack/kind-cluster-build.sh -n chaos-mesh -c 3
当脚本执行完成后,我们可以通过以下指令来验证:
# 通过 kind get clusters,验证本地已经有名为 chaos-mesh 的 kubernetes 运行
$ kind get clusters
chaos-mesh
# 通过 kubectl get nodes, 可以看到 chaos-mesh 由 1 个 master 节点组成,3个 worker 节点组成。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
chaos-mesh-control-plane NotReady master 37s v1.12.8
chaos-mesh-worker NotReady <none> 15s v1.12.8
chaos-mesh-worker2 NotReady <none> 16s v1.12.8
chaos-mesh-worker3 NotReady <none> 15s v1.12.8
当本地集群启动以后,我们需要将 chaos-mesh 的 CRD 文件创建到集群中去。如果你并不了解什么是 CRD,可以参考 Custom Resources
在 chaos-mesh 项目根目录执行:
kubectl apply -f manifests/crd.yaml
$ kubectl apply -f manifests/crd.yaml
customresourcedefinition.apiextensions.k8s.io/iochaos.pingcap.com created
customresourcedefinition.apiextensions.k8s.io/kernelchaos.pingcap.com created
customresourcedefinition.apiextensions.k8s.io/networkchaos.pingcap.com created
customresourcedefinition.apiextensions.k8s.io/podchaos.pingcap.com created
customresourcedefinition.apiextensions.k8s.io/timechaos.pingcap.com created
然后,我们需要将之前已经构建好的 chaos-mesh 镜像加载到我们的本地 Kubernetes 集群中:
kind load docker-image localhost:5000/pingcap/chaos-mesh:latest --name chaos-mesh
kind load docker-image bitnami/kubectl:latest --name chaos-mesh
当依赖的镜像全部预载完毕以后,我们可以通过 helm
来将 chaos-mesh 安装到本地 Kubernetes 集群:
helm install --name chaos --namespace chaos-testing --set controllerManager.image="localhost:5000/pingcap/chaos-mesh:latest" --set controllerManager.imagePullPolicy="IfNotPresent" .
你可以通过 kubectl get pod
来观察 chaos-mesh 组件的启动情况:
$ kubectl get pod -n chaos-testing
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-f4c4ccd89-wdqjt 1/1 Running 0 17s
chaos-daemon-bq9nk 0/1 ContainerCreating 0 3m39s
chaos-daemon-nskks 0/1 ContainerCreating 0 3m38s
chaos-daemon-tgp62 0/1 ContainerCreating 0 3m38s
这里我们暂时不需要去关心 chaos-daemon
的启动状况,仅需要 chaos-controller-manager
pod 启动即可。接下来我们可以尝试阅读 PodChaos 使用用例,在 Kubernetes 集群上尝试 PodChaos.
销毁集群
当测试结束时,我们可以删除集群上的 chaos-mesh 组件,或者直接删除本地的测试集群。
删除 chaos-mesh 组件请参考:
helm del --purge chaos
删除本地测试集群请参考:
kind delete cluster --name chaos-mesh
更多资料
通过以上步骤,则已经可以掌握整个 Chaos-mesh 开发过程中,从本地编译、构建镜像,到在本地集群调试的整个流程。获取更多本地开发资料,请参考 Chaos-mesh wiki
Last updated
Was this helpful?