Ingress 无法解析 GKE 中的 NodePort IP

Ingress cannot resolve NodePort IP in GKE

我有一个入口定义为:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: zaz-address
    kubernetes.io/ingress.allow-http: "false"
    ingress.gcp.kubernetes.io/pre-shared-cert: foo-bar-com

spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /zaz/*
        backend:
          serviceName: zaz-service
          servicePort: 8080

然后服务 zap-service 是一个 nodeport 定义为:

apiVersion: v1
kind: Service
metadata:
  name: zaz-service
  namespace: default
spec:
  clusterIP: 10.27.255.88
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 32455
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: zap
  sessionAffinity: None
  type: NodePort

nodeport 成功选择了它后面的两个 pods 为我服务。我可以在 GKE 服务列表中看到 nodeport 有一个看起来是内部的 IP。

当我在同一界面检查 ingress 时,它看起来也很好,但服务为零 pods。

另一方面,当我描述 ingress 时,我可以看到:

Rules:
  Host                                    Path  Backends
  ----                                    ----  --------
  foo.bar.com
                                          /zaz/*   zaz-service:8080 (<none>)

看起来 ingress 无法解析服务 IP。我在这里做错了什么?无法通过外部域名访问服务,报错404.

如何让入口将域名 zaz-service 转换为正确的 IP 以便它可以将流量重定向到那里?

路径中的通配符似乎是not supported yet。 为什么不在您的案例中仅使用以下内容?

spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /zaz
        backend:
          serviceName: zaz-service
          servicePort: 8080

不出所料,我的错误是没有仔细阅读文档。

Ingress 路径中指定的端口不是 "forwarding" 机制,而是 "filtering" 机制。在我看来,它将 http(s) 流量重定向到端口 8080 是有道理的,这是后面的 Service 正在监听的端口,而后面的 Pod服务也是。

现实情况是它不会将非端口 8080 的流量路由到该服务。为了使它更干净,我将 Ingress 中的端口从 8080 更改为 80,并在 Service 中将前置端口从 8080 更改为 80 也是。

现在所有来自互联网的请求都可以成功到达服务器。