java 应用程序中用于 kubernetes 服务的服务器配置
server configuration in java apps for services in kubernetes
我在几个 java 应用程序的配置设置方面遇到了问题。
我正在使用 minikube 版本:v0.21.0 和 docker 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
对象。
我在几个 java 应用程序的配置设置方面遇到了问题。
我正在使用 minikube 版本:v0.21.0 和 docker 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
对象。