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

时间:2017-05-03 15:26:20

标签: java web-services kubernetes

我的群集上运行了示例应用。我有一个webapp pod,有三个容器。每个作为单独的springboot webservice运行。 employee,test1和test2。暴露于此的服务如下所示

apiVersion: v1 kind: Service metadata: labels: name: webapp name: webappservice spec: ports: - port: 8080 nodePort: 30062 type: NodePort selector: name: webapp

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

我的假设是webservice在节点上运行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的显式映射,因此您将此视为后备。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您的服务yaml清楚地表明您只将端口8080暴露为NodePort 30062.可以简单地将另一个-port:8081 nodePort:30063添加到您现有的配置中,但是 - 由于您的两个服务是单独的容器,您可能更喜欢在kubernetes中创建两个单独的部署和服务。一个用于员工,一个用于test1服务。这将允许您单独开发,部署和测试它们。并且通常不建议在POD中使用多个容器(有一些例外) - 请参阅this

以下是服务的两个yamls。请注意,我更改了名称,标签和选择器。

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自我修复能力中获益,例如:当豆荚变得不健康时,它们会自动被替换。

创建部署是easy。以下是两个包含POD规格的部署yamls。请注意,我更改了名称以匹配上述服务中的选择器。我已将副本计数设置为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按名称访问您的服务。因此,如果您使用上面的yamls,您应该能够在http://employeeservice/employee的集群内查询服务,而不是使用节点的IP地址。对于来自群集外部的访问,您可以按指定使用NodePorts,通常可以通过某种路由到所有节点的负载均衡器来实现。