从网络流转来说,通过nodePort访问时,该node节点不一定部署了ingress-controller容器。因此还需要iptables将其转发到部署有ingress-controller的节点上去,多了一层流转。
另外,通过nodePort访问时,nginx接收到的http请求中的source ip将会被转换为接受该请求的node节点的ip,而非真正的client端ip。
而使用hostNetwork的方式,ingress-controller将会使用的是物理机的DNS域名解析(即物理机的/etc/resolv.conf)。而无法使用内部的比如coredns的域名解析。
因此具体使用哪种部署方式,需要根据实际情况和需求进行选择。
ingress controller试用在部署好ingress controller后,可以通过一个样例进行测试使用。首选创建一个应用容器和以及一个对应的svc。
kubectl run web --image=gcr.azk8s.cn/google-samples/hello-app:1.0 --port=8080 kubectl expose deployment web --target-port=8080然后创建ingress,将通过hello-world.info域名访问ingress的请求转发到该容器中去。
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: hello-world.info http: paths: - path: /* backend: serviceName: web servicePort: 8080这一切完成后,在/etc/hosts里绑定域名,127.0.0.1 hello-world.info。
sed -i '$a 127.0.0.1 hello-world.info' /etc/hosts然后通过curl命令进行测试。
root@i-5i2mhmaus9v67pz19zmahp07u:~# curl 127.0.0.1 <html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx/1.15.10</center> </body> </html> root@i-5i2mhmaus9v67pz19zmahp07u:~# curl hello-world.info Hello, world! Version: 1.0.0 Hostname: web-77f97c6cc7-g7qft这里可以看到,我们访问本地127.0.0.1的时候,会返回404错误。而访问绑定的域名,就可以正确导流了,返回正确结果。
参考资料ingress-nginx https://github.com/kubernetes/ingress-nginx
Bare-metal considerations https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/baremetal.md
https://github.com/kubernetes/ingress-nginx/blob/51ad0bc54b1475384b67bee9e8a8e41e26b18bc4/deploy