k8s学习(13):Service定义

概念

在kubernetes中,Service定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略–通常称为微服务。这一组Pod能够被Service访问到,通常是通过Label Selector

Service能提供负载均衡的能力,但是在使用上有以下限制:

  • 只提供4层负载均衡能力,而没有7层功能,即不能通过主机名或域名方案去负载,但有时我们可能需要更多的匹配规则来转发请求,这点4层负载均衡是不支持的。(7层可以通过ingress去支持)

  • 负载均衡方式:RR(轮询)

image-20200201010345630

Service的类型

Service在k8s中有以下4中类型:

  • ClusterIP:默认,自动分配一个仅Cluster内部可以访问的虚拟IP

  • NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,可以通过NodeIP:NodePort来访问该服务

  • LoadBalancer:在NodePort的基础上,借助cloudprovider创建一个外部负载均衡器,并将请求转发NodeIP:NodePort

  • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何代理类型被创建,在k8s版本>=1.7支持

image-20200201012138497

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版本新增了IngressAPI(beta版),用来标识7层(HTTP)服务

1
2
问题: 为何不使用round-robin DNS?
原因是DNS会在客户端里进行缓存

代理模式的分类

1 userspace代理模式

image-20200201013210254

2 iptables代理模式

image-20200201013340246

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:不排队调度

image-20200201013438178

1
2
# 查看负载状态
ipvsadm -Ln