java 应用程序中用于 kubernetes 服务的服务器配置

server configuration in java apps for services in kubernetes

我在几个 java 应用程序的配置设置方面遇到了问题。

我正在使用 minikube 版本:v0.21.0docker for mac.

我docker优化了所有应用程序,但应用程序之间的通信部分让我感到困扰。

因为我知道应用程序需要通过 server.url 选项一起通信(在 application.propertions 中 java)我不确定该怎么做。

主应用程序还有一个 angular 前端,我必须在其中定义两个服务器 java 应用程序的 url .

我知道 k8 中的应用程序通过 services 进行通信(使用它们的虚拟 IP),我为每个应用程序都这样做了。

但是在前端应用中(config.js)

angular.module('app').constant("CONFIG", {
      app1_server_URL: "http://app1:8080/app1/",
      app2_server_URL: "http://app2:8095/"
});

因此,当我到达前端页面时,当我尝试通过 chrome 控制台登录时,它会尝试转到 http://app1:8080/app1/,但说该应用程序不能'找不到?似乎是 DNS 解析找不到名为的服务 app1?是否解析 DNS(当我通过浏览器查看时)但它在集群外部寻找 http://app1:8080/app1/

如果我为我的所有应用程序提供如下所示的服务:

apiVersion: v1
kind: Service
metadata:
  name: app1
  labels:
    app: app1
spec:
  selector:
    app: app1
  ports:
  - protocol: TCP
    port: 8080
    name: http

我可以在 java 应用程序属性中写下 可以像这样到达 url 吗:

server.url=http://app1

我不确定我做错了什么,所以任何建议都会有所帮助。

谢谢, 汤姆

您的 angular 应用程序是前端应用程序。这意味着代码在用户的浏览器上执行。因此,从 angular 应用程序到 java 应用程序 的请求来自 Kubernetes 集群外部

但是您创建了一个 kubernetes Service 而没有指定 ServiceType,这将创建一个 ClusterIP 类型的 Service。这种服务不允许来自集群外部的请求,例如来自前端应用程序的请求。 您需要一种方法来允许来自集群外部的流量。有几种方法可以实现这一点,具体取决于您的需要。 NodePort 服务类型在静态端口的每个节点的 IP 上公开服务。

让我们假设您创建以下 Service

apiVersion: v1
kind: Service
metadata:
  name: app1
  labels:
    app: app1
spec:
  type: NodePort
  selector:
    app: app1
  ports:
  - protocol: TCP
    targetPort: 80 # Port exposed by Pods behind the Service
    port: 8080 # Port used when connecting from inside the cluster
    nodePort: 30140 # Port used when connecting from outside the cluster
    name: http

这样,您的 angular 应用程序可以将请求发送到 http://192.168.99.100:30140,或者任何您的 minikube ip 和任何已分配为 NodePort 的端口(本例中为 30140)。

除了 Services 之外,还有其他方法可以让流量进入集群,例如使用 Ingress 对象。