nginx - Nginx入口 Controller 如何在Kubernetes上工作?

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

具体来说,当我遵循Google网站上的directions在GKE上设置nginx入口时,为什么要以两个外部IP地址结尾?

这两个IP地址分别用于类型为LoadBalancer的Ingress资源和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 Controller 。

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

最佳答案

我不太了解您的问题,我相信您对入口资源有些困惑。

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

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 -对应于转发规则,因此它是您将在Load Balancer页面
  • 中看到的IP
  • external-ip-TWO -对应于运行POD ingress controller的虚拟机的相同IP地址

  • 因此,没有多余的IP被“浪费”。基本上,您连接到入口 Controller ,该入口 Controller 根据入口资源的规范将流量重定向到不同的后端。

    关于nginx - Nginx入口 Controller 如何在Kubernetes上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49703068/

    相关文章:

    python-3.x - Google Cloud Storage get_blob 调用导致套接字连接失效

    nginx - Openresty/nginx ngx.say() 开始下载

    tomcat - 生产中的 Grails 3 Asset Pipeline 产生错误的 URL 和 404ing

    node.js - 哪个是在 ubuntu 16.04 中同时安装 Nginx 和 apache 的最佳方式

    nginx - 如何匹配Nginx中的所有位置以进行身份​​验证?

    Kubernetes 可以 telnet 进入 POD,但不能 curl 网页内容

    mongodb - MongoDB在kubernetes中不持久

    kubernetes - 有没有一种安全的方法可以在同一个 Kubernetes pod 中的另一个容器中触发命令?

    mysql - 如何从我的谷歌应用程序引擎标准项目连接到远程 mysql?

    google-cloud-platform - 为 GCP Cloud Build 专用池设置​​静态外部 IP 范围