我试图找出在本地环境或开发代码时使用Kubernetes部署的Docker容器中使用Java的最终最佳实践。在理想状态下,Java开发人员应该能够像python / javascript开发人员一样快地移动,但是我很难适应这种速度(甚至接近)。
目前,我有一个正在工作的手动部署的k8集群。我的Java Spring项目是在手动运行构建命令(mvn clean install
)之后由maven构建的,然后我运行脚本来制作映像,此后我运行脚本来运行minkube(如果尚未运行)并且最后,我必须apply
一个部署清单文件(将容器启动到容器中)。
我所缺少的:
遗憾的是,Skaffold,我很高兴使用的工具不适用于Java。 Java开发人员是否使用另一种工具来使其本地部署超级快速并与DUCK语言(py,js)竞争?
答案 0 :(得分:2)
您可以使用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映像答案 1 :(得分:1)
我对您的开发工作流程的看法:
docker-maven-plugin
从您的Maven构建中构建直接的Docker映像。您提到python / js很快,但是要注意,即使对于那些语言,基本步骤也保持不变,构建docker映像,推送到存储库,更新k8s部署。
热部署也已与Java一起使用,即使在诸如eclipse之类的事情中,基于Spring Boot的微服务也可以使用spring-dev-tools进行实时重载和自动重启。 但是我不知道有什么能帮助您处理对Docker容器的实时更改,我想请您回避它,因为Docker容器应该是不变的。
答案 2 :(得分:0)
对不起,如果我迟到了,我会尽力为将来的读者提供答案,或者也许还是给您!
首先,在kubernetes集群上构建和部署docker是您软件供应链的两个完全不同的阶段,让我们将其作为单独的论述来讨论
a)创建包含所有k8s清单的配置存储库,并在每次推送时从您的CI服务器运行kubectl apply
b)将配置和感兴趣的微服务一起放置,用提交哈希标记新构建的映像,并在管道的末尾
c)使用头盔图表进行部署。与之前的相似,但是您可以利用依赖管理和部署模板化的所有优势
当您进行tdd开发时,热重装非常好,但是在代码即将交付时却毫无用处,因为node / python微服务都不能使用它,因为一旦将代码容器化,就应该使用AK47进行拍摄每个试图触碰它的开发人员。这里真正的大事是自动化您的集成/交付/部署。在我的团队中,我们只需要打开并接受PR,魔术就会发生
您需要在便携式计算机上的微服务之间进行一些调试/集成。我不会阻止这种做法,但是必须以一种频率来进行工作,而这种速度对于生产率而言并不那么重要。但是,如果您想这样做,则可以使用docker compose构建“笔记本电脑”或“开发”环境,从注册表中提取依赖项(以重现当前的“在线”情况),然后使用自己的微服务来构建它。组态。另一种方法是使用端口转发k8s功能来假装一个Pod与您的本地计算机相连,从而暴露了一个众所周知的端口,但是如果存在许多依赖关系,这将是令人头疼的事情。第三种方法是使用https://www.telepresence.io/之类的工具,它们承诺将在本地运行Pod并通过双向的一对代理连接到集群