k8s 对外服务之ingress

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s 对外服务之ingress相关的知识,希望对你有一定的参考价值。

参考技术A

负载均衡(LB)在微服务架构演进中具有非常重要的意义,可以说的内容有很多, 这里仅仅讨论四层和七层负载均衡的一些要点和区别 ,以便于对 ingress 的理解。所谓四层和七层负载均衡是按照网络层次OSI来划分的负载均衡类型(也可以按照其他的规则来分类,比如:应用的地理结构),简单来说: 四层负载均衡 表示负载均衡器用ip+port接收请求,再直接转发到后端对应的服务上,工作在传输层( transport layer ); 七层负载均衡 表示负载均衡器根据虚拟的url或主机名来接收请求,经过处理后再转向相应的后端服务上,工作在应用层( application layer )。

下图表示了4层和7层负载均衡在建立TCP连接上的区别,从图中可以看出,四层负载均衡需要建立的TCP连接其实之有一个,它只做一次转发,client直接和server连接;而7层负载均衡则需要建立两次TCP连接,client到LB,LB根据消息中的内容( 比如URL或者cookie中的信息 )来做出负载均衡的决定,接着建立LB到server的连接。

7层负载均衡有什么好处呢?

举个例子:
正向代理 :在使用VPS访问 的时候,通常会使用一个本地的代理服务器,浏览器的网络包会先经过本地的代理服务器,代理服务器会通过远在异国它乡的电脑来访问 并返回消息;这就好比去附近的咖啡店要先问一下手机咖啡店在哪里一样,手机就是一个正向代理服务器。
反向代理 :当访问的请求到达 时, 那边也设置了一个代理服务器,它通过查看请求的URL,发现是想查找视频内容,于时把消息转给了视频搜索服务器(过程是我乱说的),这就好比你去朋友家做客,开门的却是个管家,问你找谁?这时候管家就是一个反向代理了。
关于反向代理的好处这里就不多介绍,感兴趣可以看 这里

k8s 对外 暴露服务(service)主要有两种方式: NotePort , LoadBalance , 此外 externalIPs 也可以使各类service对外提供服务,但是当集群服务很多的时候,NodePort方式最大的缺点是会占用很多集群机器的端口;LB方式最大的缺点则是每个service一个LB又有点浪费和麻烦,并且需要k8s之外的支持; 而ingress则只需要一个NodePort或者一个LB就可以满足所有 service 对外服务的需求。工作机制大致可以用下图表示:

实际上, ingress 相当于一个7层的负载均衡器,是k8s对反向代理的一个抽象。大概的工作原理也确实类似于nginx,可以理解成在 Ingress 里建立一个个映射规则 , ingress Controller 通过监听 Ingress 这个api对象里的配置规则并转化成 Nginx 的配置(kubernetes声明式API和控制循环) , 然后对外部提供服务。ingress包括: ingress controller ingress resources

ingress controller :核心是一个deployment,实现方式有很多,比如nginx, Contour, Haproxy, trafik, Istio,需要编写的yaml有:Deployment, Service, ConfigMap, ServiceAccount(Auth),其中service的类型可以是NodePort或者LoadBalancer。

ingress resources :这个就是一个类型为 Ingress 的k8s api对象了,这部分则是面向开发人员。

假设已经有两个服务部署在了k8s集群内部:

配置 Ingress resources,即可实现多个service对外暴露服务:
方式一:

接着在hosts文件中添加一条解析规则: $ingress_IP foo.bar.com ,这时通过 在浏览器 中访问: foo.bar.com/coffee 或者 foo.bar.com/tea 即可访问对应的后端service了。

方式二:

这时在hosts文件添加两条解析规则就可以在浏览器中访问了。此外,还可以配置TLS证书实现HTTPS访问,这里不再详述。

以上是关于k8s 对外服务之ingress的主要内容,如果未能解决你的问题,请参考以下文章

k8s学习-Ingress

K8s之traefik(ingess)发布服务-实战

k8s之服务发现

Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务

k8s 对外服务之ingress

k8s实战之Service