在Kubernetes中,Pod虽然拥有独立的IP,但会被快速地创建和删除,因此无法直接对外提供服务。而服务(Service)能够解耦前端和后端的关联,从而实现松耦合的微服务设计。本文介绍Service的原理、注意事项、以及如何选择不同类型的Service实现对外暴露应用。
Service原理
由于云原生的应用,通常需要敏捷的迭代和快速的弹性,且单一容器和其相关的网络资源的生命周期非常短暂,所以需要固定的访问地址,以及自动负载均衡实现快速的业务弹性。ACK采用Service方式为一组容器提供固定的访问入口,并对这一组容器进行负载均衡。实现原理如下:
创建Service对象时,ACK会分配一个相对固定的Service IP地址。
通过字段selector选择一组容器,以将这个Service的IP地址和端口负载均衡到这一组容器IP和端口上。
注意事项
在使用Service的负载均衡功能之前,建议您先了解相关注意事项。详细信息,请参见Service的负载均衡配置注意事项。
使用Service实现对外暴露应用
Service网络支持以下多种模式,分别对接不同来源和类型的客户端的访问:
ClusterIP
ClusterIP类型的Service用于集群内部的应用间访问,如果您的应用需要暴露到集群内部提供服务,需使用ClusterIP类型的Service进行暴露。
说明创建Service时默认的Service类型为ClusterIP。
创建ClusterIP类型的Service时,不会创建负载均衡实例。
NodePort
NodePort类型的Service将集群中部署的应用向外暴露,通过集群节点上的一个固定端口暴露出去,这样在集群外部就可以通过节点IP和这个固定端口来访问。
LoadBalancer
LoadBalancer类型的Service同样是将集群内部部署的应用向外暴露,不过它是通过阿里云的负载均衡进行暴露的,相对于NodePort方式,有更高的可用性和性能。关于如何通过LoadBalancer类型Service暴露应用,请参见通过使用已有SLB的服务暴露应用和通过使用自动创建SLB的服务公开应用。
Headless Service
Headless Service类型的Service是在Service属性中指定clusterIP字段为None类型。采用Headless Service类型后,Service将没有固定的虚拟IP地址,客户端访问Service的域名时会通过DNS返回所有的后端Pod实例的IP地址,客户端需要采用DNS负载均衡来实现对后端的负载均衡。
ExternalName
ExternalName类型的Service将集群外部的域名映射到集群内部的Service上,例如将外部的数据库域名映射到集群内部的Service名,那么就能在集群内部通过Service名直接访问。
您还可以通过Annotation配置负载均衡。详细信息,请参见通过Annotation配置传统型负载均衡CLB、通过Annotation配置网络型负载均衡NLB。
外部流量策略功能对比
集群中使用的网络插件不同,外部流量策略功能也不同,以下介绍Terway-Eniip和Flannel网络插件的外部流量策略功能对比。
登录容器服务管理控制台,在集群列表页面单击目标集群的名称,在基本信息页签下集群信息区域可以查看集群的网络模式。
Flannel网络插件
Flannel网络插件下,流量经由节点的NodePort转发到Pod中。
Local:流量只转发给本机的Pod,即流量仅在同一个节点的Pod中进行转发。
Cluster:流量可以转发到集群中其他节点上的Pod。
Local和Cluster两种外部流量策略详细的区别如下表所示。
比较项 | Local | Cluster |
负载均衡后端挂载行为 | 仅Pod所在的节点会挂载到负载均衡后端。 | 所有集群内的节点都将挂载到负载均衡的后端。 |
负载均衡配额 | 负载均衡配额消耗较少。关于负载均衡配额的详细介绍,请参见配额限制。 | 由于集群内所有节点都挂载到负载均衡后端,因此会大量消耗负载均衡配额。关于负载均衡配额的详细介绍,请参见配额限制。 |
访问负载均衡地址 | 仅Pod所在节点可以访问负载均衡地址。 | 集群内任意节点均可访问负载均衡地址。 |
Pod负载均衡 | 默认Pod之间负载不均衡。 如果您想要实现Pod之间负载均衡,需要指定策略为wrr,即为Service添加 | 默认Pod之间负载均衡。 |
保留来源IP | 支持。 | 不支持。 |
会话保持 | 支持。 | 不支持。 |
Terway-Eniip网络插件
Terway-Eniip网络插件下,无论是Local还是Cluster,流量直接转发到Pod中。
Local和Cluster两种外部流量策略详细的区别如下表所示。
比较项 | Local | Cluster |
负载均衡后端挂载行为 | Pod直接挂载到负载均衡后端。 | |
负载均衡配额 | 仅挂载业务Pod,负载均衡配额消耗较少。关于负载均衡配额的详细介绍,请参见配额限制。 | |
访问负载均衡地址 | 仅Pod所在节点可以访问负载均衡地址。 | 集群内任意节点均可访问负载均衡地址。 |
Pod负载均衡 | 默认Pod之间负载均衡。 | |
保留来源IP | 支持。 | |
会话保持 | 支持。 |
相关文档
配置Service的负载均衡注意事项以及CCM的资源更新策略,请参见Service的负载均衡配置注意事项。
如果使用容器服务ACK Service时遇到问题,例如Service注解不生效、无法根据Service关联SLB等,请参见Service FAQ、Service异常问题排查寻找解决方法。