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
也是。
现在所有来自互联网的请求都可以成功到达服务器。
我有一个入口定义为:
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
也是。
现在所有来自互联网的请求都可以成功到达服务器。