在Kubernetes中向Java Webservices揭露Nodeports,并使用多个映射 - 方法



我的群集上有示例应用程序。我有一个WebApp Pod,它有三个容器。每个运行作为单独的Springboot Web服务。员工,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

我的假设是网络服务在节点上的30062上运行,并根据映射,我可以访问WebService。例如http://11.168.24.221:30062/employee and 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正确击中WebService。但是,当我击中http://11.168.24.221:30062/test1/时,它说test1/映射在日志中上述时不可用,显然,映射显然是avaialble的。错误消息是Whitelabel错误页面/。本应用程序没有明确的映射/错误,因此您将其视为后备。

我做错了什么?

您的服务yaml清楚地表明,您仅将端口8080公开为NodePort30062。可以简单地将另一个-port:8081 nodePort:30063添加到您现有的配置中,但是 - 由于您的两个服务无论如何都是独立的容器您可能更喜欢在Kubernetes中创建两个单独的部署和服务。一个用于员工,一个用于您的Test1服务。这将使您能够分别开发,部署和测试。通常不建议在POD中使用多个容器(有些例外( - 请参阅此。

这是服务的两个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自我康复能力,例如当豆荚变得不健康时会自动更换。

创建部署很容易。这是两个用于部署的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地址。对于从群集外部访问,您可以按指定使用nodeports,通常可以通过将所有节点路由的某种负载平衡器来执行此操作。

相关内容

  • 没有找到相关文章

最新更新