Kubernetes网络自学系列 | 找到你并不容易:从集群外访问服务
Posted COCOgsta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes网络自学系列 | 找到你并不容易:从集群外访问服务相关的知识,希望对你有一定的参考价值。
素材来源:《Kubernetes网络权威指南》
一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Kubernetes网络自学系列 | 汇总_COCOgsta的博客-CSDN博客
3.6 找到你并不容易:从集群外访问服务
在开始本节的讨论之前,先留一个开放性的问题给读者:如何从集群外访问Kubernetes Service?
可以使用NodePort类型的Service,但这种做法除了要求集群内Node有对外访问IP,还有一些已知的性能问题,具体请参考微信公众号“容器魔方”上的文章《记一次Docker/Kubernetes上无法解释的超时原因探寻之旅》。
那使用Load Balancer类型的Service呢?它要求在特定的云服务上运行Kubernetes,而且Service只提供L4负载均衡功能,一些高级的L7转发功能,例如基于HTTP header、cookie、URL的转发就做不了。
在Kubernets中,L7的转发功能、集群外访问Service,都是专门交给Ingress的。虽然前文提到NodePort和Load Balancer类型的Service在功能上也能起到对外暴露服务的作用,但是都存在各种限制,而Ingress没有上述两种Service限制。
Ingress可能是暴露服务的最强大方式,也是最复杂的。Kubernetes Ingress提供了负载平衡器的典型特性:HTTP路由、黏性会话、SSL终止、SSL直通、TCP和UDP负载平衡等。目前,并不是所有的Ingress Controller都实现了这些功能,需要查看具体的Ingress Controller文档。Ingress控制器有各种类型,包括Google Cloud Load Balancer、nginx、Istio等。有些Ingress Controller可能还依赖各种插件,例如cert-manager,它可以为服务自动提供SSL证书。
除此之外,如果你想要使用同一个IP暴露多个服务,这些服务都使用相同的七层协议(如HTTP),那么Ingress可能正是你在寻觅的。
本节将重点介绍Kubernetes的Ingress概念。
3.6.1 Kubernetes Ingress
何谓Ingress?从字面意思解读,就是“入站流量”。Kubernetes的Ingress资源对象是指授权入站连接到达集群内服务的规则集合。看图3-18所示的这个例子便一目了然。
图3-18 没有Ingress时访问集群内服务
通常情况下,Service和Pod仅可在集群内部网络中通过IP地址访问。所有到达边界路由的流量或被丢弃或被转发到其他地方。图3-19所示为引入Ingress后访问集群内服务的状态。
图3-19 引入Ingress后访问集群内服务的状态
Ingress的作用就是在边界路由处开个口子,放外部流量进来。因此,Ingress是建立在Service之上的L7访问入口,它支持通过URL的方式将Service暴露到k8s集群外;支持自定义Service的访问策略;提供按域名访问的虚拟主机功能;支持TLS通信。Ingress的作用如图3-20所示。
图3-20 Ingress的作用
在上面这个例子中,Ingress可以基于客户端请求的URL做流量分发,转发给不同的Service后端。
我们来看Ingress资源对象的API定义:
把上面这个Ingress对象创建起来后,通过kubectl get我们可以看到:
其中,ADDRESS即Ingress的访问入口地址,由Ingress Controller分配。一般由Ingress的底层实现Load Balancer的IP地址,例如Ingress、GCE LB、F5等;BACKEND是Ingress对接的后端Kubernetes Service IP+Port;RULE是自定义的访问策略,主要基于URL的转发策略,若为空,则访问ADDRESS的所有流量都转发给BACKEND。
下面给出一个Ingress的rules不为空的例子:
这个例子和前一个的最明显区别是,rules定义了path分别为/foo和/bar的分发规则,分别转发给s1:80和s2:80。kubectl get的输出一目了然:
需要注意的是,当底层Load Balancer准备就绪时,Ingress Controller把Load Balancer的IP填充到ADDRESS字段。而在我们的例子中,这个Load Balancer显然还未准备就绪。
Ingress是一个非常“极客”并需要DIY的产物,Kubernetes只负责提供一个API定义,具体的Ingress Controller需要用户自己实现!官方提供了Nginx和GCE的Ingress Controller示例供开发者参考。实现一个Ingress Controller的大致框架是:List/Watch Kubernetes的Service、Endpoints、Ingress对象,并根据这些信息刷新外部Load Balancer的规则和配置。
这还不算,如果想要通过域名访问Ingress,则需要用户自己配置域名和Ingress IP的映射关系,例如host文件、自己的DNS(不是Kube-dns)。下面章节会讲到,“高冷”的Kube-dns只负责集群内的域名解析,集群外的一概不管。
3.6.2 小结
Kubernetes的Ingress简单理解就是个规则定义,例如某个域名对应某个Service,即当某个域名的请求进来时,转发给某个Service。Ingress Controller负责实现这个规则,即Ingress Controller将其动态写入负载均衡器的配置中,从而实现服务的负载均衡。我们将在后面的章节详解Ingress Controller的实现机制。
以上是关于Kubernetes网络自学系列 | 找到你并不容易:从集群外访问服务的主要内容,如果未能解决你的问题,请参考以下文章
《Kubernetes网络权威指南》读书笔记 | 找到你并不容易:从集群内访问服务
《Kubernetes网络权威指南》读书笔记 | 找到你并不容易:从集群外访问服务
Kubernetes网络自学系列 | 打通CNI与Kubernetes:Kubernetes网络驱动
Kubernetes网络自学系列 | 终于等到你:Kubernetes网络