我有一个需要与kubernetes一起部署的java项目。 在研究了kubernetes一段时间之后,我有两个问题。
由于项目需要在java app,rabbitmq和redis旁边,显然这三件事需要有三个docker镜像。
1。)我可以将java app,rabbitmq和redis容器/图像放入单个pod中,还是应该放在separete pods中(我建议将它们放在同一个pod中)?
由于这是一个java应用程序(带有构建.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, 汤姆
答案 0 :(得分:1)
是的,对于应用程序堆栈的每个组件,您将需要三个docker镜像 - application,redis和rabbitmq。此外,最好将所有这些组件放在一个pod中。微服务通常需要侧车才能完全发挥作用,而Kubernetes吊舱只是为满足这种需求而存在。
但请注意,泊坞容器本质上是无国籍的。因此,如果kubernetes决定将您的pod移动到另一个节点,那么运行您的服务的容器将被销毁,并将在不同的节点上重新创建。由三个组件中的任何一个组件写入容器内的本地文件系统的所有数据都将在此过程中丢失。如果你知道这一点并且你已经将你的应用程序设计为无状态,那么你应该没问题。如果没有,请浏览kubernetes中的persistent volumes,以便在移动时保留其状态。您可以找到有关配置pod以使用持久卷here
的更多信息要回答您的第二个问题,您可以通过多种方式配置应用以与rabbitmq和redis服务进行通信。由于pod中的所有容器具有相同的IP并共享相同的端口命名空间,因此您可以逐字配置其他两个服务以在这两个服务的localhost和标准端口上进行通信。但是,如果您决定将这两个服务公开给群集网络中的其他服务,您仍然可以使用pod ip和启动这两个服务的端口来执行此操作。
如果您希望在群集网络之外公开这两项服务,则必须通过kubernetes services类型的NodePort进行此操作。
希望有所帮助。
答案 1 :(得分:1)
如果您将所有三项服务放在一个Pod中,取决于您如何扩展应用程序。
例如,如果您想运行Java应用程序的第二个实例,每个应用程序实例是否会使用它的“私有”RabbitMQ和Redis(一体化Pod就可以了),或实例是否共享RabbitMQ和/或Redis?
只要一个组件在多个实例之间共享,它就应该在一个自己的Pod中运行,并通过服务公开(在命名空间内)。
最后:如果您不知道应用程序将来是否需要扩展,请计划在第0天进行扩展(这比以后重做更容易)。