k8s之Service详解

这篇具有很好参考价值的文章主要介绍了k8s之Service详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    Kubernetes Serivce是一组具有相同label Pod集合的抽象(可以简单的理解为集群内的LB),集群内外的各个服务可以通过Service进行互相通信。

发现机制

Service创建

当用户在kubernetes集群中创建了含有label的Service之后,同时会在集群中创建出一个同名的Endpoints对象,用于存储该Service下的Pod IP,最终Service和Endpoint信息都会存入ETCD。它们的关系如下图所示:

k8sservice4种模式,k8s,kubernetes,容器,云原生

Service发现

每个运行在Node节点的kube-proxy通过apiservice监听ETC中的Services和Endpoints,如果感知到Services和Endpoints的变化之后,会在各自的Node节点设置相关的iptables或IPVS规则,用于之后用户通过Service的ClusterIP去访问该Service下的服务。如下图所示1,2步骤:

k8sservice4种模式,k8s,kubernetes,容器,云原生

Service类型

K8S中Service分为四类,分别是ClusterIP,NodePort,LoadBalancer以及ExternalName。下面一张图描述了他们之间的关系以及服务类型:

k8sservice4种模式,k8s,kubernetes,容器,云原生

其中绿色的代表从外向内的访问模式;蓝色的代表从内向外的访问模式,黄色代表集群内部的访问模式。可以看到,除了ExternalName类型之外,其余三种类型都是逐层封装而来的。下面就分类讲一讲这四种类型: 

ClusterIP

这是K8S默认的服务类型,只能在K8S中进行服务通信。在ClientIP中,K8S会在Service创建完毕后提供一个内部IP作为ClientIP属性,K8S内部服务可以通过ClientIP或者ServiceName来访问该服务。

k8sservice4种模式,k8s,kubernetes,容器,云原生

yaml

apiVersion: v1
kind: Service
metadata:
  name: service-python
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 443
  selector:
    run: pod-python
  type: ClusterIP

NodePort

我们的场景不全是集群内访问,也需要集群外业务访问。那么ClusterIP就满足不了了。NodePort在ClusterIP基础上为Service在每台机器上绑定一个端口。如下图,我们可以通过http://4.4.4.1:30080 对pod-python访问。

k8sservice4种模式,k8s,kubernetes,容器,云原生

 yaml文件

apiVersion: v1
kind: Service
metadata:
  name: service-python
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 443
    nodePort: 30080
  selector:
    run: pod-python
  type: NodePort

LoadBalancer

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

k8sservice4种模式,k8s,kubernetes,容器,云原生

 yaml文件 

apiVersion: v1
kind: Service
metadata:
  name: service-python
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 443
    nodePort: 30080
  selector:
    run: pod-python
  type: LoadBalancer

使用 kuebctl get svc :

k8sservice4种模式,k8s,kubernetes,容器,云原生

可以看到external-ip。我们就可以通过该ip来访问了。

ExternalName

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

k8sservice4种模式,k8s,kubernetes,容器,云原生

 yaml文件  

kind: Service
apiVersion: v1
metadata:
  name: test-service
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 443
  type: ExternalName
  externalName: test.database.example.com

场景:需要把应用迁移到k8s集群,但是数据库还是保留在AWS RDS,但您还希望能够将MySQL容器用于测试环境。

解决:将Web应用程序配置为使用URL测试服务访问数据库,但是在生产集群上,数据库位于AWS RDS上,并且具有以下URL test.database.example.com。创建ExternalName service 并且你的Web Pod尝试访问test-service上的数据库之后,Kubernetes DNS服务器将返回值为test.database.example.com的CNAME记录。问题解决了 。

代理模式

userspace 代理模式

userspace 模式在 k8s v1.2 后就已经被淘汰了,userspace 的作用就是在 proxy 的用户空间监听一个端口,所有的 svc 都转到这个端口,然后 proxy 内部应用层对其进行转发。proxy 会为每一个 svc 随机监听一个端口,并增加一个 iptables 规则。

从客户端到 ClusterIP:Port 的报文都会通过 iptables 规则被重定向到 Proxy Port,Kube-Proxy 收到报文后,然后分发给对应的 Pod。

k8sservice4种模式,k8s,kubernetes,容器,云原生

缺点:

流量的转发主要是在用户空间下完成的,上面提到了客户端的请求需要借助于 iptables 规则找到对应的 Proxy Port,因为 iptables 是在内核空间,这里就会请求就会有一次从用户态到内核态再返回到用户态的传递过程, 一定程度降低了服务性能。所以就会认为这种方式会有一定的性能损耗。访问pod时多了一次kube-proxy的转发。

iptables 代理模式

在 kubernetes v1.2 之后 iptables 成为默认代理模式,这种模式下,kube-proxy 会监视 Kubernetes master 对 Service 对象和 Endpoints 对象的添加和移除。 对每个 Service,它会安装 iptables 规则,从而捕获到达该 Service 的 clusterIP(虚拟 IP)和端口的请求,进而将请求重定向到 Service 的一组 backend 中的某个pod上面。因为流量转发都是在内核进行的,所以性能更高更加可靠。

k8sservice4种模式,k8s,kubernetes,容器,云原生

缺点:

因为 iptables 的底层实现是链表,对路由规则的增删查改都需要遍历一次链表。iptables 模式最主要的问题是在 service 数量大的时候会产生太多的 iptables 规则,使用非增量式更新会引入一定的时延,大规模情况下有明显的性能问题

ipvs 模式

在 kubernetes v1.2 之后 ipvs 成为kube-proxy的默认代理模式。ipvs 是 LVS 的负载均衡模块,与 iptables 比较像的是,ipvs 的实现虽然也基于 netfilter 的钩子函数,但是它却使用哈希表作为底层的数据结构并且工作在内核态,也就是说 ipvs 在重定向流量和同步代理规则有着更好的性能,几乎允许无限的规模扩张。

k8sservice4种模式,k8s,kubernetes,容器,云原生

ipvs 支持三种负载均衡模式:

  • DR模式(Direct Routing);
  • NAT 模式(Network Address Translation);
  • Tunneling(也称 ipip 模式)。

三种模式中只有 NAT 支持端口映射,所以 ipvs 使用 NAT 模式。linux 内核原生的 ipvs 只支持 DNAT,当在数据包过滤,SNAT 和支持 NodePort 类型的服务这几个场景中ipvs 还是会使用 iptables。

ipvs 也支持更多的负载均衡算法:文章来源地址https://www.toymoban.com/news/detail-603730.html

  • rr:round-robin/轮询;
  • lc:least connection/最少连接;
  • dh:destination hashing/目标哈希;
  • sh:source hashing/源哈希;
  • sed:shortest expected delay/预计延迟时间最短;
  • nq:never queue/从不排队

到了这里,关于k8s之Service详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解K8S网络模型(包含Service讲解)

    无意中翻阅官方文档,看到了Kubernetes中的网络模型, 于是,开始学习,分享如下。 官方文档: 网络模型https://kubernetes.io/docs/concepts/services-networking/ Servicehttps://kubernetes.io/docs/concepts/services-networking/service/ 集群中的每个Pod会在集群范围内获取自己唯一的IP地址。 因此,Pod间不需

    2024年02月07日
    浏览(39)
  • K8s之Service四层代理入门实战详解

    官网中文参考文档: 1、Service四层代理概念 在K8S中Pod是有生命周期的,如果重启Pod如果Pod重启它的IP很有可能会发生变化,如果我们程序中指定Pod地址是写死的,Pod每升级一次,刚升级的Pod,集群中其他关联此Pod的服务就找不到升级的Pod。 为了解决上面问题,在K8S集群中定义

    2024年02月08日
    浏览(41)
  • k8s服务发现之第二弹Service详解

    Kubernetes Servies 是一个 RESTFul 接口对象,可通过 yaml 文件创建。 例如,假设您有一组 Pod: 每个 Pod 都监听 9376 TCP 端口 每个 Pod 都有标签 app=MyApp 上述 YAML 文件可用来创建一个 Service: 名字为 my-service 目标端口为 TCP 9376 选取所有包含标签 app=MyApp 的 Pod 关于 Service,您还需要了解

    2024年02月16日
    浏览(49)
  • K8S--service

    Service 是将集群中的 一个或一组 Pod应用程序公开为网络服务的方法。我们都知道pod是不稳定的,有可能时时刻刻都在创建和销毁,这一时刻运行的 Pod 集合可能不同于下一刻运行该应用的 Pod 集合,并且新创建的pod的ip地址会改变,所以我们不应该寄期望于pod的稳定性和可靠性

    2024年01月19日
    浏览(49)
  • k8s service

    程序在容器中、容器在Pod中,可以通过pod的ip来访问应用程序,但是podIP会随着创建销毁而改变。由此,Service出现: Service会对提供同一个服务的 多个pod进行聚合 ,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。 在整个Service的生命周期中

    2024年02月13日
    浏览(41)
  • k8s指南-Service

    目录: (1)k8s指南-概述 (2)k8s指南-架构 (3)k8s指南-工作负载(1) (4)k8s指南-工作负载(2) (5)k8s指南-工作负载(3) (6)k8s指南-工作负载(4) (7)k8s指南-Service (8)k8s指南-Ingress (9)k8s指南-DNS与服务发现 (10)K8S指南-平滑升级与自动扩缩容 在k8s集群中,虽然每个pod都会被分配一个单独的ip地址,但

    2024年02月08日
    浏览(38)
  • k8s service (三)

    K8s service (三) LoadBalancer类型的Service LoadBalancer和NodePort其实是同一种方式,目的都是向外暴露一个端口,区别在于LoadBalancer会在集群的外部再来做一个负载均衡设备,而这个设备需要外部环境支持的,外部服务发送到这个设备上的请求,会被设备负载之后转发到集群中     E

    2024年02月11日
    浏览(36)
  • k8s service (二)

    K8s  service (二) Endpoint Endpoint 是 kubernetes 中的一个资源对象,存储在 etcd 中,用来记录一个 service 对应的所有 pod 访问地址,它是根据 service 匹配文件中 selector 描述产生的。 一个 Service 由一组 Pod 组成,这些 Pod 通过 Endpoints 暴露出来, Endpoints 是实现是服务的端点集合。换句

    2024年02月12日
    浏览(35)
  • k8s&service服务发现

    Service的功能::::::::::::::::::::: 服务发现:发现pod的变化,宕机的不转发 对外发布:让外部访问到内部,稳定的对外映射一个端口号nodeport Service有两个ip,第一个是service内部访问用的 一个是向外提供服务的clusterip 定位dns,用dns解析  实例文件:

    2024年02月03日
    浏览(56)
  • K8S | Service服务发现

    服务发现与负载均衡。 在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问; 对于测试「Tes」环境或者生产「Pro」环境,出于安全或者环境隔离性来考虑,在正常情况下只会开放

    2024年02月14日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包