Nginx 入口控制器如何在 Kubernetes 上工作?
How does an Nginx Ingress Controller work on Kubernetes?
具体来说,为什么我按照 Google 网站上的 directions 在 GKE 上设置 nginx ingress 时得到两个外部 IP 地址?
这两个 IP 地址用于 Ingress 资源和 LoadBalancer 类型的服务资源:
> 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(尽管它的名字)not 有一个外部 IP,因为我用注释
标记了它
annotations:
kubernetes.io/ingress.class: nginx
Google 应该将其识别为我不希望 Ingress 资源使用他们付费的 L7 HTTP 负载均衡器,而是使用我自己的 Nginx 控制器。
我确实注意到我的 /hello
页面可以通过负载均衡器的 IP 地址访问,但是访问入口地址会出现连接尝试被拒绝的错误。然而,Ingress 资源具有 host:
和 tls:
设置。那么我应该将我的 TLS 证书与哪个资源相关联呢?为什么Ingress资源是我网站可以访问的LoadBalancer IP,却指定了域名?
我不太明白你的问题,我相信你对入口资源有点困惑。
让我稍微解释一下,在你 运行 在教程中:
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 - 对应PODingress controller
所在虚拟机的IP相同运行宁
因此没有额外的 IP "wasted"。基本上,您连接到入口控制器,它根据入口资源的规范将流量重定向到不同的后端。
具体来说,为什么我按照 Google 网站上的 directions 在 GKE 上设置 nginx ingress 时得到两个外部 IP 地址?
这两个 IP 地址用于 Ingress 资源和 LoadBalancer 类型的服务资源:
> 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(尽管它的名字)not 有一个外部 IP,因为我用注释
标记了它annotations:
kubernetes.io/ingress.class: nginx
Google 应该将其识别为我不希望 Ingress 资源使用他们付费的 L7 HTTP 负载均衡器,而是使用我自己的 Nginx 控制器。
我确实注意到我的 /hello
页面可以通过负载均衡器的 IP 地址访问,但是访问入口地址会出现连接尝试被拒绝的错误。然而,Ingress 资源具有 host:
和 tls:
设置。那么我应该将我的 TLS 证书与哪个资源相关联呢?为什么Ingress资源是我网站可以访问的LoadBalancer IP,却指定了域名?
我不太明白你的问题,我相信你对入口资源有点困惑。
让我稍微解释一下,在你 运行 在教程中:
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 "wasted"。基本上,您连接到入口控制器,它根据入口资源的规范将流量重定向到不同的后端。