我正在尝试使用Kubernetes进行显式定义的配置和部署,我也喜欢Kubernetes的pod调度机制。(目前)只有2个应用程序在3个节点上的2个副本上运行。但Google的Kubernetes引擎的负载均衡器对于像我们这样的小应用程序来说是非常昂贵的(至少目前是这样),同时我不愿意改变为在容器上托管解决方案或在Docker swarm上部署应用程序的单个实例。
使用节点的IP似乎是一种黑客行为,我认为这可能会暴露集群内部的一些安全问题。因此,我配置了一个Tréfik入口和一个入口控制器,以克服Google昂贵的负载均衡统一费率,但事实证明,面向外的入口会启动一个标准负载均衡器,否则我会错过一些东西。
我希望我错过了一些东西,因为在这个速度(16美元一个月),我不能合理地使用kubernetes从启动这个应用程序。
有没有办法不用Google的负载均衡器就能使用GKE?
发布于 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:
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
发布于 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负载均衡器。
对于新创建的入口,您可以将其放入文档中:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: somerandomstring
...如果您想对所有的Ingresses执行此操作,您可以使用以下示例代码片段(请小心!):
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进行相应的注释。
发布于 2018-04-09 04:54:31
如果将Ingress类指定为Ingress对象上的批注
kubernetes.io/ingress.class: traefikTraefik将选择它,而Google负载均衡器将忽略它。还有a bit of Traefik documentation on this part。
https://stackoverflow.com/questions/49716618
复制相似问题