【问题标题】:How does an Nginx Ingress Controller work on Kubernetes?Nginx 入口控制器如何在 Kubernetes 上工作?
【发布时间】:2018-09-17 02:07:35
【问题描述】:

具体来说,为什么我在谷歌网站上关注directions在GKE上设置nginx入口时,会得到两个外部IP地址?

这两个 IP 地址分别用于 Ingress 资源和 LoadBalancer 类型的 Service 资源:

> kubectl get ingress
NAME            HOSTS                            ADDRESS        PORTS     AGE
nginx-ingress   example.com                      1.1.1.1        80, 443   1d
> kubectl get service
NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
hello-app                       ClusterIP      10.31.251.77    <none>          8080/TCP                     1d
kubernetes                      ClusterIP      10.31.240.1     <none>          443/TCP                      1d
nginx-ingress-controller        LoadBalancer   10.31.246.62    2.2.2.2         80:32603/TCP,443:31763/TCP   1d
nginx-ingress-default-backend   ClusterIP      10.31.241.48    <none>          80/TCP                       1d

这是我认为它的工作原理:

User
 ^
 |
Service resource of type LoadBalancer <-- Ingress annotated as class nginx
 ^
 |
Pod resource with Nginx acting as ingress controller
 ^
 |
Service resource of type ClusterIP
 ^
 |
Pod resource with server serving message at /hello

这基本上是我链接到的教程页面上的图表。所以我希望负载均衡器是 L4 类型并且有一个外部 IP (并且不花钱使用!)。而且我希望 Ingress(尽管它的名字)没有有一个外部 IP,因为我用注释标记它

annotations:
  kubernetes.io/ingress.class: nginx

Google 应该可以识别出我不希望 Ingress 资源使用他们付费的 L7 HTTP 负载均衡器,而是使用我自己的 Nginx 控制器。

我注意到我的/hello 页面可以通过负载平衡器的 IP 地址访问,但访问入口地址会导致连接尝试被拒绝错误。然而,它是具有 host: 和 tls: 设置的 Ingress 资源。那么我应该将我的 TLS 证书与哪个资源相关联?为什么 Ingress 资源是可以访问我的网站的 LoadBalancer IP 时指定一个域名?

【问题讨论】:

    标签: nginx kubernetes google-cloud-platform google-kubernetes-engine kubernetes-ingress


    【解决方案1】:

    我不太明白你的问题,我相信你对入口资源有点困惑。

    让我解释一下,在你在教程中运行之后:

    helm install --name nginx-ingress stable/nginx-ingress --set rbac.create=true
    kubectl apply -f ingress-resource.yaml
    

    你会遇到以下情况:

    $ kubectl get services
    NAME                            TYPE           CLUSTER-IP     EXTERNAL-IP         PORT(S)                      AGE
    nginx-ingress-controller        LoadBalancer   10.11.245.77   external-ip-ONE     80:32172/TCP,443:31908/TCP   12m
    
    $ kubectl get ingress
    NAME               HOSTS     ADDRESS           PORTS     AGE
    ingress-resource   *         external-ip-TWO   80        1m
    

    检查正在使用的外部IP你会注意到:

    • external-ip-ONE - 对应转发规则,因此它是您将在负载均衡器页面中看到的 IP

    • external-ip-TWO - 对应运行 POD ingress controller 的虚拟机的同一 IP

    因此不会“浪费”额外的 IP。基本上,您连接到入口控制器,该控制器根据入口资源的规范将流量重定向到不同的后端。

    【讨论】:

    • 谢谢!我的问题确实是为什么会有“浪费”的 IP。所以我的图表基本上是正确的,但正如你所指出的,IP 只是来自 VM。此外,我发现证书应该附加到 Ingress 资源。不知何故,它神奇地服务于 LoadBalancer 的 IP,而不是 Ingress 自己的 IP。当 Ingress 似乎只需要一个 ClusterIP 时,我仍然很困惑为什么 Ingress 有任何外部 IP(甚至是 VM),但你回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-07-22
    • 2018-10-29
    • 2021-09-27
    • 2020-04-09
    • 2020-12-05
    • 2020-04-24
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多