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,而非分散填充。