代码之家  ›  专栏  ›  技术社区  ›  Chad Van De Hey

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

  •  4
  • Chad Van De Hey  · 技术社区  · 6 年前

    我试图找出在使用Kubernetes部署的Docker容器中使用Java的最佳实践 在本地环境中或在开发代码时

    目前,我有一个工作,手动部署k8的集群。我的javaspring项目是在手动运行build命令之后由maven构建的( mvn clean install ),然后我运行一个脚本来生成一个图像,然后我运行一个脚本来运行minkube(如果它还没有运行),最后我不得不 apply

    我缺少的是:

    1. 所有这些都是手动完成的(在代码生成后,有足够的空间自动生成映像,并使用新映像更新k8s)。
    2. 我还没有看到本地开发环境和云托管的k8集群之间的集成。理想情况下,开发人员会在本地进行测试,直到他们准备好部署到云端。当它们准备好时,单击一个按钮并从远程注册表中读取一个集群将是非常棒的,它可以获取docker映像更改并重新加载。

    Skaffold ,我很乐意使用的工具并不是与Java一起工作的。 Java开发人员是否还使用了另一种工具来实现其本地部署的超快速,并与DUCK语言(py、js)竞争?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Yogesh_D    6 年前

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

    • 就像@Ortomala Lokni提到的,使用 docker-maven-plugin 从maven构建直接构建docker映像。
    • 你可以用 https://github.com/fabric8io/fabric8-maven-plugin
    • Bastions ,这取决于您的云k8s集群的API服务器是否公开可用。
    • 看看minikube的k8s测试集群, even latest versions of docker for desktop 现在有一个简单的k8s服务器内置。
    • 我没有使用skafold,但是对文档的基本查看表明它也应该适合您,因为它接管了监视代码、启动docker构建和部署到k8s的基本功能。这些函数在不同语言中保持不变。上面提到的两个插件集成了builddocker映像并部署到k8s到maven工作流中。

    热部署也可以与Java一起使用,甚至在eclipse这样的环境中,比如说使用基于spring引导的微服务,您就可以使用 spring-dev-tools 进行实时重新加载和自动重启。

        2
  •  2
  •   Ortomala Lokni    6 年前

    您可以直接从maven用 docker-maven-plugin . 添加到您的 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>
    

    Docker compose

        3
  •  0
  •   Carmine Ingaldi    5 年前

    对不起,如果我迟到了,我会尽量给未来的读者一个答案,也许还是给你!

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

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

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

    b) 将config与感兴趣的微服务放在一起,用commit散列标记新构建的映像,并将其放在管道的末尾 (只需确保标记为“latest”,并在部署规范中包含最新的标记,这有助于在删除和应用配置后重建当前情况)

    c) 使用舵图部署。它与前面的类似,但是您可以利用依赖关系管理和部署模板化的所有优点

    1. 您需要在笔记本电脑上的微服务之间进行一些调试/集成。我并不反对这种做法,但这是一种必须以速度对生产力不太重要的频率进行的做法。但是如果你想这样做,你可以用docker compose构建一个“膝上型”或“开发”环境,从注册表中提取你的依赖项(重现当前的“在线”情况),然后用自己的配置构建你的微服务。另一种方法是使用端口转发k8s功能来假装pod与您的本地计算机连接,从而暴露出一个众所周知的端口,但是如果存在许多依赖关系,这是一个令人头痛的问题。第三种方法是使用诸如 https://www.telepresence.io/ 它承诺在本地运行一个pod,并通过一对双向代理连接到集群