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
镜像地址
registry.cn-hangzhou.aliyuncs.com/acs/aliyun-ingress-controller:v0.44.0.3-8e83e7dc6-aliyun
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx
helm fetch ingress-nginx/ingress-nginx
[root@master ~]# helm fetch ingress-nginx/ingress-nginx
[root@master ~]# ll
total 26464
-rw-------. 1 root root 1492 Jan 11 2020 anaconda-ks.cfg
-rw-r----- 1 root root 3599 Jul 24 08:39 config-sample.yaml
-rw-r--r-- 1 root root 24991 Jul 24 10:21 ingress-nginx-3.34.0.tgz
-rwxr-xr-x 1 1001 121 13668116 Jul 12 15:02 kk
drwxr-x--- 3 root root 69 Jul 24 09:33 kubekey
-rw-r----- 1 root root 13341858 Jul 24 08:26 kubekey-v1.1.1-linux-amd64.tar.gz
-rw-r--r-- 1 1001 121 22906 Jul 12 15:00 README.md
-rw-r--r-- 1 1001 121 22845 Jul 12 15:00 README_zh-CN.md
[root@master ~]# tar xf ingress-nginx-3.34.0.tgz
[root@master ~]# cd ingress-nginx/
[root@master ingress-nginx]# ls -l
total 68
-rw-r--r-- 1 root root 8550 Jun 22 19:38 CHANGELOG.md
-rw-r--r-- 1 root root 593 Jun 22 19:38 Chart.yaml
drwxr-x--- 2 root root 4096 Jul 24 10:22 ci
-rw-r--r-- 1 root root 61 Jun 22 19:38 OWNERS
-rw-r--r-- 1 root root 9881 Jun 22 19:38 README.md
drwxr-x--- 3 root root 4096 Jul 24 10:22 templates
-rw-r--r-- 1 root root 24579 Jun 22 19:38 values.yaml
[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的域名解析。
因此具体使用哪种部署方式,需要根据实际情况和需求进行选择
阿里云 容器服务Kubernetes版
https://help.aliyun.com/document_detail/160658.html
通过Ingress实现灰度发布和蓝绿发布