竹笋

首页 » 问答 » 常识 » 一文讲透K8s的Service概念计算
TUhjnbcbe - 2023/4/29 18:44:00

怎么跟你说Service的出现,就是解决ip不固定的问题,怎么解决呢?听小刘慢慢道来

当Pod宕机后重新生成时,其IP等状态信息可能会变动,Service会根据Pod的Label对这些状态信息进行监控和变更,保证上游服务不受Pod的变动而影响。

一、Service简介

1.1Service概念

KubernetesService定义了这样一种抽象:Service是一种可以访问Pod逻辑分组的策略,Service通常是通过LabelSelector访问Pod组。

Service能够提供负载均衡的能力,但是在使用上有以下限制:只提供4层负载均衡能力,而没有7层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的

s1.2Service类型

Service在K8s中有以下四种类型:

①ClusterIp

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

②NodePort

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

③LoadBalancer

在NodePort的基础上,借助CloudProvider创建一个外部负载均衡器,并将请求转发到NodePort

④ExternalName

把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有Kubernetes1.7或更高版本的kube-dns才支持。

1.3Service基础导论

客户端访问节点时通过iptables实现的iptables规则是通过kube-proxy写入的apiserver通过监控kube-proxy去进行对服务和端点的监控kube-proxy通过pod的标签(lables)去判断这个断点信息是否写入到Endpoints里

二、代理

2.1VIP和Service代理

在Kubernetes集群中,每个Node运行一个kube-proxy进程。kube-proxy负责为Service实现了一种VIP(虚拟IP)的形式,而不是ExternalName的形式。在Kubernetesv1.0版本,代理完全在userspace。在Kubernetesv1.1版本,新增了iptables代理,但并不是默认的运行模式。从Kubernetesv1.2起,默认就是iptables代理。在Kubernetesv1.8.0-beta.0中,添加了ipvs代理。在Kubernetes1.14版本开始默认使用ipvs代理。

在Kubernetesv1.0版本,Service是4层(TCP/UDPoverIP)概念。在Kubernetesv1.1版本,新增了IngressAPI(beta版),用来表示7层(HTTP)服务为何不使用round-robinDNS?

DNS会在很多的客户端里进行缓存,很多服务在访问DNS进行域名解析完成、得到地址后不会对DNS的解析进行清除缓存的操作,所以一旦有他的地址信息后,不管访问几次还是原来的地址信息,导致负载均衡无效

2.2代理模式分类

①userspace代理模式

②iptables代理模式

③ipvs代理模式

ipvs代理模式中kube-proxy会监视KubernetesService对象和Endpoints,调用netlink接口以相应地创建ipvs规则并定期与KubernetesService对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod。

与iptables类似,ipvs于netfilter的hook功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如:

rr:轮询调度lc:最小连接数dh:目标哈希sh:源哈希sed:最短期望延迟nq:不排队调度

三、Service使用

3.1ClusterIp

ClusterIP主要在每个node节点使用iptables,将发向ClusterIP对应端口的数据,转发到kube-proxy中。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口。

为了实现图上的功能,主要需要以下几个组件的协同工作:

apiserver:用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储到etcd中kube-proxy:Kubernetes的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知service、pod的变化,并将变化的信息写入本地的iptables规则中iptables:使用NAT等技术将virtualIP的流量转至endpoint中创建myapp-deploy.yaml文件

创建Service信息:

执行命令:

3.2HandlessService

有时不需要或不想要负载均衡,以及单独的ServiceIP。遇到这种情况,可以通过指定spec.clusterIP的值为None来创建HeadlessService。这类Service并不会分配ClusterIP,kube-proxy不会处理它们,而且平台也不会为它们进行负载均衡和路由。

3.3NodePort

NodePort的原理在于在Node上开了一个端口,将向该端口的流量导入到kube-proxy,然后由kube-proxy进一步到给对应的pod。

创建Service信息:

执行命令:

3.4LoadBalancer

LoadBalancer和NodePort其实是同一种方式。区别在于LoadBalancer比NodePort多了一步,就是可以调用Cloudprovider去创建LB来向节点导流。

3.5ExternalName

这种类型的Service通过返回CNAME和它的值,可以将服务映射到externalName字段的内容(例:hub.hc.

1
查看完整版本: 一文讲透K8s的Service概念计算