25 K8S 之 Endpoint 对象
创建 Service 对象的常用方法有两种:一是利用此前曾使用过的 kubectl createservice 命令创建,另一个则是利用资源配置清单创建。Service 资源对象的期望状态定义在 spec 字段中,较为常用的内嵌字段为 selector 和 ports,用于定义标签选择器和服务端口。
部署 Kubernetes 集群系统时会预留一个端口范围,专用于分配给需要用到 NodePort 的 Service 对象,该端口范围默认为 30000~32767。与 Cluster 类型的 Service 资源的一个显著不同之处在于,NodePort 类型的 Service 资源需要显式定义.spec.type 字段值为 NodePort,必要时还可以手动指定具体的节点端口号。
LoadBalancer 类型的 Service 就是在 NodePort 类型的基础上请求外部管理系统的 API,并在 Kubernetes 集群外部额外创建一个负载均衡器,将流量调度至该 NodePort Service 之上。Kubernetes 以异步方式请求创建负载均衡器,并将有关配置保存在 Service 对象的.status.loadBalancer 字段中。
Endpoint 对象会根据就绪状态把同名 Service 对象标签选择器筛选出的后端端点的 IP 地址分别保存在 subsets.addresses 字段和 subsets.notReadyAddresses 字段中,它通过 API Server 持续、动态跟踪每个端点的状态变动,并即时反映到端点 IP 所属的字段。
除了借助 Service 对象的标签选择器自动关联后端端点外,Kubernetes 也支持自定义 Endpoint 对象,用户可通过配置清单创建具有固定数量端点的 Endpoint 对象,而调用这类 Endpoint 对象的同名 Service 对象无须再使用标签选择器。
EndpointSlice 由引用的端点资源组成,类似于 Endpoint,它可由用户手动创建,也可由 EndpointSlice 控制器根据用户在创建 Service 资源时指定的标签选择器筛选集群上的 Pod 对象自动创建。单个 EndpointSlice 资源默认不能超过 100 个端点,小于该数量时,EndpointSlice 与 Endpoint 存在 1:1 的映射关系且性能相同。EndpointSlice 控制器会尽可能地填满每一个 EndpointSlice 资源,但不会主动进行重新平衡,新增的端点会尝试添加到现有的 EndpointSlice 资源上,若超出现有任何 EndpointSlice 对象的可用的空余空间,则将创建新的 EndpointSlice,而非分散填充。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/4ee325717d28c891677d4227f】。文章转载请联系作者。
评论