我的集群上正在运行示例应用程序。我有一个 webapp pod,其中包含三个容器。每个都作为单独的 springboot web 服务运行。员工、测试 1 和测试 2。暴露此问题的服务如下所示
api版本:v1
种类: 服务
元数据:
标签:
名称: 网络应用程序
名称: 网络应用服务
规范:
端口:
- 端口:8080
节点端口:30062
类型:节点端口
选择器:
名称:web应用
pod 规范如下 - 已更新以具有完整的上下文
apiVersion: v1
kind: Pod
metadata:
name: webapp
labels:
name: webapp
spec:
containers:
-
resources:
limits:
cpu: 0.5
image: kube/employee
imagePullPolicy: IfNotPresent
name: wsemp
ports:
- containerPort: 8080
name: wsemp
-
resources:
limits:
cpu: 0.5
image: kube/test1
imagePullPolicy: IfNotPresent
name: wstest1
ports:
- containerPort: 8081
name: wstest1
imagePullSecrets:
- name: myregistrykey
我的假设是 Web 服务在节点上的 30062 上运行,并且根据映射,我将能够访问该 Web 服务。例如http://11.168.24.221:30062/employee和 http://11.168.24.221:30062/test1/
将日志与下面的员工容器和 test1 容器分开。
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/employee],methods=[GET]}" onto public java.util.List<employee.model.Employee> employee.controller.EmployeeController.getAll()
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/test1/],methods=[GET]}" onto public java.util.List<model.Test1> test1.controller.Test1Controller.getAll()
问题是 http://11.168.24.221:30062/employee正确访问网络服务。但是当我点击http://11.168.24.221:30062/test1/时,它说 test1/mapping 在日志中不可用,但映射显然可用。错误消息是 Whitelabel Error Page/。此应用程序没有/error 的显式映射,因此您将其视为后备。
我做错了什么吗?
最佳答案
您的服务 yaml 清楚地表明您仅将端口 8080 公开为 NodePort 30062。可以简单地向现有配置添加另一个 -port:8081 nodePort:30063
,但是 - 由于您的两个服务是独立的容器,无论如何,您可能更喜欢在 Kubernetes 中创建两个独立的部署和服务。一个用于员工,一个用于您的 test1 服务。这将允许您单独开发、部署和测试它们。通常不建议在一个 POD 中使用多个容器(有一些异常(exception)) - 请参阅 this .
这是服务的两个 yaml。请注意,我更改了名称、标签和选择器。
apiVersion: v1
kind: Service
metadata:
labels:
name: employeeservice
name: employeeservice
spec:
ports:
- port: 8080
nodePort: 30062
type: NodePort
selector:
app: employeeservice
<小时/>
apiVersion: v1
kind: Service
metadata:
labels:
name: test1service
name: test1service
spec:
ports:
- port: 8081
nodePort: 30063
type: NodePort
selector:
app: test1service
您根本没有使用部署,但不建议这样做,并且您不会从 kubernetes self 修复功能中受益,例如当 Pod 变得不健康时,它们会被自动替换。
创建部署是 easy 。以下是两个用于部署的 yaml,其中包含您的 POD 规范。请注意,我更改了名称以匹配上述服务中的选择器。我已将副本数设置为 1,因此每次部署仅维护一个 POD,但您可以通过将其设置为更高的数字来轻松扩展它。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: employeeservice-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: employeeservice
spec:
containers:
-resources:
limits:
cpu: 0.5
image: kube/employee
imagePullPolicy: IfNotPresent
name: wsemp
ports:
- containerPort: 8080
name: wsemp
imagePullSecrets:
- name: myregistrykey
<小时/>
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: test1service-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: test1service
spec:
containers:
-
resources:
limits:
cpu: 0.5
image: kube/test1
imagePullPolicy: IfNotPresent
name: wstest1
ports:
- containerPort: 8081
name: wstest1
imagePullSecrets:
- name: myregistrykey
另请注意,您的服务可通过 DNS 通过名称访问。 。因此,如果您使用上述 yaml,您应该能够从集群内的 http://employeeservice/employee
查询服务,而不是使用节点 IP 地址。对于从集群外部的访问,您可以使用指定的 NodePort,通常会通过某种路由到所有节点的负载均衡器来实现。
关于java - 在 Kubernetes 中为具有多个映射的 Java Web 服务公开 nodePort - 如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43764243/