前言

出于作者对DevOps的兴趣,虽然之前也有想法自己实践一套基于GitLab的CI/CD的完整流程以及通过ElectronJs开发一个桌面版发布清单应用,奈何一直没有时间做这件事。其实想想也不奇怪要做成这件事情也有不少东西去做,首先需要一台配置足够能跑GitLab的服务器(最好4C8G,感觉有点小贵。。。),其次需要了解gitlab-ci脚本的编写规则(这个其实不是很难),最后还得学习一下ElectronJs。这次我们就根据下面这个流程图慢慢把这个流程当拼图一样一步一步拼好。
image.png

制作Java镜像

先抛开Gitlab的步骤不谈(写这篇文章时条件限制,后续补上),当我们通过gitlab-ci.yml脚本将Java项目代码打包后上传至一个仓库到时候在编写Dockerfile的时候能够将打包好的Jar包下载来即可,作者这边是将打包好的Jar包放在服务器上通过Nginx下载文件。Nginx的配置如下:

1
2
3
4
5
6
7
8
9
10
11
server {
location ^~ /downloadJar/ {
#需要下载的文件存放的目录
alias <java_jar_package_path>;
sendfile on;
autoindex on; # 开启目录文件列表
autoindex_exact_size on; # 显示出文件的确切大小,单位是bytes
autoindex_localtime on; # 显示的文件时间为文件的服务器时间
charset utf-8,gbk; # 避免中文乱码
}
}

效果就是下面这个样子,当然也可以将Jar包放在一些第三方存储服务上如OSS等等。
image.png
确认能下载后就可以开始编写一个Java项目的Dockerfile,下面是作者编写的比较简单的一个Dockerfile。(真实的生产环境需要根据具体的情况去实现项目Dockerfile)

1
2
3
4
5
6
7
8
9
10
11
FROM openjdk:8-jdk

MAINTAINER zhangchen zc19940702@gmail.com

WORKDIR /var/www/project

ADD <DOWNLOAD_JAR_URL> /var/www/project # 从远程地址下载jar包

EXPOSE 8080

CMD ["java", "-jar", "micro-gateway-0.0.1-SNAPSHOT.jar"]

到这里我们就基本制作好了我们需要部署Java项目的镜像。

镜像私有仓库搭建

当我们镜像制作好了需要上传至镜像仓库,像Docker的镜像仓库主要是俩大类公共仓库如DockerHub,其次就是私有的镜像仓库如Registry、Harbor等。作者这边为了方便以及时间成本选择了Registry,但是为了更好的管理镜像最好是选择类似Harbor这样的服务
K8s从私有仓库拉取镜像是需要HTTPS的,这里可以使用自签证书(操作会略微复杂一点)或者由CA签发的SSL证书。作者依旧是为了方便用的是免费申请的SSL证书。通过以下命令搭建私有镜像仓库:

1
2
3
# 挂载证书目录至容器,通过环境变量REGISTRY_HTTP_TLS_CERTIFICATE、REGISTRY_HTTP_TLS_KEY配置SSL

docker run -d -v /var/www/blog:/var/www/cert -e REGISTRY_HTTP_TLS_CERTIFICATE=/var/www/cert/zc940702.top.pem -e REGISTRY_HTTP_TLS_KEY=/var/www/cert/zc940702.top.key -p 5000:5000 registry

服务启动后我们就可以推送镜像到私有仓库,通过执行以下命令:

1
2
3
4
5
6
7
8
9
# 这里以nginx镜像举例

docker tag nginx:latest <YOUR_HOST>:5000/nginx:latest

docker push <YOUR_HOST>:5000/nginx:latest

# 推送成功后可以通过curl验证

curl https://<YOUR_HOST>:5000/v2/_catalog

K8s从私有仓库拉取镜像

最后还是以nginx的资源清单举例,当我们将自己制作的镜像推到镜像仓库后就可以调整清单并让kubelet从私有仓库拉取镜像了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: Deployment
metadata:
name: remote-registry-test
namespace:
spec:
selector:
matchLabels:
app: nginx-test
replicas: 1
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- name: nginx-test
image: <YOUR_HOST>:5000/nginx:latest # 从私有仓库拉取镜像
ports:
- containerPort: 80