[!TIP]
Jenkins
部署go
应用到k8s
转载请注明出处:https://janrs.com
Jenkins 部署 go 应用到 k8s
以 go-zero
项目为例构建镜像并推送到 Harbor
镜像仓库中心,并且使用 kubectl
部署到 k8s
。
1.设置 Jenkins 参数
Jenkins
使用 Docker
构建镜像需要挂载 Docker
的进程 sock
已经可执行文件。参数如下:
该参数已经在前面部署 Jenkins
的时候设置了
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
如果没设置,设置后重新运行 Jenkins
容器。
2.设置 kubectl
复制 kubectl
可执行文件以及 kubectl.config
到 Jenkins
容器内
kubectl.kubeconfig
位置一般存放在 ~/.kube/config
。
# 复制 config
docker cp config jenkins:/root/.kube/
# 复制 kubectl
docker cp kubectl jenkins:/usr/local/bin/
复制后到 Jenkins
容器内执行 kubectl
命令测试
kubectl get cs
显示
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health":"true","reason":""}
controller-manager Healthy ok
scheduler Healthy ok
3.设置密码脱敏
在执行 pipeline
的过程中会把一些账号密码显示在终端,比如 Docker
登录到 Harbor
的密码。这些都需要脱敏。
设置位置:系统管理
-> Manage Credentials
-> System
-> 全局凭据
-> 添加一些凭据
。
截图如下:
[!NOTE]
选择Username with password
。
勾选Treat username as secret
将账号也脱敏。
ID
可填可不填。没有填写会自动生成。
账号跟密码就填写Harbor
的账号跟密码。

4.创建 Dockerfile
该教程使用的是 go-zero
项目的 Dockerfile
。其他 go
项目自行设置。
FROM golang:alpine AS builder
LABEL stage=gobuilder
ENV CGO_ENABLED 0
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update --no-cache && apk add --no-cache tzdata
WORKDIR /build
ADD go.mod .
ADD go.sum .
RUN go mod download
COPY . .
COPY service/permission/api/etc /app/etc
RUN go build -ldflags="-s -w" -o /app/admin service/permission/api/admin.go
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ Asia/Shanghai
WORKDIR /app
COPY --from=builder /app/admin /app/admin
COPY --from=builder /app/etc /app/etc
CMD ["./admin", "-f", "etc/admin-api.yaml"]
5.编写 pipeline
[!NOTE]
编写pipeline
,也就是gz-admin-jenkinsfile
项目下的Jenkinsfile
文件。
编写完成后push
到gitlab
。
pipeline{
agent any
//选项
options {
//设置终端显示颜色
ansiColor('gnome-terminal')
}
//全局变量
environment {
//设置镜像版本
IMAGE_VERSION = "v1"
}
stages{
//拉取项目代码
stage('Pull Code'){
steps{
echo '>>>>>>>>>>>>>>>>>>START PULL CODE<<<<<<<<<<<<<<<<<<<<'
checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: 'ssh://git@172.16.222.250:1122/janrs/gz-admin.git']]])
echo '>>>>>>>>>>>>>>>>>>END PULL CODE <<<<<<<<<<<<<<<<<<<<'
}
}
//构建镜像
stage('Build Image'){
steps{
echo '>>>>>>>>>>>>>>>>>>START BUILD IMAGE<<<<<<<<<<<<<<<<<<<<'
sh "docker build -t gz-admin:${IMAGE_VERSION} -f $WORKSPACE/service/permission/api/Dockerfile ."
echo '>>>>>>>>>>>>>>>>>>START BUILD IMAGE<<<<<<<<<<<<<<<<<<<<'
}
}
//推送镜像
stage('Push Image'){
steps{
echo '>>>>>>>>>>>>>>>>>>START PUSH IMAGE<<<<<<<<<<<<<<<<<<<<'
//账号密码脱敏
withCredentials([usernamePassword(credentialsId: 'harbor_secret', passwordVariable: 'password', usernameVariable: 'username')]) {
sh "echo $password | docker login https://172.16.222.250:8443 -u $username --password-stdin"
}
sh "docker tag gz-admin:${IMAGE_VERSION} 172.16.222.250:8443/gz-admin/gz-admin:${IMAGE_VERSION}"
sh "docker push 172.16.222.250:8443/gz-admin/gz-admin:${IMAGE_VERSION}"
echo '>>>>>>>>>>>>>>>>>>END PUSH IMAGE<<<<<<<<<<<<<<<<<<<<'
}
}
//删除镜像
stage('Delete Image'){
steps{
echo '>>>>>>>>>>>>>>>>>>START DELETE IMAGE<<<<<<<<<<<<<<<<<<<<'
//删除本地镜像
sh "docker rmi gz-admin:${IMAGE_VERSION}"
sh "docker rmi 172.16.222.250:8443/gz-admin/gz-admin:${IMAGE_VERSION}"
//删除缓存的中间镜像。如果是第一次部署项目,可先将该命令注释。
//后面再打开该参数。不删除的话,会一直增加中间镜像,占用磁盘空间。
sh "docker image prune -f --filter \"until=10m\""
echo '>>>>>>>>>>>>>>>>>>END DELETE IMAGE<<<<<<<<<<<<<<<<<<<<'
}
}
//部署到 kubernetes
stage('Deploy to k8s'){
steps{
echo '>>>>>>>>>>>>>>>>>>START DEPLOY<<<<<<<<<<<<<<<<<<<<'
sh "kubectl apply -f $WORKSPACE/service/permission/api/gz-admin.yaml"
echo '>>>>>>>>>>>>>>>>>>END DEPLOY<<<<<<<<<<<<<<<<<<<<'
}
}
}
}
6.部署 gz-admin 项目
在 gz-admin
项目里随便创建一个没用的空文件,然后 push
代码触发 jenkins
进行 pipeline
部署。
部署结果截图如下:
可以看到 gz-admin
镜像已经部署到 k8s

发表回复