美文网首页
K8S学习之Ingress入门

K8S学习之Ingress入门

作者: david161 | 来源:发表于2022-03-14 07:34 被阅读0次

ingress网络

什么是Ingress?

K8s集群对外暴露服务的方式目前只有三种:loadblancer、nodeport、ingress。前两种熟悉起来比较快,而且使用起来也比较方便,前面课程已经讲解过两种技术。在此就不进行介绍了。
下面详细讲解下ingress这个服务,ingress由两部分组成:ingress controller和ingress服务。
其中ingress controller目前主要有两种:基于nginx服务的ingress controller和基于traefik的ingress controller。
而其中traefik的ingress controller,目前支持http和https协议。由于对nginx比较熟悉,而且需要使用TCP负载,所以在此我们选择的是基于nginx服务的ingress controller。 在kubernetes集群中,我们知道service和pod的ip仅在集群内部访问。如果外部应用要访问集群内的服务,集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kube�proxy组件将其转发给相关的pod。
而Ingress就是为进入集群的请求提供路由规则的集合,通俗点就是提供外部访问集群的入口,将外部的HTTP或者HTTPS请求转发到集群内部service上。

Ingress-nginx组成

Ingress-nginx一般由三个组件组成:
1)反向代理负载均衡器:通常以service的port方式运行,接收并按照ingress定义的规则进行转发,常用的有nginx,Haproxy,Traefik等,本次实验中使用的就是nginx。
2)Ingress Controller:监听APIServer,根据用户编写的ingress规则(编写ingress的yaml文件),动态地去更改nginx服务的配置文件,并且reload重载使其生效,此过程是自动化的(通过lua脚本来实现)。
3)Ingress:将nginx的配置抽象成一个Ingress对象,当用户每添加一个新的服务,只需要编写一个新的ingress的yaml文件即可。

Ingress-nginx的工作原理
  1. ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化。然后读取它,按照自定义的规则,规则就是写明了那个域名对应哪个service,生成一段nginx配置。
  2. 再写到nginx-ingress-controller的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中。然后reload一下使配置生效,以此达到分配和动态更新问题。
官网地址

基于nginx服务的ingress controller根据不同的开发公司,又分为k8s社区的ingres-nginx和nginx公司的nginx-ingress。

Ingress-Nginx github 地址: 
https://github.com/kubernetes/ingress-nginx 

Ingress-Nginx 官方网站: 
https://kubernetes.github.io/ingress-nginx/
下载资源文件

根据github上的活跃度和关注人数,我们选择的是k8s社区的ingres-nginx。
下载ingrees-controller

打开github官网:选择某一个具体版本后进入deploy/static/目录中,复制mandatory.yaml文件内容。 
https://github.com/kubernetes/ingress-nginx/tree/nginx- 0.30.0/deploy/static/mandatory.yaml

下载ingress服务

https://github.com/kubernetes/ingress-nginx/blob/nginx- 
0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
下载镜像

需要将镜像pull到k8s集群各个node节点

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx- ingress-controller:0.30.0 
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress- controller:0.30.0 quay.io/kubernetes-ingress-controller/nginx-ingress- controller:0.30.0 
docker rmi -f registry.cn-hangzhou.aliyuncs.com/google_containers/nginx- ingress-controller:0.30.0
ingress与ingress-controller

要理解ingress,需要区分两个概念,ingress和ingress-controller:
1)ingress对象:
指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。
2)ingress-controller:
具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
简单来说,ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。
ingress-controller
ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同
的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx
两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。但是不管哪一种
ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。一般来说,ingress-controller
的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根
据ingress对象生成配置并应用新配置到反向代理,比如nginx-ingress就是动态生成nginx配置,动态更
新upstream,并在需要的时候reload程序应用新配置。
ingress
ingress是一个API对象,和其他对象一样,通过yaml文件来配置。ingress通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于host的方向代理。ingress要依靠ingress-controller来具体实现以上功能。

相关文章

网友评论

      本文标题:K8S学习之Ingress入门

      本文链接:https://www.haomeiwen.com/subject/atftdrtx.html