入口无法解析GKE中的NodePort IP

时间:2019-01-31 13:58:54

标签: kubernetes google-kubernetes-engine kubernetes-ingress

我的入口定义为:

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已成功选择服务于其后面的两个吊舱。我在GKE服务列表中看到nodeport具有一个内部IP。

当我在同一界面中检查ingress时,它看起来也不错,但提供零豆荚。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

似乎路径中的通配符为not supported yet。 有什么理由不只在您的情况下使用以下内容?

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

答案 1 :(得分:1)

我的错误是,按预期方式,没有完全阅读文档。

Ingress路径中声明的端口不是一种“转发”机制,而是一种“过滤”机制。在我看来,将http(s)流量重定向到端口8080是有道理的,该端口是后面的Service监听的端口,后面是Pod也是服务。

现实情况是,它不会将非端口8080的流量路由到该服务。为了使它更整洁,我将Ingress中的端口从8080更改为80,并将Service中的端口从8080更改为{{1 }}。

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