kubernetes基础知识之ingress
ingress nginx主要是实现一种7层负载均衡,是一种延续的service,也就是另一种工作方式的service。
四层负载均衡的典型软件是lvs,也叫ipvs.它是内核态的软件。
四层负载均衡:客户端访问lvs,lvs只是一个负载调度器,不具备提供服务的能力。lvs的背后是Real Server真实服务器,去提供用户的业务访问功能。客户端访问lvs,lvs将请求转发给后端的真实服务器。真实服务器再将请求转发给lvs,lvs再转发给客户端。这样就完成了客户端和真实服务器之间的连接建立。四层负载均衡的一个特性就是1次完整的TCP连接。由客户端与真实服务器建立连接,负载均衡调度器只起到转发请求的作用。
七层负载均衡:七层负载均衡调度器最典型的是nginx。客户端需要跟nginx索要对应请求的数据,nginx作为代理服务器,同样没有数据,后端需要真实的服务器提供数据,例如Tomcat。客户端发起连接请求至nginx,nginx不是将请求转发给后端真实服务器Real Server,而是先要和客户端连接,索要客户端的真实请求数据。请求完成后来,知道客户端的请求内容之后,nginx再发起一个新的TCP连接到达后端的真实服务器。后端真实服务器Tomcat再把客户端索要的数据返回给nginx服务器,nginx拿到数据再返回给客户端。七层负载均衡的最大特性:两次完整的TCP连接,由客户端与负载均衡调度器nginx建立连接,然后负载均衡调度器与真实服务器建立新的连接。负载均衡调度器起到代理服务器的作用,这就是七层负载均衡。
四层负载均衡:如果客户端发起的是HTTPS请求,那么LVS只起到转发的作用,后端真实服务器必须也是HTTPS才行,每一个后端服务器要开启HTTPS的配置才行。
七层负载均衡:如果是七层负载均衡,客户端和nginx单独建立连接,客户端和负载均衡调度器nginx之间走HTTPS协议,而nginx和后端真实服务器tomcat之间发起HTTP访问。HTTP和HTTPS的区别就是有没有加密的S,加密的作用主要是在不安全不可信的网络环境中起到数据保护的作用。但是nginx和后端tomcat一般处于同一个内网环境中,在同一个内网里传输数据是很安全的,所以可以直接让nginx和tomcat之间降级成HTTP协议。nginx降级成HTTP,跟真实服务器tomcat去发起请求。这时,只需要nginx去做https的加密即可。后端真实服务器tomcat就可以直接使用http协议,直接使用默认的HTTP协议。这就是7层负载均衡能够带来的功能体现,七层负载均衡还能够实现路径转发、微服务网关转发的作用。
nginx反向代理:
upstream ro {
server 192.168.56.11;
server 18.92.168.56.12;
server 192.168.56.13;
}
upstream stu {
server 192.168.56.14;
server 192.168.56.15;
}
server {
location /ro{
proxy_pass http://ro:80;
}
location /stu {
proxy_pass http://stu:80;
}
}
如果客户端请求路径是/stu下的路径,那么第一会被nginx服务器所接收,然后如果域名匹配到了回会到server区域。接着会匹配到location的区域,然后proxy_pass代理到stu:80,进入到upstream区域。从upstream区域里面轮询一台服务器去处理请求,,进行反向代理去处理客户端的请求。
客户端请求路径是http://域名:80/stu/xxx.html,那么请求会发送到nginx上面。到了nginx之后,我们要匹配server区域。server区域的server_name跟访问的域名是一致的,所以被当前的server区域接收。然后就会被/stu的location所接收,通过代理proxy_pass到http://stu:80; 接着就会被转发到upstream区域。在upstream区域里面会有许多台后端真实服务器,会通过轮询的方案,返回一台真实服务器,与它建立代理关联。然后真实服务器处理完客户请求之后,再返回给nginx服务器,接着nginx服务器再返回数据给客户端。
这就是服务路径,也就是服务网关要做的事情。
四层负载均衡来说,只看IP和端口。
七层负载均衡,在目前的环境中尤为重大。许多公司做微服务,微服务需要七层负载均衡和反向代理的支持。
kubernetes为nodeport类型服务分配的端口范围是从30000到32767,一共2768个端口。
可以使用nodeport类型的服务,通过转换外网的https协议访问端口和http端口,通过nodeport类型的服务,把客户端请求转发到集群内部的nginx pod,使用nginx做为七层负载均衡的组件。接着由于底层real server的多个pod,可能会存在pod挂掉导致IP地址变动的情况,改变需要修改nginx的配置文件。于是在nginx的反向代理和后端real server之间添加上一层service服务,去实现保证service服务和后端pod的状态是实时的。如果后端pod的IP地址变动了,service会实时添加上新的IP地址添加到负载均衡里面。这样通过减少一些nginx作为负载均衡器的配置重载,来保证系统的稳定性。这个service可以实现四层的负载均衡,四层负载均衡本身是由kubernetes集群监听解决的,是由endpoints维护的。
nginx配置写法如下:
upstream www1 {
server www1svcIP:port;
}
upstream www2 {
server www2svcIP:port;
}
http {
server {
server_name www1.87long.com;
location / {
proxy_pass http://www1;
}
}
server {
server_name www2.87long.com;
location / {
proxy_pass http://www2;
}
}
}
需要把这个配置手动添加到nginx的pod配置文件中,或者是通过configmap去添加。就是把nginx的configuration配置文件封装到configmap里面再挂载到nginx 的负载均衡pod里面。这样去手动修改configmap,就不会修改了,当然nginx还是需要手动重启。这样就做到了七层负载均衡。
如果想创建四层负载均衡,只是需要一条命令:
kubectl create service $service_type $service_name –tcp=port:targetPort
举例:
kubectl create service nodeport exp-ns –tcp=80:8080
它会自动创建出底层的ipvs集群。
到了7层负载均衡,如果人为修改nginx的配置文件,那么超级尴尬。
这就是要引入ingress的缘由。
这时候调整架构,也就是kubernetes集群中有一个叫apiserver,apiserver里面有一个资源对象叫ingress。这个ingress是用来描述7层负载均衡的。
nginx去监听ingress的变化,将变化的信息监听完成之后,去自动生成配置文件。nginx去发起对ingress的监听,它监听到ingress的配置变化之后,会去修改本地的配置文件,并且触发重启。这样的好处是:用户直接通过调用apiserver,去创建ingress之后,配置文件就可以在nginx内部产生了,实现ingress自动创建。
kubectl create ingress Name –rule=host/path=service:port
这就是7层负载均衡的逻辑,也就是添加了ingress的接口。
用户通过kubernetes集群的api server实现ingress资源对象的添加和修改,触发七层负载均衡nginx pod的进程重载,配置自动产生并且应用。
七层负载均衡的流量分析:
ingress的资源对象,可以基于http的访问路径,去访问后端的服务。可以通过不同的虚拟主机的域名访问,反向代理到后端的真实服务器。
ingress的逻辑路径分析:通过nginx ingress访问,然后根据不同的域名包括不同的访问后段路径,代理到不同的服务,包括后段的pod。
ingress 的方案:
1.nginx方案
是目前在行业中使用最普及的方案。
2.ingress-istio-controller方案
istio方案在微服务可观测性方面表现突出,也就是在七层负载均衡和真实服务器之间的流量图,它可以画出来。
3.apisix-ingress-controller方案
apisix是开源的方案,apisix在java和微服务方面使用超级多。
4.traefik方案
traefik是一个使用golang语言写的反向代理服务器,在云原生方面用的比较多。就是为云专门开发出来的一个应用程序,叫云原生。
目前nginx ingress用的是使用最多的方案。

中国尊
鼓励的话语:能用汗水解决的问题,就尽量别用泪水。努力到无能为力,拼搏到感动自己!

