首页 文章

带路由的GCE入口总是回退到default-http-backend

提问于
浏览
8

Kubernetes版本:1.4.5

我有一个非常简单的服务 type: NodePort . 它只返回 /info 上的一些文本 . 我使用默认的GKE入口控制器(L7 Google负载均衡器)和TLS . 如果我使用以下入口,一切都按预期工作:

工作入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: global-ingress
  namespace: global
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: tls-secret
  backend:
    serviceName: gate-front
    servicePort: 80

curl -k https://130.211.39.140/info
POD: gate-front-1871107570-ue07p
IP: 10.0.2.26
REQ: /info

$ kubectl describe ing
Name:           global-ingress
Namespace:      global
Address:        130.211.39.140
Default backend:    gate-front:80 (10.0.2.25:8080,10.0.2.26:8080)
TLS:
  tls-secret terminates
Rules:
  Host  Path    Backends
  ----  ----    --------
  * *   gate-front:80 (10.0.2.25:8080,10.0.2.26:8080)
Annotations:
  backends:         {"k8s-be-31966--f3f0bf21d171a625":"HEALTHY"}
  https-forwarding-rule:    k8s-fws-global-global-ingress--f3f0bf21d171a625
  https-target-proxy:       k8s-tps-global-global-ingress--f3f0bf21d171a625
  url-map:          k8s-um-global-global-ingress--f3f0bf21d171a625

破碎的入口

但是,如果我引入规则并省略默认后端,则所有请求都返回 default backend - 404 .

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: global-ingress
  namespace: global
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: tls-secret
  rules:
  - http:
      paths:
      - path: /gate
        backend:
          serviceName: gate-front
          servicePort: 80

curl -k https://130.211.33.150/gate/info
default backend - 404

$ kubectl describe ing
Name:           global-ingress
Namespace:      global
Address:        130.211.33.150
Default backend:    default-http-backend:80 (10.0.2.3:8080)
TLS:
  tls-secret terminates
Rules:
  Host  Path    Backends
  ----  ----    --------
  *
        /gate   gate-front:80 (<none>)
Annotations:
  https-forwarding-rule:    k8s-fws-global-global2-ingress--f3f0bf21d171a625
  https-target-proxy:       k8s-tps-global-global2-ingress--f3f0bf21d171a625
  url-map:          k8s-um-global-global2-ingress--f3f0bf21d171a625
  backends:         {"k8s-be-31966--f3f0bf21d171a625":"HEALTHY","k8s-be-32552--f3f0bf21d171a625":"HEALTHY"}

如果我添加主机并使用 curl -k --resolve ... ,我会得到相同的行为 .

我浏览了以下文档和示例:

任何人都可以对此有所了解吗?

2 回答

  • -1

    https://github.com/kubernetes/ingress-gce/blob/master/README.md#paths

    您是否可以查看此部分并评论是否可以解决问题:

    注意刚刚发生的事情, endpoints 暴露/主机名,负载均衡器将整个匹配的URL转发到 endpoints . 这意味着如果您在Ingress中有'/ foo'并尝试访问/ hostname,您的 endpoints 将收到/ foo / hostname,而不知道如何路由它 . 现在更新Ingress以通过/ fs endpoints 访问静态内容:

  • 2

    我有一个类似的问题有不同的原因,如果你使用GCE只记得每个入口控制器获得一个新的IP .

    我已将DNS指向我制作的第一个入口控制器,并且不知道新的入口控制器获得了新的IP . 来自错误主机的流量被发送到我的第一个入口控制器,因此404响应是正确的 .

    通过使用kubectl检查入口控制器,确保正确指出DNS:

    kubectl describe ingress/<name>
    

相关问题