赞
踩
Kubernetes(简称K8s)中的Service
是一种核心资源对象,它为一组提供相同功能的Pod提供了稳定、统一的网络入口点,并负责服务发现、负载均衡以及网络路由。
服务发现:Service
为一组具有相同功能的Pod定义了一个固定的、逻辑上的DNS名称和IP地址(即ClusterIP),这些信息在Kubernetes命名空间内唯一。无论Pod如何动态变化(如增删、迁移、重启),只要它们的标签匹配Service
的标签选择器,客户端就能通过Service
的DNS名或IP地址访问这些Pod,而无需关心Pod的实际IP和端口。
负载均衡:Service
内置了负载均衡机制,能够将来自外部或内部的请求按照预定义策略(如轮询、会话亲和性等)分发到其后端关联的多个Pod实例上。这有助于提高服务的可用性和响应速度,确保请求在多个实例间均匀分布。
网络模式:
Service
分配一个仅在集群内部可访问的虚拟IP。集群内部的Pod和其他Service
可以通过此IP与Service
通信。Service
在每个节点上开放一个静态端口(NodePort),使得外部可以通过 <节点IP>:<NodePort>
访问Service
。Service
提供一个公网IP。外部可以直接通过这个公网IP访问Service
。端口映射:Service
可以定义一个或多个端口,每个端口对应后端Pod的一个或多个端口。Service
通过标签选择器(Label Selector)来确定哪些Pod是其后端。
会话亲和性(Session Affinity):Service
支持设置会话亲和性,确保来自同一客户端的连续请求被转发到同一后端Pod,这对于需要维持会话状态的应用至关重要。
健康检查:Service
能利用Pod的健康检查(Liveness Probe和Readiness Probe)信息,只将请求转发到健康就绪的Pod,避免将流量导向存在问题的实例。
Endpoint Slice(从v1.16开始引入):对于大规模Pod场景,Service
使用Endpoint Slice资源替代传统的Endpoint资源,以更高效的方式管理后端Pod列表。
下面是一个简单的Service
YAML配置示例,创建了一个名为my-web-service
的ClusterIP
类型Service
,其目标Pod通过标签app=web
选择,暴露了80端口,并将流量转发到Pod的8080端口:
apiVersion: v1
kind: Service
metadata:
name: my-web-service
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
Service
:kubectl apply -f service.yaml
Service
详情:kubectl describe service my-web-service
Service
IP:kubectl get service my-web-service -o jsonpath='{.spec.clusterIP}'
Service
:kubectl delete service my-web-service
kube-proxy:每个Kubernetes节点上运行着一个kube-proxy
组件,它是Service
功能在节点层面的具体实现者。kube-proxy
监听API服务器,获取并更新Service
和Endpoints信息,然后通过iptables规则或其他网络代理(如IPVS)实现网络流量的重定向和负载均衡。
Endpoints:Service
与其后端Pod之间的关系由Endpoints
资源表示。kube-controller-manager
中的endpoints-controller
监控Service
和Pod的变化,动态维护对应的Endpoints
列表。
Service
通过标签选择器精确地识别后端Pod。Service
,它将返回Pod的IP列表作为DNS A记录。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。