当前位置: 首页 > 知识库问答 >
问题:

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

谢洛城
2023-03-14

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

使用节点的IP似乎是一种黑客行为,我认为这可能会暴露集群内部的一些安全问题。因此,我配置了一个Træfik ingress和一个ingress控制器来克服Google昂贵的负载平衡固定费率,但结果是一个外向的ingress启动了一个标准的负载平衡器,否则我就错过了一些东西。

我希望我错过了一些东西,因为以这样的价格(每月16美元),我无法合理地使用kubernetes来启动这个应用程序。

有没有一种方法可以不使用Google的负载平衡器而使用GKE?

共有3个答案

方璞
2023-03-14

如果将入口类指定为入口对象上的注释

kubernetes.io/ingress.class: traefik

Traefik将拾取它,而Google负载均衡器将忽略它。这部分还有一点Traefik留档。

丌官星渊
2023-03-14

一个选项是在GKE集群上完全禁用此功能。在Add-ons下创建集群时(在console.cloud.google.com上),禁用HTTP负载平衡。如果您使用的是gcloud,则可以使用gcloud beta容器群集创建--禁用加载项=HttpLoadBalancing。

或者,您也可以通过向入口资源添加注释来禁止GCP负载平衡器,kubernetes。io/入口。class=somerandomstring

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

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: somerandomstring
...

如果您想对所有入口都这样做,可以使用以下示例片段(小心!)

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非常有用,所以我建议您查看nginx入口控制器,并在部署后相应地注释入口。

蓟俊杰
2023-03-14

入口只是一组规则,用于告诉集群如何路由到您的服务,而服务是另一组规则,用于在一组pod中访问和负载平衡,基于选择器。服务可以使用3种不同的路由类型:

  • 群集IP—这为服务提供了一个IP,该IP仅在路由到POD的群集内部可用
  • 这将创建一个ClusterIP,然后在群集中的每个节点上创建一个外部可访问的端口。到这些端口的流量将路由到内部服务IP,然后再路由到POD
  • 负载平衡器(LoadBalancer)-这将创建一个ClusterIP,然后创建一个节点端口,然后从提供程序(如GKE上可用)提供负载平衡器。流量首先到达负载平衡器,然后到达其中一个节点上的端口,然后到达内部IP,最后到达pod

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

缺点是港口限制在30000-32767之间。如果您需要标准的HTTP端口80/443,那么您无法使用服务来实现这一点,而必须在部署中直接指定端口。使用主机端口设置将容器直接绑定到节点上的端口80:

containers:
  - name: yourapp
    image: yourimage
    ports:
      - name: http
        containerPort: 80
        hostPort: 80 ### this will bind to port 80 on the actual node

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

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

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

 类似资料:
  • 我在GKE上有两个kubernetes集群:一个是处理与外部世界交互的公共集群,另一个是仅供内部使用的私有集群。 公共集群需要访问私有集群上的一些服务,我已经通过内部负载平衡器向公共集群的pod公开了这些服务。目前,我正在为负载平衡器指定要使用的内部IP地址,并将这些IP传递给公共POD,但我更希望负载平衡器可以选择任何可用的内部IP地址,并且我可以将其DNS名称传递给公共POD。 内部负载均衡器

  • 通过GKE进入kubernetes,目前正在裸机上通过kubeadm进行尝试。 在以后的环境中,不需要任何特定的负载平衡器;通过使用nginx入口和入口,可以为www提供服务。 相反,在gke上,使用相同的nginx入口,或者使用gke提供的l7,最终总是得到一个计费负载平衡器。 这似乎不是最终需要的,原因是什么?

  • 有一个入口配置,比如 gke创建了nginx ingress负载平衡器,但也创建了另一个具有后端的负载平衡器,就像如果没有选择nginx,而是选择gcp作为ingress一样。 下面的屏幕截图以红色显示了两个意外的LB,蓝色显示了两个nginx ingress LB,分别用于我们的qa和prod env。 kubectl的输出获取服务 gcp gke服务视图中错误信息入口的屏幕截图 这是意料之中的

  • 这项技术的新手,因此请温柔一点。目标是使用mod_jk设置Tomcat负载平衡。我的设置如下(都在一台机器上): Win7 x64 Apache Httpd 2.2 Tomcat 6 mod_jk 1.2.37(用于httpd2.2.x)2个Tomcat实例(同一台机器) 我已正确设置Tomcat,可以通过localhost:8080和localhost:8081访问Web应用程序。但当我尝试通过

  • 所以我正在使用库伯内特斯作为一个辅助项目,它很棒。运行像我这样的小项目更便宜(一个3-5个实例的小集群基本上为我提供了大约30美元/月的GCP所需的一切)。 我唯一努力的领域是尝试使用kubernetes入口资源映射到集群并扇出到我的微服务(它们是小型Go或节点后端)。我有入口映射到不同服务的配置设置,没有问题。 我知道,在创建入口资源时,您可以很容易地让GCP启动负载平衡器。这很好,但这也意味着