Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/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
Kubernetes Ingress负载均衡器将所有内容重写为索引;为什么?_Kubernetes_Gcp_Google Kubernetes Engine - Fatal编程技术网

Kubernetes Ingress负载均衡器将所有内容重写为索引;为什么?

Kubernetes Ingress负载均衡器将所有内容重写为索引;为什么?,kubernetes,gcp,google-kubernetes-engine,Kubernetes,Gcp,Google Kubernetes Engine,TL;DR出于某种原因,每个http服务似乎都将路径重写为/ 我是Kubernetes的新手,正在尝试建立一个入口负载平衡器 Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.6", GitCommit:"4bc5e7f9a6c25dc4c03d4d656f2cefd21540e28c", GitTreeState:"clean", BuildDate:"2017-09-14T06:55:55Z", GoVer

TL;DR出于某种原因,每个http服务似乎都将路径重写为
/

我是Kubernetes的新手,正在尝试建立一个入口负载平衡器

Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.6", GitCommit:"4bc5e7f9a6c25dc4c03d4d656f2cefd21540e28c", GitTreeState:"clean", BuildDate:"2017-09-14T06:55:55Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"7+", GitVersion:"v1.7.6-gke.1", GitCommit:"407dbfe965f3de06b332cc22d2eb1ca07fb4d3fb", GitTreeState:"clean", BuildDate:"2017-09-27T21:21:34Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
我正在谷歌容器引擎(GKE)中设置所有内容

它部分工作,这是一件好事。然而,出于某种原因,它将所有内容路由到我的服务,就好像请求指向
/

这里发生了什么事?我猜是糟糕的配置

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: main-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "ingress-main-ip"
spec:
  tls:
  - secretName: cert-main
    hosts:
    - api.example.com
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /my_service/*
        backend:
          serviceName: myService
          servicePort: main-port
      - path: /my_service2/*
        backend:
          serviceName: myService2
          servicePort: main-port
每当我向
api.example.com/my_service/
发出请求时,myService都会将请求注册为来自index——没问题

https://api.example.com/my_service2/
哪一个转到MyService 2

但是每当我请求
https://api.example.com/my_service/bogus/path/that/should/return/404
然后我的服务似乎认为请求又像以前一样指向了
/
路径

当然,当我在本地运行myService(这恰好是一个GoHTTP服务器)时,它工作得非常好要特别清楚:在本地运行这个
127.0.0.1/bogus/path/that/should/return/404
会像预期的那样返回404(当然其他API端点也会工作)

这里有一件非常奇怪的事情:每当我直接访问静态IP地址(也称为ingress main IP,我们就说它是1.2.3.4),例如
http://1.2.3.4/my_service/
http://1.2.3.4/my_service2/
它总是从GKE默认后端返回404,因此我的服务甚至不会被路由到

总结:

  • 为什么请求的域版本都路由到
    /
  • 为什么直接IP请求根本不起作用

  • 谢谢你的时间和帮助

    我将回答第二个问题

    非常奇怪的是,HTTP头“主机”很重要,因为您在规则部分指定了它:

    rules:
      - host: api.example.com           <----- THIS
        http:
          paths:
          - path: /my_service/*
            backend:
              serviceName: myService
              servicePort: main-port
          - path: /my_service2/*
            backend:
              serviceName: myService2
              servicePort: main-port
    
    规则:
    
    -主持人:api.example.com罗伯特对第二个问题的回答是对的(非常感谢)

    我刚刚解决了一个主要问题,为什么我所有的路径似乎都被重写为
    /

    事实证明,路径是用实际服务入口配置中指定的“路径”发送到服务器的。 因此,例如,当尝试对
    api.example.com/my_service/my_endpoint
    执行GET请求时,我希望
    my_service
    只获取路径
    /my_endpoint
    ,但实际上它获得了完整的
    /my_service/my_endpoint

    在我看来,这似乎是一个相当糟糕的kubernetes副作用,而这条路径实际上应该是一个相对重写

    无论如何,现在已经修好了。我“认为”它们都被简单地重写为
    /
    的原因是出于某种原因(我在代码中写入了逻辑错误),我的多路复用器捕获了每个未知的请求,并将其发送到我的索引控制器。算了吧