使用kubernetes-conf文件/环境变量部署java应用程序

使用kubernetes-conf文件/环境变量部署java应用程序,java,kubernetes,Java,Kubernetes,我有一个小java项目需要与kubernetes一起部署。 在研究库伯内特斯一段时间后,我有两个问题 因为除了java应用程序、rabbitmq和redis之外,项目还需要其他功能,显然这三个东西需要有三个docker映像 1.)我可以将java应用程序、rabbitmq和redis容器/图像放在一个pod中,还是应该放在单独的pod中(建议我将它们放在同一个pod中) 因为这是一个java应用程序(带有build.jar文件),所以它有一个foobar.conf文件,其中包含应用程序的配置,比

我有一个小java项目需要与kubernetes一起部署。 在研究库伯内特斯一段时间后,我有两个问题

因为除了java应用程序、rabbitmq和redis之外,项目还需要其他功能,显然这三个东西需要有三个docker映像

1.)我可以将java应用程序、rabbitmq和redis容器/图像放在一个pod中,还是应该放在单独的pod中(建议我将它们放在同一个pod中)

因为这是一个java应用程序(带有build.jar文件),所以它有一个foobar.conf文件,其中包含应用程序的配置,比如redis/rabbitmq主机名和端口以及其他内容

  rabbitmq{
        host="$RABBITMQ_HOSTNAME"
        username="rabbitmq"
        password="rabbitmq"
        status-queue-name="foobar-status"
        audit-queue-name="foobar-audit"
        event-queue-name="foobar-events"
        incoming-messages-queue-name="foobar-incoming-messages"
        acknowledge-queue-name="foobar-acknowledge"
  }
那么,如何将redis和rabbitmq容器端口和主机名(当它们启动时)公开到应用程序的foobar.conf文件中呢

Tnx,
Tom

是的,您将需要三个docker映像,一个用于应用程序堆栈的每个组件—应用程序、redis和rabbitmq。此外,将所有这些组件放在一个吊舱中也是一个好主意。微服务通常需要侧车才能充分发挥作用,而库伯内特斯吊舱的存在正是为了满足这一需求

但请注意docker容器本质上是无状态的。因此,如果kubernetes决定将您的pod移动到其他节点,那么运行您的服务的容器将被销毁,并将在其他节点上重新创建。由这三个组件中的任何一个写入容器内部的本地文件系统的所有数据都会在该过程中丢失。如果你意识到这一点,并且你已经将你的应用程序设计成无状态,那么你应该没事了。如果没有,请在kubernetes中探索,以便在移动吊舱时保持吊舱的状态。您可以找到有关配置pod以使用持久卷的更多信息

要回答第二个问题,您可以通过多种方式配置应用程序以与rabbitmq和redis服务通信。由于pod中的所有容器都具有相同的IP并共享相同的端口名称空间,因此可以将其他两个服务配置为在本地主机和这两个服务的标准端口上进行对话。但是,如果您决定将这两个服务公开给集群网络中的其他服务,您仍然可以通过使用pod ip和启动这两个服务的端口来实现

如果您想在集群网络之外公开这两个服务,那么必须通过类型为的方式公开


希望这会有所帮助。

是的,您需要三个docker映像,分别用于应用程序堆栈的每个组件—应用程序、redis和rabbitmq。此外,将所有这些组件放在一个吊舱中也是一个好主意。微服务通常需要侧车才能充分发挥作用,而库伯内特斯吊舱的存在正是为了满足这一需求

但请注意docker容器本质上是无状态的。因此,如果kubernetes决定将您的pod移动到其他节点,那么运行您的服务的容器将被销毁,并将在其他节点上重新创建。由这三个组件中的任何一个写入容器内部的本地文件系统的所有数据都会在该过程中丢失。如果你意识到这一点,并且你已经将你的应用程序设计成无状态,那么你应该没事了。如果没有,请在kubernetes中探索,以便在移动吊舱时保持吊舱的状态。您可以找到有关配置pod以使用持久卷的更多信息

要回答第二个问题,您可以通过多种方式配置应用程序以与rabbitmq和redis服务通信。由于pod中的所有容器都具有相同的IP并共享相同的端口名称空间,因此可以将其他两个服务配置为在本地主机和这两个服务的标准端口上进行对话。但是,如果您决定将这两个服务公开给集群网络中的其他服务,您仍然可以通过使用pod ip和启动这两个服务的端口来实现

如果您想在集群网络之外公开这两个服务,那么必须通过类型为的方式公开


希望这会有所帮助。

是否将所有三项服务放在一个Pod中取决于您将如何扩展应用程序

例如,如果您想运行Java应用程序的第二个实例,每个应用程序实例会使用它的“私有”RabbitMQ和Redis(一体机Pod可以),还是实例会共享RabbitMQ和/或Redis

一旦一个组件在多个实例之间共享,它就应该在自己的Pod中运行,并通过服务公开(在名称空间中)


最后:如果您不知道应用程序将来是否需要扩展,请计划在第0天进行扩展(这比以后重做更容易)。

是否将所有三项服务放在一个Pod中取决于您如何扩展应用程序

例如,如果您想运行Java应用程序的第二个实例,每个应用程序实例会使用它的“私有”RabbitMQ和Redis(一体机Pod可以),还是实例会共享RabbitMQ和/或Redis

一旦一个组件在多个实例之间共享,它就应该在自己的Pod中运行,并通过服务公开(在名称空间中)


最后:如果您不知道应用程序将来是否需要扩展,请计划在第0天进行扩展(这比以后重做更容易)。

Swarup,因此如果我没有弄错,我可以在创建部署时将$RABBITMQ_HOSTNAME之类的内容放入环境变量中,在foobar.conf文件中引用这些变量?是的。您应该在容器定义下的pod规范中设置环境变量。Tnx,Swarup:)!Swarup,所以如果我没有弄错的话,我可以在创建部署时将$RABBITMQ_HOSTNAME之类的东西放在环境变量中,然后在foobar.conf文件中引用这些变量?是的。您应该在pod规范中的c下设置环境变量