首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法不使用GKE的标准负载均衡器?

有没有办法不使用GKE的标准负载均衡器?
EN

Stack Overflow用户
提问于 2018-04-08 17:53:57
回答 4查看 3.5K关注 0票数 13

我正在尝试使用Kubernetes进行显式定义的配置和部署,我也喜欢Kubernetes的pod调度机制。(目前)只有2个应用程序在3个节点上的2个副本上运行。但Google的Kubernetes引擎的负载均衡器对于像我们这样的小应用程序来说是非常昂贵的(至少目前是这样),同时我不愿意改变为在容器上托管解决方案或在Docker swarm上部署应用程序的单个实例。

使用节点的IP似乎是一种黑客行为,我认为这可能会暴露集群内部的一些安全问题。因此,我配置了一个Tréfik入口和一个入口控制器,以克服Google昂贵的负载均衡统一费率,但事实证明,面向外的入口会启动一个标准负载均衡器,否则我会错过一些东西。

我希望我错过了一些东西,因为在这个速度(16美元一个月),我不能合理地使用kubernetes从启动这个应用程序。

有没有办法不用Google的负载均衡器就能使用GKE?

EN

回答 4

Stack Overflow用户

发布于 2019-01-22 05:05:13

Ingress只是告诉集群如何路由到您的服务的一组规则,而Service是根据选择器跨一组pod进行访问和负载平衡的另一组规则。服务可以使用3种不同的路由类型:

  • ClusterIP -这为服务提供了一个仅在集群内可用的IP,该IP路由到pods.
  • NodePort -这将创建一个ClusterIP,然后在集群中的每个节点上创建一个外部可达的端口。到这些端口路由到内部服务IP,然后到pods.
  • LoadBalancer -这将创建一个ClusterIP,然后是一个NodePort,然后从提供者处提供负载均衡器(如果可用,就像在GKE上一样)。流量到达负载均衡器,然后是其中一个节点上的端口,然后是内部IP,最后是pod。

这些不同类型的服务并不是相互排斥的,而是实际上是建立在彼此之上的,这也解释了为什么任何公共服务都必须使用NodePort。想想看--否则流量如何到达你的集群?负载均衡器只是将请求定向到您的节点,并指向其中一个NodePort端口。如果您不需要GKE负载均衡器,那么您可以跳过它,直接访问这些端口。

缺点是端口限制在30000-32767之间。如果您需要标准的HTTP80/443端口,那么您不能使用Service来实现这一点,而必须直接在Deployment中指定端口。使用hostPort设置将容器直接绑定到节点上的端口80:

代码语言:javascript
复制
containers:
  - name: yourapp
    image: yourimage
    ports:
      - name: http
        containerPort: 80
        hostPort: 80 ### this will bind to port 80 on the actual node

这可能对您有效,并将流量直接路由到容器,而不进行任何负载平衡,但如果节点出现问题或应用程序停止在节点上运行,则该节点将不可用。

如果你仍然想要负载均衡,那么你可以使用通过hostPort公开的Nginx (或任何其他代理)运行一个DaemonSet (这样它在每个节点上都可用),然后它将路由到你的内部服务。一种简单的运行方法是使用标准的nginx-ingress包,但是跳过为它创建LoadBalancer服务,而使用hostPort设置。可以为此配置Helm图表:

https://github.com/helm/charts/tree/master/stable/nginx-ingress

票数 7
EN

Stack Overflow用户

发布于 2018-04-09 04:46:20

一种选择是在您的GKE集群上完全禁用此功能。在Add-ons下创建集群(在console.cloud.google.com上)时,请禁用HTTP load balancing。如果你使用的是gcloud,你可以使用gcloud beta container clusters create ... --disable-addons=HttpLoadBalancing

或者,您也可以通过向入口资源、kubernetes.io/ingress.class=somerandomstring添加注释来抑制GCP负载均衡器。

对于新创建的入口,您可以将其放入文档中:

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: somerandomstring
...

如果您想对所有的Ingresses执行此操作,您可以使用以下示例代码片段(请小心!):

代码语言:javascript
复制
kubectl get ingress --all-namespaces \
  -o jsonpath='{range .items[*]}{"kubectl annotate ingress -n "}{.metadata.namespace}{" "}{.metadata.name}{" kubernetes.io/ingress.class=somerandomstring\n"}{end}' \
  | sh -x

现在在Kubernetes中使用Ingresses非常有用,所以我建议您查看nginx ingress controller并在部署后对Ingresses进行相应的注释。

票数 4
EN

Stack Overflow用户

发布于 2018-04-09 04:54:31

如果将Ingress类指定为Ingress对象上的批注

代码语言:javascript
复制
kubernetes.io/ingress.class: traefik

Traefik将选择它,而Google负载均衡器将忽略它。还有a bit of Traefik documentation on this part

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49716618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档