https://bbs.huaweicloud.com/blogs/147036
Kubernetes NodePort vs Loadbalancer vs Ingress 在生产中如何选择?

Deployment+LoadBalancer模式的Service

如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向该地址,就实现了集群服务的对外暴露。

Deployment+NodePort模式的Service

同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。

DaemonSet+HostNetwork+nodeSelector

用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。比较适合大并发的生产环境使用。

https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

https://help.aliyun.com/document_detail/160658.html

镜像地址

  1. registry.cn-hangzhou.aliyuncs.com/acs/aliyun-ingress-controller:v0.44.0.3-8e83e7dc6-aliyun
  1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
  2. helm repo update
  3. helm install ingress-nginx ingress-nginx/ingress-nginx
  1. helm fetch ingress-nginx/ingress-nginx
  1. [root@master ~]# helm fetch ingress-nginx/ingress-nginx
  2. [root@master ~]# ll
  3. total 26464
  4. -rw-------. 1 root root 1492 Jan 11 2020 anaconda-ks.cfg
  5. -rw-r----- 1 root root 3599 Jul 24 08:39 config-sample.yaml
  6. -rw-r--r-- 1 root root 24991 Jul 24 10:21 ingress-nginx-3.34.0.tgz
  7. -rwxr-xr-x 1 1001 121 13668116 Jul 12 15:02 kk
  8. drwxr-x--- 3 root root 69 Jul 24 09:33 kubekey
  9. -rw-r----- 1 root root 13341858 Jul 24 08:26 kubekey-v1.1.1-linux-amd64.tar.gz
  10. -rw-r--r-- 1 1001 121 22906 Jul 12 15:00 README.md
  11. -rw-r--r-- 1 1001 121 22845 Jul 12 15:00 README_zh-CN.md
  12. [root@master ~]# tar xf ingress-nginx-3.34.0.tgz
  13. [root@master ~]# cd ingress-nginx/
  14. [root@master ingress-nginx]# ls -l
  15. total 68
  16. -rw-r--r-- 1 root root 8550 Jun 22 19:38 CHANGELOG.md
  17. -rw-r--r-- 1 root root 593 Jun 22 19:38 Chart.yaml
  18. drwxr-x--- 2 root root 4096 Jul 24 10:22 ci
  19. -rw-r--r-- 1 root root 61 Jun 22 19:38 OWNERS
  20. -rw-r--r-- 1 root root 9881 Jun 22 19:38 README.md
  21. drwxr-x--- 3 root root 4096 Jul 24 10:22 templates
  22. -rw-r--r-- 1 root root 24579 Jun 22 19:38 values.yaml
  23. [root@master ingress-nginx]#

https://www.qikqiak.com/k8strain2/network/ingress/nginx

kubectl create ns ingress-nginx
helm install --namespace ingress-nginx ingress-nginx ./ingress-nginx -f ./ingress-nginx/values-prod.yaml

https://www.cnblogs.com/xuxinkun/p/11052646.html

相比较起来,nodePort部署模式中需要部署的ingress-controller容器较少。一个集群可以部署几个就可以了。而hostNetwork模式需要在每个节点部署一个ingress-controller容器,因此总起来消耗资源较多。另外一个比较直观的区别,nodePort模式主要占用的是svc的nodePort端口。而hostNetwork则需要占用物理机的80和443端口。

从网络流转来说,通过nodePort访问时,该node节点不一定部署了ingress-controller容器。因此还需要iptables将其转发到部署有ingress-controller的节点上去,多了一层流转。

另外,通过nodePort访问时,nginx接收到的http请求中的source ip将会被转换为接受该请求的node节点的ip,而非真正的client端ip。

而使用hostNetwork的方式,ingress-controller将会使用的是物理机的DNS域名解析(即物理机的/etc/resolv.conf)。而无法使用内部的比如coredns的域名解析。

因此具体使用哪种部署方式,需要根据实际情况和需求进行选择

image.png
image.png
https://help.aliyun.com/document_detail/198892.html?spm=5176.21213303.J_6028563670.7.2c433eda2o9Q6V&scm=20140722.S_help%40%40%E6%96%87%E6%A1%A3%40%40198892.S_0.ID_198892-RL_ingress-OR_s%2Bhelpproduct-V_1-P0_0

image.png

阿里云 容器服务Kubernetes版
https://help.aliyun.com/document_detail/160658.html

通过Ingress实现灰度发布和蓝绿发布

灰度发布和蓝绿发布

流量复制

NodePort vs Loadbalancer vs Ingress 在生产中如何选择