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

int*_*ude 8 google-compute-engine kubernetes traefik

我正在尝试使用Kubernetes来明确定义配置和部署,我也喜欢Kubernetes的pod调度机制.(现在)只有2个应用程序在3个节点上的2个副本上运行.但是,谷歌的Kubernetes引擎的负载均衡是像在同一时间我们(至少暂时)一个小的应用程序,我不愿意改变托管容器上的解决方案或部署在码头工人的应用蜂拥而上等单个实例极其昂贵.

使用节点的IP似乎是一个黑客,我认为它可能会暴露集群内部的一些安全问题.因此,我配置了一个Træfik进入和入口控制器,以克服谷歌昂贵的负载平衡率,但结果是一个外向的入口旋转了一个标准负载平衡器,或者我遗漏了一些东西.

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

有没有办法在不使用Google的负载均衡器的情况下使用GKE?

Man*_*ham 6

AnIngress只是一组规则,告诉集群如何路由到您的服务,而 aService是另一组规则,用于根据选择器在一组 pod 之间实现负载平衡。一个服务可以使用 3 种不同的路由类型:

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

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

缺点是端口限制在 30000-32767 之间。如果您需要标准的 HTTP 端口 80/443,那么您不能使用 aService来完成此操作,而必须直接在您的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
Run Code Online (Sandbox Code Playgroud)

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

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

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


Jan*_*art 5

一种选择是在 GKE 集群上完全禁用此功能。创建集群时(在 console.cloud.google.com 上),在附加组件下禁用HTTP 负载平衡。如果您正在使用,gcloud则可以使用gcloud beta container clusters create ... --disable-addons=HttpLoadBalancing.

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

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

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: somerandomstring
...
Run Code Online (Sandbox Code Playgroud)

如果您想对所有 Ingress执行此操作,您可以使用此示例片段(小心!):

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
Run Code Online (Sandbox Code Playgroud)

现在,使用 Ingresses 对于 Kubernetes 非常有用,因此我建议您检查nginx 入口控制器,并在部署后,相应地注释您的 Ingresses。

  • 我想这个问题并不清楚,我所说的 GKE 标准负载均衡器指的是 GCP 负载均衡器。我正在尝试以某种方式从系统中删除 GCP 负载均衡器,并绑定到静态 IP。 (3认同)

eug*_*eug 0

您可以使用模式部署 nginx 入口控制器NodePort(例如,如果使用设置为 的helm 图表),然后使用 DNS 在实例之间进行负载平衡。只需确保您拥有节点的静态 IP,或者您甚至可以创建一个以某种方式使用每个节点的 IP 更新您的 DNS 的 IP。controller.service.typeNodePortDaemonSet

Traefik 似乎支持类似的配置(例如通过serviceTypeHelm Chart)。