上一节中我们学习了Service以及对应的负载均衡,但是这些负载均衡都是基于IP和端口的四层负载均衡。那么如果想要实现七层负载均衡,也就是根据请求的内容来,有没有办法实现呢?这就需要用到本节即将学习的Ingress了。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
什么是Ingress
在k8s里,Ingress是一个可以允许集群外部访问集群内布服务的控制器。通过配置一条条规则(rules)来规定进来的连接被分配到后端的哪个服务。
Ingress相当于一个集中的路由中心,例如,可以将xiaofu.com/api/v1/
路由到后端的service-v1
服务,而将xiaofu.com/api/v2/
路由到service-v2
服务。
Ingress vs NodePort
同样是将集群内部的服务暴露给集群外,很有必要对比下Ingress和上一节学习的NodePort。
NodePort是Service的一个类型,并没有额外加入组件。其会在每个Node上开一个端口,对应到后端的Service。所有访问集群任意节点IP上该端口都可以访问到后端的Service。这样的优点就是简单快速,但是只是起了简单的Node端口到Service端口的映射功能,功能很单一。
Ingress是区别于上一节学的那些Service的另一个单独组件,可以被单独声明,创建和销毁。引入Ingress的好处就是有一个集中的路由配置项,同时可实现基于内容的七层负载均衡。小小的麻烦就是引入了额外组件,但是其实创建一个Ingress和创建一个k8s中的其他资源的步骤没什么两样。
Ingress的实现方式有很多,下面着重学习下官方推荐的基于Nginx的Ingress-Nginx控制器。
Ingress-Nginx
可以将上面的Ingress理解为在集群的前端加了一个Nginx,用来提供Nginx所能提供的一切功能,例如基于url的反向代理,https认证,用户鉴权,域名重定向等等
需要注意几点:
- Nginx是基于url的,如果没有DNS解析url到集群中任意ip可以考虑hosts文件劫持
- Nginx的本质也是NodePort的方式暴露给集群外的一个特殊Service
- Nginx的配置文件根据Ingress的规则自动添加和修改
更详细的介绍可以查看官方网站。
安装
直接按照官方文档进行安装即可。官方提供了minikube以及各厂商的云机器上安装的方式,我们是用kubeadm自己搭建的k8s环境,所以选择Bare-metal
部分的安装脚本,只有下面一句脚本即可
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml
官方默认采用NodePort的方式安装Nginx,其实还有其余方式,参考https://kubernetes.github.io/ingress-nginx/deploy/baremetal/
推荐先将上面这个yaml文件下载到本地,因为以后还可以根据这个文件批量删除或者修改ingress-nginx的资源。
kubectl apply -f xxx.yaml 也可以用来修改资源配置
kubectl delete -f xxx.yaml 则可以批量删除资源
[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created