k8s学习(13):Service定义
概念
在kubernetes中,Service
定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略–通常称为微服务。这一组Pod能够被Service
访问到,通常是通过Label Selector
Service能提供负载均衡的能力,但是在使用上有以下限制:
只提供4层负载均衡能力,而没有7层功能,即不能通过主机名或域名方案去负载,但有时我们可能需要更多的匹配规则来转发请求,这点4层负载均衡是不支持的。(7层可以通过ingress去支持)
负载均衡方式:RR(轮询)
Service的类型
Service在k8s中有以下4中类型:
ClusterIP:默认,自动分配一个仅Cluster内部可以访问的虚拟IP
NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,可以通过NodeIP:NodePort来访问该服务
LoadBalancer:在NodePort的基础上,借助cloudprovider创建一个外部负载均衡器,并将请求转发NodeIP:NodePort
ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何代理类型被创建,在k8s版本>=1.7支持
VIP和Service代理
在k8s集群中,每个Node运行一个kube-proxy
进程。kube-proxy
负责为Service
实现了一种VIP的形式,而不是ExternalName
的形式。
- k8s v1.0版本,代理是完全是userspace
- k8s v1.1版本,新增了iptables代理
- k8s v1.2版本,默认为iptables代理
- k8s v1,8,0-beta.0版本,添加了ipvs代理
- k8s v1.14版本开始,默认使用ipvs代理
在k8s v1.0版本,Service
是4层(TCP/UDP over IP)概念,在k8s v1.1版本新增了Ingress
API(beta版),用来标识7层(HTTP)服务
1 | 问题: 为何不使用round-robin DNS? |
代理模式的分类
1 userspace代理模式
2 iptables代理模式
3 ipvs代理模式
这种模式,kube-proxy
会监视KubernetesService
对象和Endpoints
,调用netlink
接口以响应地创建ipvs规则并定期与KubernetesService
对象和Endpoints
对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod
与iptables类似,ipvs于netfilter的hook功能,但使用哈希表作为底层数据结构并在内核空间工作。这意味着ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如:
rr
:轮询调度lc
:最小连接数dh
:目标哈希sh
:源哈希sed
:最短期望延迟nq
:不排队调度
1 | # 查看负载状态 |