详解Kubernetes微服务自动化发布系统 (2)

前面我们描述了基于GitLab-CI机制实现自动化发布系统的基本组成,要具体实现这套系统你需要安装部署GitLab服务器并配置GItLab Runner功能,私有镜像仓库服务(Harbor或JFrog)以及Kubernetes集群(具体可参见本专栏的其他文章)。

由于GitLab服务器是CI/CD流程执行的主要承载点,如果你的服务是基于Maven构建的Java服务,那么还需要在GitLab服务器中安装Maven客户端,并配置Maven私服的地址,以提高构建速度。此外GitLab服务器在CI/CD流程执行中还会运行Docker镜像打包构建,将镜像push到Docker镜像仓库以及将Docker镜像从私有仓库发布至Kubernetes集群等逻辑,所以GitLab服务器还需要安装Docker环境及kubelet客户端。

如果环境都OK,那么我们就可以在Gitlab项目根目录代码中创建“.gitlab-ci.yml”文件并定义具体的CI/CD流程了。但在具体定义之前,我们需要在Maven项目中添加应用Docker镜像打包的插件配置及Dockerfile文件定义,具体如下:

<!--添加Docker镜像Maven打包插件--> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <!--指定Dockerfile文件位置--> <dockerfile>docker/Dockerfile</dockerfile> <!--指定Docker镜像仓库路径--> <repository>${docker.repository}/springcloud-action/${app.name}</repository> <buildArgs> <!--提供参数向Dockerfile传递--> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>

在项目工程pom.xml文件中添加“dockerfile-maven-plugin”插件,该插件是早期“docker-maven-plugin”插件的替代品,支持将Maven项目构建打包为Docker镜像。上述配置中,针对Docker镜像的具体构建方式,是通过在标签中指定Dockerfile文件来实现的。具体可在项目工程中创建docker目录,并创建Dockerfile文件,内容如下:

FROM openjdk:8u191-jre-alpine3.9 ENTRYPOINT ["/usr/bin/java", "-jar", "/app.jar"] ARG JAR_FILE ADD ${JAR_FILE} /app.jar EXPOSE 8080

配置好Maven打包插件后,就能支持通过Maven打包命令,将应用代码打包成Docker镜像了。此时我们在".gitlab-ci.yml"文件中定义具体的CI/CD构建Stages,示例如下:

#环境参数信息 variables: #Docker镜像仓库地址&账号密码信息 DOCKER_REPO_URL: "10.211.55.11:8088" DOCKER_REPO_USERNAME: admin DOCKER_REPO_PASSWORD: Harbor12345 #Kubernetes相关信息配置(空间与服务端口) K8S_NAMESPACE: "wudimanong" PORT: "8080" #定义CI/CD阶段 stages: - test - build - push - deploy #执行单元测试阶段 maven-test: stage: test script: - mvn clean test #代码编译打包镜像阶段 maven-build: stage: build script: - mvn clean package -DskipTests #将打包的Docker镜像上传至私有镜像仓库 docker-push: stage: push script: #对打包的镜像进行tag - docker tag $DOCKER_REPO_URL/$CI_PROJECT_PATH $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8} #登录私有镜像仓库 - docker login $DOCKER_REPO_URL -u $DOCKER_REPO_USERNAME -p $DOCKER_REPO_PASSWORD #上传应用镜像至镜像仓库 - docker push $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8} - docker rmi $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8} - docker rmi $DOCKER_REPO_URL/$CI_PROJECT_PATH #将应用发布至Kubernetes测试集群(这里指定为手动确认方式) deploy-test: stage: deploy when: manual script: - kubectl config use-context kubernetes-admin@kubernetes - sed -e "s/__REPLICAS__/1/; s/__PORT__/$PORT/; s/__APP_NAME__/$CI_PROJECT_NAME/; s/__PROFILE__/test/; s/__IMAGE__/$DOCKER_REPO_URL\/${CI_PROJECT_PATH//\//\\/}\/${CI_BUILD_REF_NAME//\//\\/}:${CI_COMMIT_SHA:0:8}/" kubernetes/deploy.yaml | kubectl -n ${K8S_NAMESPACE} apply -f -

如上所述,我们在“.gitlab-ci.yml”文件中定义了”test、build、push、deploy”这4个stages阶段。这几个stages的具体说明如下:

test:执行单元测试代码;

build:执行构建打包指令,将应用构建打包为Docker镜像;

push:该阶段主要是将build构建的本地Docker镜像经过tag处理后上传至Harbor镜像仓库,并在成功后清理掉本地镜像文件;

deploy:该阶段主要是执行Kubernetes指令,根据Kubernetes发布部署文件的配置,将容器镜像部署发布至Kubernetes集群;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggdfs.html