gke nginx ingress 创建额外的负载均衡器
gke nginx ingress create additional load balancer
我有一组服务想公开为入口负载均衡器。我 select nginx 是入口,因为它能够强制 http 到 https 重定向。
具有类似
的入口配置
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: api-https
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: true
nginx.ingress.kubernetes.io/force-ssl-redirect: true
nginx.org/ssl-services: "api,spa"
kubernetes.io/ingress.class: nginx
spec:
tls:
- hosts:
- api.some.com
- www.some.com
secretName: secret
rules:
- host: api.some.com
http:
paths:
- path: /
backend:
serviceName: api
servicePort: 8080
- host: www.some.com
http:
paths:
- path: /
backend:
serviceName: spa
servicePort: 8081
gke 创建了 nginx 入口负载均衡器,但也创建了另一个带有后端的负载均衡器,如果不是 nginx selected 但 gcp 作为入口。
下面的屏幕截图以红色显示了两个意外的 LB,以蓝色显示了两个 nginx 入口 LB,分别用于我们的 qa 和 prod env。
kubectl get services 的输出
xyz@cloudshell:~ (xyz)$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api NodePort 1.2.3.4 <none> 8080:32332/TCP,4433:31866/TCP 10d
nginx-ingress-controller LoadBalancer 1.2.6.9 12.13.14.15 80:32321/TCP,443:32514/TCP 2d
nginx-ingress-default-backend ClusterIP 1.2.7.10 <none> 80/TCP 2d
spa NodePort 1.2.8.11 <none> 8082:31847/TCP,4435:31116/TCP 6d
入口的 gcp gke 服务视图屏幕截图,信息错误
这是预期的吗?
我是否遗漏了任何配置来阻止创建这个额外的负载平衡器?
当您在 GKE 集群上创建部署时,您有两种公开它的可能性:
- 使用类型为 LoadBalancer 的服务并公开它 - 这将
创建一个 TCP 负载平衡器
- 将服务创建为 NodePort 或集群
IP 并将其公开为 Ingress - 这将创建 HTTP 负载平衡器
如果您可以在负载均衡器中看到它们,这意味着您可能已经创建了一个服务类型 LoadBalancer,然后将其暴露为 Ingress。您正在打开同一个部署,以便通过服务和 Ingress 从两个不同的 IP 进行访问。要确认此尝试:
$ kubectl get ingress
$ kubectl get svc
您将从这 2 个命令中获得 2 个 ips,并且它们都会向您显示相同的页面。
配置它的更好方法是拥有服务类型 NodePort,并将该服务公开为入口。这特别有用,因为您可以使用同一个入口来公开更多服务。
通过这种方式,您可以节省暴露的 IP 数量(并且可以通过不使用多个负载均衡器来节省资金)。
在 GCP GKE 上,gcp 入口控制器默认启用,并且在任何入口定义中始终会导致新的 LB,即使指定了 .class。
https://github.com/kubernetes/ingress-nginx/issues/3703
所以要修复它,我们应该从集群中删除 gcp 入口控制器,如 https://github.com/kubernetes/ingress-gce/blob/master/docs/faq/gce.md#how-do-i-disable-the-gce-ingress-controller
中所述
我有一组服务想公开为入口负载均衡器。我 select nginx 是入口,因为它能够强制 http 到 https 重定向。
具有类似
的入口配置apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: api-https
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: true
nginx.ingress.kubernetes.io/force-ssl-redirect: true
nginx.org/ssl-services: "api,spa"
kubernetes.io/ingress.class: nginx
spec:
tls:
- hosts:
- api.some.com
- www.some.com
secretName: secret
rules:
- host: api.some.com
http:
paths:
- path: /
backend:
serviceName: api
servicePort: 8080
- host: www.some.com
http:
paths:
- path: /
backend:
serviceName: spa
servicePort: 8081
gke 创建了 nginx 入口负载均衡器,但也创建了另一个带有后端的负载均衡器,如果不是 nginx selected 但 gcp 作为入口。
下面的屏幕截图以红色显示了两个意外的 LB,以蓝色显示了两个 nginx 入口 LB,分别用于我们的 qa 和 prod env。
kubectl get services 的输出
xyz@cloudshell:~ (xyz)$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api NodePort 1.2.3.4 <none> 8080:32332/TCP,4433:31866/TCP 10d
nginx-ingress-controller LoadBalancer 1.2.6.9 12.13.14.15 80:32321/TCP,443:32514/TCP 2d
nginx-ingress-default-backend ClusterIP 1.2.7.10 <none> 80/TCP 2d
spa NodePort 1.2.8.11 <none> 8082:31847/TCP,4435:31116/TCP 6d
入口的 gcp gke 服务视图屏幕截图,信息错误
这是预期的吗?
我是否遗漏了任何配置来阻止创建这个额外的负载平衡器?
当您在 GKE 集群上创建部署时,您有两种公开它的可能性:
- 使用类型为 LoadBalancer 的服务并公开它 - 这将 创建一个 TCP 负载平衡器
- 将服务创建为 NodePort 或集群 IP 并将其公开为 Ingress - 这将创建 HTTP 负载平衡器
如果您可以在负载均衡器中看到它们,这意味着您可能已经创建了一个服务类型 LoadBalancer,然后将其暴露为 Ingress。您正在打开同一个部署,以便通过服务和 Ingress 从两个不同的 IP 进行访问。要确认此尝试:
$ kubectl get ingress
$ kubectl get svc
您将从这 2 个命令中获得 2 个 ips,并且它们都会向您显示相同的页面。
配置它的更好方法是拥有服务类型 NodePort,并将该服务公开为入口。这特别有用,因为您可以使用同一个入口来公开更多服务。
通过这种方式,您可以节省暴露的 IP 数量(并且可以通过不使用多个负载均衡器来节省资金)。
在 GCP GKE 上,gcp 入口控制器默认启用,并且在任何入口定义中始终会导致新的 LB,即使指定了 .class。
https://github.com/kubernetes/ingress-nginx/issues/3703
所以要修复它,我们应该从集群中删除 gcp 入口控制器,如 https://github.com/kubernetes/ingress-gce/blob/master/docs/faq/gce.md#how-do-i-disable-the-gce-ingress-controller
中所述