繁体   English   中英

本地开发最佳实践:Java、Docker、Kubernetes

[英]Local Development Best Practices: Java, Docker, Kubernetes

我试图找出在本地环境中使用 Kubernetes 部署的 Docker 容器中或在开发代码时使用 Java 的最终最佳实践。 在理想状态下,Java 开发人员应该能够像 python/javascript 开发人员一样快速移动,但我很难匹配速度(甚至接近)。

目前,我有一个手动部署的 k8 集群。 我的 Java Spring 项目是在手动运行构建命令后由 Maven 构建的( mvn clean install ),然后我运行一个脚本来制作图像,之后我运行一个脚本来运行 minkube(如果它还没有运行),最后我必须apply部署清单文件(将容器启动到 pod 中)。

我缺少什么:

  1. 所有这一切都是手动完成的(在构建代码之后,自动构建镜像的过程以及使用新镜像更新 k8s 的过程有很大的空间)。
  2. 构建是手动指定的(python 在代码保存时重新启动。据我所知,在 Java 世界中没有热重新加载)。
  3. 我还没有看到本地开发环境和云托管的 k8 集群之间的集成。 理想情况下,开发人员会在本地进行测试,直到他们准备好部署到云中。 当它们准备好时,点击一个按钮并从远程注册表读取一个集群可以获取 docker 镜像更改并重新加载,这将是非常棒的。

遗憾的是, Skaffold是我很乐意使用的工具,但它本身不能与 Java 一起使用。 Java 开发人员是否正在使用另一种工具来使他们的本地部署超快并与 DUCK 语言(py、js)竞争?

您可以使用docker-maven-plugin直接从 maven 构建 docker 镜像。 添加到您的pom.xml

<build>
  <plugins>
    ...
    <plugin>
      <groupId>com.spotify</groupId>
      <artifactId>docker-maven-plugin</artifactId>
      <version>VERSION GOES HERE</version>
      <configuration>
        <imageName>example</imageName>
        <dockerDirectory>docker</dockerDirectory>
        <resources>
           <resource>
             <targetPath>/</targetPath>
             <directory>${project.build.directory}</directory>
             <include>${project.build.finalName}.jar</include>
           </resource>
        </resources>
      </configuration>
    </plugin>
    ...
  </plugins>
</build>

我不太清楚您的用例,但是在您的开发机器上部署 k8 的集群可能有点过头了。 您可以使用Docker compose测试您的 docker 镜像

我对您的开发工作流程的看法:

  • 就像@Ortomala Lokni 提到的那样,使用 docker docker-maven-plugin从您的 maven 构建构建直接的 docker 镜像。
  • 您可以使用https://github.com/fabric8io/fabric8-maven-plugin直接推送到 kubernetes 集群。
  • 如果您的集群托管在云中,您的构建机器应该能够访问 k8s API 服务器。 为此,您可能需要使用 SSH 隧道和堡垒,具体取决于您的云 k8s 集群的 API 服务器是否公开可用。
  • 查看用于本地 k8s 测试集群的 minikube,即使是桌面版docker 的最新版本现在也内置了一个简单的 k8s 服务器。
  • 没有使用过 Skaffold,但对文档的基本查看表明它也应该对你有用,因为它接管了观察你的代码、启动 docker 构建和部署到 k8s 的基本功能。 这些功能在不同语言中保持不变。 话虽如此,以上两个插件将构建 docker 镜像并部署到 k8s 集成到您的 maven 工作流程中。

您提到 python/js 速度快,但请注意,即使是这些语言,基本步骤也保持不变,即构建 docker 镜像、推送到存储库、更新 k8s 部署。

热部署也适用于 Java,即使在 eclipse 之类的事情中,比如使用基于 Spring Boot 的微服务,您也可以使用spring-dev-tools进行实时重新加载和自动重启。 但是,我不知道有什么可以帮助您处理 docker 容器的实时更改,我会要求您避开它 docker 容器应该是不可变的。

抱歉,如果我迟到了,我会尽力为未来的读者提供答案,或者仍然为您提供答案!

首先,docker 在 kubernetes 集群上构建和部署是软件供应链的两个完全不同的阶段,让我们将它们作为单独的论述

  1. 构建过程应该已经自动化了:如果您需要手动运行 mvn clean install 这意味着您正在失去 Docker 的一项优势:构建可以随处交付的可重复、不可变的软件包。 只需将RUN mvn clean install添加到您的 Dockerfile 中(是的,您之前需要将 maven 放入您的映像中,但是周围有一些基本映像可以为您完成这项工作)。 现在您应该只设置一个 CI 服务器,在每次存储库签入时构建和推送图像(我有意跳过任何质量门和管道工作流,它们由您来自动化)。 也可以通过 CI 服务器管理部署,主要有两种方法

a) 创建一个包含所有 k8s 清单的配置存储库,并在每次推送时从 CI 服务器运行 kubectl apply

b) 将配置与感兴趣的微服务一起放置,使用提交哈希标记新构建的镜像,并在管道的末尾 kubectl apply env.yaml && kubectl set image myregistry.com/myimage:${commitHash} (请务必也标记为“最新”并在您的部署规范中包含最新标记,这有助于在删除和应用配置后重建当前情况)

c) 使用掌舵图进行部署。 它与前一个类似,但您可以利用依赖项管理和部署模板化的所有优势

  1. 当你进行 tdd 开发时,热重载很好,但在代码即将交付时没用,无论是 node/python 微服务,你都不会使用它,因为一旦你的代码被容器化,你应该用 AK47 拍摄每个试图接触的开发人员它。 这里真正重要的是自动化您的集成/交付/部署。 在我的团队中,我们只需要打开并接受 PR,奇迹就会发生

  2. 您需要在笔记本电脑上的微服务之间进行一些调试/集成。 我不会阻止这种做法,但必须以速度对生产力不那么重要的频率进行。 但是如果你想这样做,你可以用 docker compose 构建一个“笔记本电脑”或“开发”环境,从注册表中提取你的依赖项(重现当前的“在线”情况),然后用自己的微服务构建你的微服务配置。 另一种方法是使用 k8s 功能的端口转发来假装一个 pod 与您的本地机器连接并公开一个众所周知的端口,但如果有很多依赖项,那就很头疼了。 第三种方法是使用https://www.telepresence.io/ 之类的工具,它承诺在本地运行一个 pod 并使用一对双向代理连接到集群

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM