[英]Local Development Best Practices: Java, Docker, Kubernetes
我试图找出在本地环境中使用 Kubernetes 部署的 Docker 容器中或在开发代码时使用 Java 的最终最佳实践。 在理想状态下,Java 开发人员应该能够像 python/javascript 开发人员一样快速移动,但我很难匹配速度(甚至接近)。
目前,我有一个手动部署的 k8 集群。 我的 Java Spring 项目是在手动运行构建命令后由 Maven 构建的( mvn clean install
),然后我运行一个脚本来制作图像,之后我运行一个脚本来运行 minkube(如果它还没有运行),最后我必须apply
部署清单文件(将容器启动到 pod 中)。
我缺少什么:
遗憾的是, 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 镜像
我对您的开发工作流程的看法:
docker-maven-plugin
从您的 maven 构建构建直接的 docker 镜像。您提到 python/js 速度快,但请注意,即使是这些语言,基本步骤也保持不变,即构建 docker 镜像、推送到存储库、更新 k8s 部署。
热部署也适用于 Java,即使在 eclipse 之类的事情中,比如使用基于 Spring Boot 的微服务,您也可以使用spring-dev-tools进行实时重新加载和自动重启。 但是,我不知道有什么可以帮助您处理 docker 容器的实时更改,我会要求您避开它 docker 容器应该是不可变的。
抱歉,如果我迟到了,我会尽力为未来的读者提供答案,或者仍然为您提供答案!
首先,docker 在 kubernetes 集群上构建和部署是软件供应链的两个完全不同的阶段,让我们将它们作为单独的论述
a) 创建一个包含所有 k8s 清单的配置存储库,并在每次推送时从 CI 服务器运行 kubectl apply
b) 将配置与感兴趣的微服务一起放置,使用提交哈希标记新构建的镜像,并在管道的末尾 kubectl apply env.yaml && kubectl set image myregistry.com/myimage:${commitHash} (请务必也标记为“最新”并在您的部署规范中包含最新标记,这有助于在删除和应用配置后重建当前情况)
c) 使用掌舵图进行部署。 它与前一个类似,但您可以利用依赖项管理和部署模板化的所有优势
当你进行 tdd 开发时,热重载很好,但在代码即将交付时没用,无论是 node/python 微服务,你都不会使用它,因为一旦你的代码被容器化,你应该用 AK47 拍摄每个试图接触的开发人员它。 这里真正重要的是自动化您的集成/交付/部署。 在我的团队中,我们只需要打开并接受 PR,奇迹就会发生
您需要在笔记本电脑上的微服务之间进行一些调试/集成。 我不会阻止这种做法,但必须以速度对生产力不那么重要的频率进行。 但是如果你想这样做,你可以用 docker compose 构建一个“笔记本电脑”或“开发”环境,从注册表中提取你的依赖项(重现当前的“在线”情况),然后用自己的微服务构建你的微服务配置。 另一种方法是使用 k8s 功能的端口转发来假装一个 pod 与您的本地机器连接并公开一个众所周知的端口,但如果有很多依赖项,那就很头疼了。 第三种方法是使用https://www.telepresence.io/ 之类的工具,它承诺在本地运行一个 pod 并使用一对双向代理连接到集群
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.