java - 在 Kubernetes 中为具有多个映射的 Java Web 服务公开 nodePort - 如何

标签 java web-services kubernetes

我的集群上正在运行示例应用程序。我有一个 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/employeehttp://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/

相关文章:

java - 滚动到 JFrame 的特定部分

java - Android Canvas 未更新

Java Arrays.asList(columnes).contains() 返回 false

kubernetes - K8s : how to install charts from the Helm Hub

docker - kube-apiserver docker持续重启

kubernetes - 如何将动态值传递给kubernetes容器

java - 使用java在mongo 3中查找嵌套值

java - Java 中的 Web 服务

web-services - 如何将Jasper REST API的输出更改为JSON而不是XML

asp.net - 如何从表单例份验证中排除 Web 服务