k8s Service
简介
Service是Kubernetes实现微服务架构的核心概念
通过Servic的定义,能够为客户端应用提供稳定的访问地址(域名或IP地址)和负载均衡功能,以及屏蔽后端EndPoint的变化,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载均衡分发到后端的各个容器应用上
yaml
apiVersion: v1
kind: Service
#元数据
metadata:
#Service名称
name: string
#命名空间,不指定时默认为default命名空间
namespace: string
#自定义标签属性列表
labels:
- name: string
#自定义注解属性列表
annotations:
- name: string
#详细描述
spec:
#定义 NodePorts 是否会自动分配给 LoadBalancer 类型的服务,默认值为“真”
allocateLoadBalancerNodePorts: bool
#ClusterIP是分配给此服务的IP地址列表,通常随机分配,当为None时为headless service(无头服务)
clusterIP: string
#ClusterIPs 是分配给此服务的IP地址列表,通常随机分配
clusterIPs: []string
#externalIPs是一个 IP地址列表,集群中的节点也将接受此服务的流量。这些IP不是由Kubernetes管理的,用户负责确保流量到达具有此 IP 的节点
externalIPs: []string
#当type=ExternalName时,将服务映射到 DNS 名称
externalName: string
#externalTrafficPolicy 表示此服务是否希望路由外部到节点本地或集群范围端点的流量 Local/Cluster
externalTrafficPolicy: string
#healthCheckNodePort 指定服务的健康检查节点端口。这仅适用于类型设置为 LoadBalancer 和 externalTrafficPolicy 设置为本地。
healthCheckNodePort: integer
#InternalTrafficPolicy 指定集群内部流量是否应该仅路由到所有端点或节点本地端点 Local/Cluster
internalTrafficPolicy: string
ipFamilies: []string
ipFamilyPolicy: string
#type=LoadBalancer,指定标签样式标识符
loadBalancerClass: string
#type=LoadBalancer,指定ip
loadBalancerIP: string
#通过云供应商负载均衡器将被限制在指定的客户端 IP
loadBalancerSourceRanges: []string
#Label Selector配置,选择具有指定label标签的pod作为管理范围
selector: []
#service的类型,指定service的访问方式,默认ClusterIP
type: string
#是否支持session,可选值为ClietIP,默认值为空
#ClientIP表示将同一个客户端(根据客户端IP地址决定)的访问请求都转发到同一个后端Pod
sessionAffinity: string
#service需要暴露的端口列表
ports:
#端口名称
- name: string
#端口协议,支持TCP或UDP,默认TCP
protocol: string
#服务监听的端口号
port: integer
#需要转发到后端的端口号
targetPort: integer
#当type=NodePort时,指定映射到物理机的端口号
nodePort: integer
status:
#当前服务状态
conditions:
- lastTransitionTime: string
message: string
observedGeneration: integer
reason: string
status: string
type: string
#外部负载均衡器
loadBalancer:
#外部负载均衡器
ingress:
#主机名是为基于DNS的负载均衡器入口点设置的
- hostname: string
#外部负载均衡器的IP地址
ip: string
#外部负载均衡器的机主机
hostname: string
- spec.type
service的类型,指定service的访问方式,默认ClusterIP- ClusterIP
虚拟的服务ip地址,用于k8s集群内部的pod访问,在Node上kube-porxy通过设置的iptables规则进行转发 - NodePort
使用宿主机端口,能够访问各Node的外部客户端通过Node的IP和端口就能访问服务器 - LoadBalancer
使用外部负载均衡器完成到服务器的负载分发,需要在spec.status.loadBalancer字段指定外部负载均衡服务器的IP,并同时定义nodePort和clusterIP用于公有云环境 - ExternalName
通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com),无需创建任何类型代理
- ClusterIP
Service的负载均衡机制
从服务IP到后端Pod的负载均衡机制,则是由每个Node上的kube-proxy负责实现的
kube-proxy的代理模式
-
userspace模式
用户空间模式,由kube-proxy完成代理的实现,效率最低,不再推荐使用 -
iptables模式
v1.2起默认为iptable,kube-proxy通过设置Linux Lernel的iptables规则,实现从Service到后端EndPoint列表的负载分发规则,效率很高。但是如果某个endpoint不可用,客户端就会得到失败的响应,相对userspace模式来说更不可靠。此时应该通过为Pod设置readinessprobe(服务可用性健康检查)来保证可用性 -
ipvs
Kubernetes v1.8.0-beta.0 中,添加了ipvs代理
这种模式,kube-proxy会监视Kubernetes Service对象和Endpoints,调用netlink接口以相应地创建ipvs规则并定期与Kubernetes Service对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod。
与iptables类似,ipvs基于netfilter 的 hook 功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如:- rr:轮询调度
- lc:最小连接数
- dh:目标哈希
- sh:源哈希
- sed:最短期望延迟
- nq: 不排队调度
注
:当kube-proxy以ipvs代理模式启动时,kube-proxy将验证节点上是否安装了IPVS模块,如果未安装,则kube-proxy将回退到iptables代理模式。 -
kernelspace模式
windows server上的代理模式