具体来说,当我遵循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,您会注意到:
ingress controller
的虚拟机的相同IP地址因此,没有多余的IP被“浪费”。基本上,您连接到入口 Controller ,该入口 Controller 根据入口资源的规范将流量重定向到不同的后端。
关于nginx - Nginx入口 Controller 如何在Kubernetes上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49703068/