GKE 是不是支持带有静态 ip 的 nginx-ingress?

Posted

技术标签:

【中文标题】GKE 是不是支持带有静态 ip 的 nginx-ingress?【英文标题】:Does GKE support nginx-ingress with static ip?GKE 是否支持带有静态 ip 的 nginx-ingress? 【发布时间】:2018-07-23 15:30:13 【问题描述】:

我一直在使用 Google Cloud Load Balancer ingress。但是,我正在尝试在 GKE 中具有静态 IP 地址的节点中安装 nginxinc/kubernetes-ingress 控制器。

    我可以在同一个集群中使用 Google 的 Cloud Load Balancer 入口控制器吗? 我们如何将nginxinc/kubernetes-ingress 与静态 IP 结合使用?

谢谢

【问题讨论】:

【参考方案1】:

如果您使用 helm 部署 nginx-ingress。

首先创建一个静态 IP 地址。在 google 中,网络负载均衡器 (NLB) 仅支持区域静态 IP:

gcloud compute addresses create my-static-ip-address --region us-east4

然后以 ip 地址作为 loadBalancerIP 参数安装 nginx-helm

helm install --name nginx-ingress stable/nginx-ingress --namespace my-namespace --set controller.service.loadBalancerIP=35.186.172.1

【讨论】:

不错!如果您还需要保护您的 nginx,则此方法有效:添加 address_type = "INTERNAL" 并且您是金子 这与你在 ingress-controller.yml 上传递 --publish-service=$(POD_NAMESPACE)/my-static-ip 作为 arg 的 kubernetes 官方 git 示例有何不同? github.com/kubernetes/ingress-nginx/tree/master/docs/examples/… 这是一个很好的问题@AlxVallejo。您的链接提到使用“loadBalancerIP”将临时 IP 提升为静态 IP(“现在,即使服务被删除,IP 也会保留,因此您可以重新创建将 spec.loadBalancerIP 设置为 104.154.109.191 的服务”)。 使用 helm 3,运行以下命令:helm repo add stable https://kubernetes-charts.storage.googleapis.com/helm install --name nginx-ingress stable/nginx-ingress --namespace leep --set controller.service.loadBalancerIP=static-id【参考方案2】:

第一个问题

正如 Radek 'Goblin' Pieczonka 已经指出的那样,这样做是可能的。 关于此事,我只是想将您链接到official documentation:

如果您在单个集群中有多个 Ingress 控制器,您可以 通过指定 ingress.class 注释来选择一个,例如创建一个 带有注释的入口,如

metadata:
  name: foo
  annotations:
    kubernetes.io/ingress.class: "gce"

将针对 GCE 控制器,强制 nginx 控制器忽略 它,而像

这样的注释
metadata:
  name: foo
  annotations:
    kubernetes.io/ingress.class: "nginx"

第二个问题

由于您使用的是 Google Cloud Platform,我可以为您提供有关在 Google 中实现 Kubernetes 的更多详细信息。

考虑一下:

默认情况下,Kubernetes Engine 分配临时外部 IP 通过 Ingress 公开的 HTTP 应用程序的地址。

不过,您当然可以为入口资源使用静态 IP 地址, there is an official step to step guide 向您展示如何使用 Ingress 资源创建 HTTP 负载平衡并将其链接到静态 IP,或者如何将已使用的“临时” IP 提升为静态。

尝试通过它,如果您遇到一些问题,请更新问题并提出!

【讨论】:

太棒了,感谢详细的指点。我想我得到了第一个问题,我目前主要关心的是第二个问题。我尝试使用cloud.google.com/kubernetes-engine/docs/tutorials/…,它适用于 GKE 入口,但是当我尝试使用 nginx 时,它会获得一个临时 IP 地址。如果您可以为nginx-ingress 指出任何静态IP 引用,那就太好了。谢谢。 您是否也尝试过遵循步骤 5 的选项 1?我没有测试它,但它应该可以工作,因为它也出现在本指南github.com/kubernetes/ingress-nginx/tree/master/docs/examples/… @GalloCedrone 步骤 5 的选项 1 不是很有用,因为它不是声明性的。应该有一些方法来设置并忘记它。 第二部分不是所要求的,问题是关于 nginx-ingress 的静态 IP,而不是 gce ingress。【参考方案3】:

对于 nginx-ingress 控制器,您必须在服务上设置外部 IP:

spec:
  loadBalancerIP: "42.42.42.42"
  externalTrafficPolicy: "Local"

【讨论】:

我没有检查过nginx-ingress,这就是我要找的。让我检查它是否有效。非常感谢您的快速回复。如果你能在这方面提供一些参考,那就太好了。 这里有一些提示:github.com/kubernetes/ingress-nginx/blob/master/docs/examples/…kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/… “本地”设置的原因是什么?【参考方案4】:

在 kubernetes 中运行多个入口控制器是非常好的,但它们需要知道它们应该实例化哪些 Ingress 对象。这是通过一个特殊的注释来完成的,比如:

kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"

这表明这个入口预计将由 nginx 入口控制器提供,并且只能由 nginx 入口控制器提供。

至于IP,Some cloud providers allow the loadBalancerIP to be specified.可以控制服务的公网IP。

【讨论】:

感谢您的指点。我想我已经在注释中使用了它。如果您能指出任何有关 nginx-ingress 定义静态 IP 的资源,那就太好了。 定义 IP 的不是 nginx-ingress,这种支持完全超出了它的范围,这是通过 kubernetes 服务和支持 cloudprovider 管理 LB 配置来完成的 @Radek'Goblin'Pieczonka:你能提供一些链接吗,我正在尝试找到一种方法,当我通过 yaml 文件创建入口时为负载均衡器分配静态 IP ..跨度> @John:你找到解决这个问题的方法了吗?如果是的话,你能告诉我吗,我也在尝试在我的用例中实现同样的目标

以上是关于GKE 是不是支持带有静态 ip 的 nginx-ingress?的主要内容,如果未能解决你的问题,请参考以下文章

在 GKE 上更改我的 LoadBalancer 的 IP 地址

Docker 构建失败 - 带有 GKE 的 Gitlab CI。无法通过 tcp://localhost:2375 连接到 Docker 守护程序。 docker 守护进程是不是正在运行?

为公共 GKE 集群设置 Cloud NAT

如何在 GKE 中通过入口启用 Cors

带有 HTTPS 的 IP 给出“您的连接不是私有的”[Nginx/Ubuntu]

nginx