Kubernetes 中,微服务自动化发布系统详解
==========================================================================
本文所要描述的自动化发布系统主要是利用 GitLab 提供的 GitLab CI 机制,实现当代码发生提交或合并等事件时自动触发预设的 CI/CD 流程。其中 CI 流程主要包括基本的代码编译、构建、打包等阶段,并在完成上述步骤后将打包好的应用 Docker 镜像发布至镜像仓库。
而 CD 阶段则是从镜像仓库拉取应用 Docker 镜像,并根据设置的 CD 流程将应用发布至指定的 Kubernetes 集群。具体系统结构如下图所示:
如上图所示,该自动化发布系统主要由 GitLab、Harbor 镜像仓库及 Kubernetes 集群组成。其中 GitLab 主要承担代码版本的管理,以及 CI/CD 流程定义和触发, Harbor 负责应用 Docker 镜像的存储和分发,而 Kubernetes 集群则是应用容器运行的基础架构环境。
[](()GitLab-CI 自动化发布系统的关键实现
========================================================================================
前面我们描述了基于 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 文件定义,具体如下:
<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>docker/Dockerfile</dockerfile>
<repository>{app.name}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
在项目工程 pom.xml 文件中添加“dockerfile-maven-plugin”插件,该插件是早期“docker-maven-plugin”插件的替代品,支持将 Maven 项目构建打包为 Docker 镜像。上述配置中,针对 Docker 镜像的具体构建方式,是通过在标签中指定 Dockerfile 文件来实现的 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 。具体可在项目工程中创建 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 Java 开源项目【ali1024.coding.net/public/P7/Java/git】 clean test
#代码编译打包镜像阶段
maven-build:
stage: build
script:
mvn clean package -DskipTests
#将打包的 Docker 镜像上传至私有镜像仓库
docker-push:
stage: push
script:
#对打包的镜像进行 tag
docker tag CI_PROJECT_PATH CI_PROJECT_PATH/{CI_COMMIT_SHA:0:8}
#登录私有镜像仓库
docker login DOCKER_REPO_USERNAME -p $DOCKER_REPO_PASSWORD
#上传应用镜像至镜像仓库
docker push CI_PROJECT_PATH/{CI_COMMIT_SHA:0:8}
docker rmi CI_PROJECT_PATH/{CI_COMMIT_SHA:0:8}
docker rmi CI_PROJECT_PATH
#将应用发布至 Kubernetes 测试集群(这里指定为手动确认方式)
deploy-test:
stage: deploy
总结
面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。
以上就是蚂蚁技术四面和 HR 面试题目,以下最新总结的最全,范围包含最全 MySQL、Spring、Redis、JVM 等最全面试题和答案,仅用于参考
评论