Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 有没有办法不使用GKE';s标准负载平衡器?_Kubernetes_Google Compute Engine_Traefik - Fatal编程技术网

Kubernetes 有没有办法不使用GKE';s标准负载平衡器?

Kubernetes 有没有办法不使用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控制器来克

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

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

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


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

您可以使用
NodePort
模式(例如,如果使用set
controller.service.type
to
NodePort
)部署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种不同的路由类型:

  • ClusterIP
    -这为服务提供了一个IP,该IP仅在路由到POD的集群内可用
  • NodePort
    -这将创建一个ClusterIP,然后在群集中的每个节点上创建一个外部可访问的端口。到这些端口的流量将路由到内部服务IP,然后再路由到POD
  • LoadBalancer
    -这将创建一个ClusterIP,然后创建一个节点端口,然后从提供程序(如GKE上可用)提供一个负载平衡器。流量先到达负载平衡器,然后是其中一个节点上的端口,然后是内部IP,最后是pod
这些不同类型的服务并不是相互排斥的,而是相互构建的,这解释了为什么任何公共服务都必须使用节点端口。想想看,否则流量将如何到达您的集群?云负载平衡器只是将请求定向到您的节点,并指向其中一个NodePort端口。如果您不想要GKE负载平衡器,那么您可以跳过它直接访问这些端口

缺点是端口限制在30000-32767之间。如果您需要标准HTTP端口80/443,那么您无法使用
服务来实现这一点,而必须在
部署中直接指定端口。使用
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