基本实现流程:

          用户git代码提交 ----》 Jenkins 根据 Dockerfile  + build.sh 脚本执行构建 ------》输出 bin文件,完成容器镜像打包构建   -------》 运行测试容器,提供测试   --------》 测试通过,更新镜像到线上harbor仓库------》 更新kubernets 资源文件,完成部署/升级应用。 

 (注:代码+Dockerfile+values.yaml 文件均放在 git仓库中。)


    如下为Dockerfile示例:

1、 Dockerfile:


# BUILD 阶段
FROM golang:1.9 AS build
#ENV project=app
# 设置我们应用程序的工作目录
WORKDIR /go/src/app

# 添加所有需要编译的应用代码
COPY . /go/src/app

# 编译一个静态的go应用(在二进制构建中包含C语言依赖库)
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .

# 设置我们应用程序的启动命令
CMD ["./app"]

# 生产阶段
FROM scratch AS prod

# 从buil阶段拷贝二进制文件
COPY --from=build /go/src/app/app .

EXPOSE 8080

CMD ["./app"]

 

2、valuse.yaml 

存放一些需要更新的字段,例如:

   服务名称

   进程启动命令命令

   需求的资源信息 (cpu /mem /disk )

   。。。

   (   Jenkins 根据用户提供的 valuse   ,执行build.sh 脚本,生成 k8s 需要的  manifest.yaml 文件 ) 


3、 build.sh 


tag=`date +%Y%m%d%H%M%S`


#构建镜像

docker build . -t harbor/dev/app:$tag


#运行测试容器

docker run --name testgo -d -p 1111:8080 harbor/dev/app:$tag


#测试验证
curl 10.188.61.101:1111  


#推送到镜像仓库

docker push harbor/dev/app:$tag


#更新资源文件
sed "s/app:latest/app:$tag/g"  values.conf  >online_manifest.yaml


#部署到生产环境

kubectl apply -f online_manifest.yaml


       此种方案优势:

        1、生成的镜像精简,部署高效,节省磁盘空间。

        2、用户git提交后,jenkins 可自动完成镜像构建工作,减去人工干预。

        3、结果kubernetes,实现自动化部署。