最近打算在自己维护的PaaS平台中增加对Golang应用部署的支持, 这篇博客就探讨一下此次工作准备的内容, 以及关注的点.

PaaS平台允许用户部署自己的代码上去, 先前的平台中已经支持了Python应用的部署. 整个配套设施包括用户自定义的配置, Docker镜像构建, 应用程序的安装, 日志收集, 定时任务与应用脚本.

配置加载

由于用户在PaaS平台中会增加自定义配置, 在先前的PaaS平台中已有, 因此可以直接沿用, 我简要介绍一下配置是如何加载进容器吧, 主要利用了Kubernetes提供的secret功能, 可以将配置作为文件形式挂载进入容器. 具体的使用, 可以参照 Kubernetes文档:

https://kubernetes.io/docs/concepts/configuration/secret/

Dockerfile的考量

针对解释型语言, 例如Python直接构建镜像就可以了, 可以做的优化是将reqirements.txt提前拷贝至镜像, 安装依赖并缓存, 优化手段可以参考Docker系列(七)-Dockerfile进阶-多阶段构建与构建优化

而对于Golang这种解释型语言, 我决定采用多阶段构建的方式, 并且由于有了go mod也可以提前拷贝go.sumgo.mod 至镜像中, 安装依赖并缓存.

参考这里的构建方式: Using go mod download to speed up Golang Docker builds

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Golang编译阶段
FROM golang:1.11.1-alpine3.8 as build-env
# All these steps will be cached
RUN mkdir /hello

WORKDIR /hello

# 国内用户可能需要设置 go proxy
RUN go env -w GOPROXY=https://goproxy.cn,direct

# COPY go.mod and go.sum files to the workspace
COPY go.mod .
COPY go.sum .

# Get dependancies - will also be cached if we won't change mod/sum
RUN go mod download
# COPY the source code as the last step
COPY . .

# Build the binary
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o /go/bin/hello

# 构建运行时容器
FROM debian:stretch
COPY --from=build-env /go/bin/hello /go/bin/hello
ENTRYPOINT ["/go/bin/hello"]

日志收集

主要借助了Kubernetes应用的日志收集, 也就是stdout与stderr. 另外, 先前平台其实也提供了rsyslog上传日志的功能, 因此, 也可以将日志服务器的地址作为配置信息加载到程序中, 由程序进行日志上传工作.

定时任务 与 执行脚本