Kubernetes 有没有办法不使用GKE';s标准负载平衡器?
我尝试使用Kubernetes来明确定义配置和部署,我也喜欢Kubernetes的pod调度机制。目前只有2个应用程序在3个节点上的2个副本上运行。但是谷歌的Kubernetes引擎的负载平衡器对于像我们这样的小应用来说是非常昂贵的(至少目前如此),同时我不愿意改变为在容器上的单个实例托管解决方案或在Docker swarm上部署应用程序等 使用node的IP似乎是一种黑客行为,我认为这可能会暴露集群内部的一些安全问题。因此,我配置了一个Træfik ingress和一个ingress控制器来克服Google昂贵的负载平衡固定速率,但结果是一个外向的ingress启动了一个标准的负载平衡器,或者我缺少了一些东西 我希望我错过了一些东西,因为按照这个价格(每月16美元),我无法合理地使用这个应用程序启动时的kubernetesKubernetes 有没有办法不使用GKE';s标准负载平衡器?,kubernetes,google-compute-engine,traefik,Kubernetes,Google Compute Engine,Traefik,我尝试使用Kubernetes来明确定义配置和部署,我也喜欢Kubernetes的pod调度机制。目前只有2个应用程序在3个节点上的2个副本上运行。但是谷歌的Kubernetes引擎的负载平衡器对于像我们这样的小应用来说是非常昂贵的(至少目前如此),同时我不愿意改变为在容器上的单个实例托管解决方案或在Docker swarm上部署应用程序等 使用node的IP似乎是一种黑客行为,我认为这可能会暴露集群内部的一些安全问题。因此,我配置了一个Træfik ingress和一个ingress控制器来克
有没有一种方法可以不使用Google的负载平衡器而使用GKE?您可以使用
NodePort
模式(例如,如果使用setcontroller.service.type
toNodePort
)部署nginx ingress控制器,然后使用DNS在实例之间进行负载平衡。只需确保节点具有静态IP,或者甚至可以创建一个守护程序集
,以某种方式使用每个节点的IP更新DNS
Traefik似乎支持类似的配置(例如通过its中的
serviceType
。一个选项是在GKE集群上完全禁用此功能。在加载项下创建集群(在console.cloud.google.com上)时,禁用HTTP负载平衡。如果您使用的是gcloud
,您可以使用gcloud测试版容器集群创建--禁用addons=httploadbalancement
或者,您也可以通过向入口资源添加注释来禁用GCP负载平衡器,kubernetes.io/ingres.class=somerandomstring
对于新创建的入口,您可以将其放入yaml文档中:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: somerandomstring
...
如果你想对所有的入口都这样做,你可以使用这个示例片段(小心!)
现在,使用Ingresses对Kubernetes非常有用,因此我建议您签出,并在部署后相应地注释您的Ingresses。如果您将Ingress类指定为Ingress对象上的注释
kubernetes.io/ingress.class: traefik
Traefik将接收它,而Google负载平衡器将忽略它。还有。入口只是一组规则,告诉集群如何路由到您的服务,
服务
是另一组规则,可以根据选择器在一组POD之间实现负载平衡。服务可以使用3种不同的路由类型:
-这为服务提供了一个IP,该IP仅在路由到POD的集群内可用ClusterIP
-这将创建一个ClusterIP,然后在群集中的每个节点上创建一个外部可访问的端口。到这些端口的流量将路由到内部服务IP,然后再路由到PODNodePort
-这将创建一个ClusterIP,然后创建一个节点端口,然后从提供程序(如GKE上可用)提供一个负载平衡器。流量先到达负载平衡器,然后是其中一个节点上的端口,然后是内部IP,最后是podLoadBalancer
服务来实现这一点,而必须在部署中直接指定端口。使用hostPort
设置将容器直接绑定到节点上的端口80:
containers:
- name: yourapp
image: yourimage
ports:
- name: http
containerPort: 80
hostPort: 80 ### this will bind to port 80 on the actual node
这可能适用于您,并将流量直接路由到容器,而无需任何负载平衡,但如果节点出现问题或应用程序停止在节点上运行,则该应用程序将不可用
如果您仍然需要负载平衡,那么您可以通过主机端口
公开Nginx(或任何其他代理)运行守护程序集
(以便它在每个节点上都可用),然后它将路由到您的内部服务。使用标准的nginx-ingres
软件包可以轻松运行此功能,但不要为其创建负载平衡器服务,而是使用hostPort
设置。可以为此配置舵图:
我可以用静态ip绑定入口吗?这取决于所使用的入口控制器。对于GCP负载平衡器,是的。我想在这个问题上不太清楚,说GKE的标准负载平衡器是指GCP负载平衡器。我试图以某种方式从系统中删除GCP负载平衡器,并绑定到一个静态ip。NodePort将为我提供一个大于3000的端口,我需要在该静态ip上绑定端口80。啊,好的,然后,您可以尝试主机端口-在nginx helm图表集controller.daemonset.usehostport中,这是否完全跳过了负载平衡规则的创建?本质上OP不想为云负载平衡收费是的,它应该跳过整个Google LB创建过程,包括规则。本质上,它的实现方式是在GKE集群中运行一个Google LB控制器(简称glbc),它监视具有正确的ingres.class
注释值的入口。对于不满足此条件的入口,glbc将完全跳过它们,而不会伸出t
containers:
- name: yourapp
image: yourimage
ports:
- name: http
containerPort: 80
hostPort: 80 ### this will bind to port 80 on the actual node