【问题标题】:GKE: ingres with sub-domainGKE:带有子域的ingres
【发布时间】:2021-07-28 16:21:58
【问题描述】:
我曾经使用部署在 AWS 中的 Openshift/OKD 集群,并且可以将集群连接到来自 Route53 的某个域名。然后,当我使用一些主机映射部署 ingress(并且在 ingres 中定义的主机是基础域的子域)时,所有必要的 lb 规则(Openshift 中的路由)和子域本身都是由 Openshift 创建的并且可以直接使用。例如:Openshift 连接到在 Route53 中注册的域“somedomain.com”。在入口中,我的主机映射如下:
hosts:
- host: sub1.somedomain.com
paths:
- path
部署后我可以访问 sub1.somedomain.com。 GKE 中是否提供这种功能?
到目前为止,我只看到映射到静态 IP。
另外我在这里https://cloud.google.com/kubernetes-engine/docs/how-to/ingress-http2 表示,如果我需要将服务与入口连接,该服务必须是 NodePort 类型。真的是这样吗?在 Openshift 中,不需要任何正常的 ClusterIP 服务可以连接到入口。
提前致谢!
【问题讨论】:
标签:
kubernetes
google-cloud-platform
google-kubernetes-engine
kubernetes-ingress
【解决方案1】:
我认为您应该为您的用例考虑其他 Ingress Controllers。
我不是 GKE 专家,但我可以看到Best practices for enterprise multi-tenancy 如下,
您还需要考虑如何通过通配符子域(如 OpenShift)路由多个 Ingress 主机名。
Set up HTTP(S) Load Balancing with Ingress
:
You can create and configure an HTTP(S) load balancer by creating a Kubernetes Ingress resource,
which defines how traffic reaches your Services and how the traffic is routed to your tenant's application.
By registering Services with the Ingress resource, the Services' naming convention becomes consistent,
showing a single ingress, such as tenanta.example.com and tenantb.example.com.
路由功能基本上取决于Ingress Controllers。
在我的发现中,GKE 的默认 Ingress Controller 只是创建了一个 Google Cloud HTTP(S) 负载均衡器,但它不像 OpenShift 那样默认考虑多租户。
相比之下,在 OpenShift 中,Ingress Controller 是使用具有动态配置功能的 HAProxy 实现的,如下所示。
LB -tenanta.example.com--> HAProxy(directly forward the tenanta.example.com traffic to the target pod IPs) ---> Target Pods
【解决方案2】:
服务展示的类型取决于每个云提供商的 K8S 实现。
- 如果入口控制器是集群内的一个组件,则 ClusterIP 足以让您的服务可访问(从集群内部内部)
- 如果入口定义配置了一个外部元素(如果是 GKE,则为负载平衡器),该元素不是集群的一部分,并且无法知道 ClusterIP(因为它只能在内部访问)。在这种情况下需要一个节点端口。
因此,在您的情况下,您可以在 NodePort 中公开您的服务,或者使用另一个本地安装在集群中的 Ingress 控制器配置 GKE,而不是默认使用这个。