DeathStarBench部署
主要有三个应用,三个应用之间有公用的微服务
- Social Network (released)
- Media Service (released)
- Hotel Reservation (released)
hotelreservation 部署
在k8s集群中部署
Pre-requirements
- Docker
- luarocks (apt-get install luarocks)
- luasocket (luarocks install luasocket)
- kubernetes集群
step1: 构建所有微服务镜像
首先找到构建镜像的shell脚本<path-of-repo>/hotelReservation/kubernetes/scripts/build-docker-images.sh
#!/bin/bash
cd $(dirname $0)/..
EXEC="docker buildx"
USER="igorrudyk1"
TAG="latest"
# ENTER THE ROOT FOLDER
cd ../
ROOT_FOLDER=$(pwd)
$EXEC create --name mybuilder --use
for i in hotelreservation #frontend geo profile rate recommendation reserve search user #uncomment to build multiple images
do
IMAGE=${i}
echo Processing image ${IMAGE}
cd $ROOT_FOLDER
$EXEC build -t "$USER"/"$IMAGE":"$TAG" -f Dockerfile . --platform linux/arm64,linux/amd64 --push
cd $ROOT_FOLDER
echo
done
cd - >/dev/null
因为官方考虑到微服务要去多种架构的平台上部署,所以这里用了buildx工具,但是我的集群服务器都是amd架构的,所以直接用docker build就行,修改了一下:
#!/bin/bash
cd $(dirname $0)/..
EXEC="docker build"
USER="nuaaxyli"
TAG="latest"
# ENTER THE ROOT FOLDER
cd ../
ROOT_FOLDER=$(pwd)
# $EXEC create --name mybuilder --use
svc=("frontend" "geo" "profile" "rate" "recommendation" "reserve" "search" "user")
for i in "${svc[@]}" #frontend geo profile rate recommendation reserve search user #uncomment to build multiple images
do
IMAGE=${i}
echo Processing image ${IMAGE}
cd $ROOT_FOLDER
$EXEC -t "$USER"/"$IMAGE":"$TAG" -f Dockerfile .
docker push "$USER"/"$IMAGE":"$TAG"
cd $ROOT_FOLDER
echo
done
里面的dockerfile在hotelReservation
路径下
FROM golang:1.21 as builder
WORKDIR /workspace
COPY go.sum go.sum
COPY go.mod go.mod
COPY vendor/ vendor/
COPY cmd/ cmd/
COPY dialer/ dialer/
COPY registry/ registry/
COPY services/ services/
COPY tls/ tls/
COPY tracing/ tracing/
COPY tune/ tune/
COPY config.json config.json
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go install -ldflags="-s -w" -mod=vendor ./cmd/...
遇到docker源访问超时问题就进入/etc/docker/daemon.json
更换docker源就行,docker源最近封了很多,以下是我的:
{
"registry-mirrors": [
"http://docker.registry.cyou",
"http://dhub.kubesre.xyz",
"https://dockerpull.com",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://dockerhub.icu",
"https://hub.rat.dev",
"https://docker.1panel.live",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"exec-opts":["native.cgroupdriver=systemd"]
}
其他步骤出问题也一样,尽量把构建过程用日志打印出来,使用命令
docker build -t <image> --progress=plain
如果遇到docker镜像内部启动程序等的问题,因为无法查看未启动容器的docker log
,所以就想办法让容器启动,但不触及错误部分,举个例子:
FROM golang:1.21 as builder
WORKDIR /workspace
COPY go.sum go.sum
COPY go.mod go.mod
COPY vendor/ vendor/
COPY cmd/ cmd/
COPY dialer/ dialer/
COPY registry/ registry/
COPY services/ services/
COPY tls/ tls/
COPY tracing/ tracing/
COPY tune/ tune/
COPY config.json config.json
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go install -ldflags="-s -w" -mod=vendor ./cmd/...
# 添加这两句
RUN chmod a+x ./main.sh
CMD ["sh", "./main.sh"]
mail.sh
sleep 10000s
然后执行docker exec <image> /bin/bash
即可进入容器查看文件结构等
step2: 部署
执行kubectl apply -Rf <path-of-repo>/hotelReservation/kubernetes/
执行后出现一下问题:
https://github.com/delimitrou/DeathStarBench/issues/343
我已经把我的解决办法放上去了
拿geo举例,容器启动时路径为/workspace,geo-deployment.yaml文件里的容器启动command是./geo,所以显示文件不存在,go 编译后的可执行文件在GOPATH/bin目录下,我的是在/go/bin,所以把这里的./geo改为/go/bin/geo,另外我也不知道为啥clone下来的geo-deployment.yaml文件里的container.image不是之前步骤里构建的服务镜像,所以我直接改成了之前步骤里构建的服务镜像geo
执行kubectl get pods
简单进入容器访问服务是否运行正常: