Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Kubernetes Ingress gce公开了两个基本的Sping引导服务_Spring Boot_Kubernetes_Google Kubernetes Engine_Gke Networking - Fatal编程技术网

Spring boot Kubernetes Ingress gce公开了两个基本的Sping引导服务

Spring boot Kubernetes Ingress gce公开了两个基本的Sping引导服务,spring-boot,kubernetes,google-kubernetes-engine,gke-networking,Spring Boot,Kubernetes,Google Kubernetes Engine,Gke Networking,我正在尝试部署两个非常基本的服务(Spring Boot),其入口必须根据路径重定向流量。非常基本的Ingress使用示例,但我无法理解为什么这个配置在几个小时之后无法工作 第一个控制器,暴露于端口8095: @RestController public class MainController { private Logger logger = LoggerFactory.getLogger(MainController.class); @GetMapping({"

我正在尝试部署两个非常基本的服务(Spring Boot),其入口必须根据路径重定向流量。非常基本的Ingress使用示例,但我无法理解为什么这个配置在几个小时之后无法工作

第一个控制器,暴露于端口8095:

@RestController
public class MainController {

    private Logger logger = LoggerFactory.getLogger(MainController.class);

    @GetMapping({"/", ""})
    public String getDefault(HttpServletRequest request) {
        logger.debug("URL: ", makeUrl(request));
        return "Root reached: " + makeUrl(request);
    }

    @GetMapping("/foo")
    public String getSubPath(HttpServletRequest request){
        logger.debug("URL: ", makeUrl(request));
        return "First sub path reached: " + makeUrl(request);
    }

    @GetMapping("/foo/test")
    public String getSubSubPath(HttpServletRequest request){
        logger.debug("URL: ", makeUrl(request));
        return "First sub sub path reached: " + makeUrl(request);
    }

    @GetMapping("/foo/health/check")
    public String getHealthCheck(HttpServletRequest request) {
        return "Health check passed: " + makeUrl(request);
    }

    private String makeUrl(HttpServletRequest request) {
        return request.getRequestURL().toString() + "?" + request.getQueryString();
    }

}
第二个控制器,暴露于端口8080:

@RestController
public class MainController {

    private Logger logger = LoggerFactory.getLogger(MainController.class);

    @GetMapping({"/bar/", "/bar"})
    public String getDefault(HttpServletRequest request) {
        logger.debug("URL: ", makeUrl(request));
        return "Root reached: " + makeUrl(request);
    }

    @GetMapping("/bar/test")
    public String getSubPath(HttpServletRequest request){
        logger.debug("URL: ", makeUrl(request));
        return "First sub path reached: " + makeUrl(request);
    }

    @GetMapping("/bar/test/subsubpath")
    public String getSubSubPath(HttpServletRequest request){
        logger.debug("URL: ", makeUrl(request));
        return "First sub sub path reached: " + makeUrl(request);
    }

    @GetMapping("/bar/health/check")
    public String getHealthCheck(HttpServletRequest request) {
        return "Health check 2 passed: " + makeUrl(request);
    }

    private String makeUrl(HttpServletRequest request) {
        return request.getRequestURL().toString() + "?" + request.getQueryString();
    }

}
正如我们所看到的,控制器的端点只是打印一些消息和URL,只是为了知道它们是从存在入口的集群外部到达的

kubernetes的部署文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prova1-deployment
spec:
  selector:
    matchLabels:
      app: deploy1
  replicas: 1
  template:
    metadata:
      labels:
        app: deploy1
    spec:
      imagePullSecrets:
        - name: gitlab-registry-prova
      containers:
        - name: prova1-deploy
          image: "registry.gitlab.com/giuxg97/reep/test1-deploy"
          ports:
            - containerPort: 8095
---
apiVersion: v1
kind: Service
metadata:
  name: prova1-service
spec:
  selector:
    app: deploy1
  ports:
    - protocol: TCP
      port: 60000
      targetPort: 8095
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prova2-deployment
spec:
  selector:
    matchLabels:
      app: deploy2
  replicas: 1
  template:
    metadata:
      labels:
        app: deploy2
    spec:
      imagePullSecrets:
        - name: gitlab-registry-prova
      containers:
        - name: prova2-deploy
          image: "registry.gitlab.com/giuxg97/reep/test2-deploy"
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: prova2-service
spec:
  selector:
    app: deploy2
  ports:
    - protocol: TCP
      port: 8090
      targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    # If the class annotation is not specified it defaults to "gce".
    kubernetes.io/ingress.class: "gce"
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prova1-service
                port:
                  number: 60000
          - path: /bar
            pathType: Prefix
            backend:
              service:
                name: prova2-service
                port:
                  number: 8090
这些图像是从我在gitlab上的私有容器注册表中获取的,它们的工作方式与我在部署后从pod的日志中看到的一样

现在的情况是:

  • 如果我转到IP_INGRESS/它会将我重定向到正确的页面,并显示“Root已到达:…”,但如果我转到IP_INGRESS/foo,我会收到错误“response 404(backend NotFound),路径的服务规则不存在”,这似乎是入口找不到路径时抛出的错误消息(即,如果我转到IP_入口/test1234,我会得到相同的错误)
  • 如果我转到IP_入口/bar,我会收到另一条错误消息“error:Server error 服务器遇到临时错误,无法完成您的请求。 请在30秒后重试。”并且pod没有新日志
因此,唯一的服务似乎是第一个,但在这种情况下,我看不到子路径,但我不知道为什么在阅读了更多的文档之后


希望您能帮助我!提前谢谢您,欢迎来到Stackoverflow

第一期-

入口定义创建了从{path}到{backend.serviceName}{path}的代理流量规则。 找不到路径的一个可能原因是/foo被代理到app service:60000/foo,但您打算在“/”根目录上提供流量

尝试将此批注添加到入口资源:

nginx.ingress.kubernetes.io/rewrite-target: /
资料来源:

如果这不能解决问题,那么问题很可能出现在spring框架中“/foo”和其他子路径的处理程序方法中

第二期-

使用Curl命令
(Curl-D--s-o/dev/null)
检查您是否能够在内部(不通过入口)使用后端上的节点ip访问特定的URL(在那里您得到错误的响应)

如果您无法在内部访问URL,那么问题应该再次在于spring框架中的映射配置

如果您能够在内部访问URL,请检查在部署文件中为kubernetes创建的服务。 您还可以尝试更改问题部署的部署端口和服务端口

有关GKE部署文件配置的详细说明,请参阅此处-