首页 > 其他分享 >25、资源对象-Service【理论-回顾】

25、资源对象-Service【理论-回顾】

时间:2023-03-22 12:44:32浏览次数:38  
标签:iptables 25 Service 回顾 ipvs 集群 Pod pod

1、基础知识

1.1、场景

通过对Pod及其管理资源RC和Deployment的实践,我们知道,我们所有的应用服务都是工作在pod资源
中,由于每个Pod都有独立的ip地址,而大量的动态创建和销毁操作后,虽然pod资源的数量是控制住了,但
是由于pod重新启动,导致他的IP很有可能发生了变化,假设我们这里有前端应用的pod和后端应用的pod,
那么再剧烈变动的场景中,两个应用该如何自由通信呢?难道是让我们以类似nginx负载均衡的方式手工定制
pod ip然后进行一一管理么?但是这是做不到的。
 Kubernetes集群就为我们提供了这样的一个对象--Service,它定义了一组Pod的逻辑集合和一个用
于访问它们的策略,它可以基于标签的方式自动找到对应的pod应用,而无需关心pod的ip地址变化与否,从而实现了类似负载均衡的效果.
 这个资源在master端的Controller组件中,由Service Controller 来进行统一管理。

1.2、简介

service是Kubernetes里最核心的资源对象之一,它是由coredns或者kube-dns组件提供的功能。每一个
Service都是一个完整的业务服务,我们之前学到的Pod、RC、Deployment等资源对象都是为Service服务的。

1.2.1、Service关系图

 

1.2.2、关系图解析

 Kubernetes 的 Service定义了一个服务的访问入口地址,前端的应用Pod通过Service访问其背后
一组有Pod副本组成的集群示例,Service通过Label Selector访问指定的后端Pod,RC保证Service的
服务能力和服务质量处于预期状态。
   Service是Kubernetes中最高一级的抽象资源对象,每个Service提供一个独立的服务,集群
Service彼此间使用TCP/IP进行通信,将不同的服务组合在一起运行起来,就行了我们所谓的"系统"

1.2.3、Service系统图

1.2.4、总结

我们知道每个Pod都有一个专用的IP地址,加上Pod内部容器的Port端口,就组成了一个访问Pod专用的
EndPoint(Pod IP+Container Port),从而实现了用户外部资源访问Pod内部应用的效果。
这个EndPoint资源在master端的Controller组件中,由EndPoint Controller 来进行统一管理。

1.3、原理解析

1.3.1、负载均衡

当多个Pod组成了一个业务集群来提供外部服务,那么外部客户端怎么才能访问业务集群服务呢?
说到外部用户来访问内部集群的场景,肯定能想到的负载均衡的案例:
nginx的upstream功能 或 LVS+keepalived功能

所有的Pod都有专用的 RIP,多个Pod副本就组成了一个Kubernetes集群的后端服务,根据对上面负载
均衡图的理解,我们需要配置一个vip。当客户端访问的请求过来后,Master结点通过VIP把客户端的请求,
负载均衡到后端的Pod副本即可。
   我们知道,Pod是工作在不同的Node节点上,而Node节点上有一个kube-proxy组件,它本身就是一个
软件负载均衡器,在内部有一套专有的负载均衡与会话保持机制,可以达到,接收到所有对Service请求,进
而转发到后端的某个具体的Pod实例上,相应该请求。

-- kube-proxy 其实就是 Service Controller位于各节点上的Agent。

1.3.2、Pod所处的Node场景分类

根据Pod所处的Node场景,有两种情况:
所有Pod副本都在同一Node节点上:
 对于这种情况,将Node节点专用的物理ip,作为负载均衡器的VIP,即可实现负载均衡后端服务的效
果。
所有Pod副本不在同一Node节点上:
 Node节点的物理ip就没有办法作为负载均衡器的VIP了,这就出现了一种常见的意外情况。
 
而Kubernetes是一个分布式的资源管理平台,所以Kubernetes集群资源对象肯定不能保证在同一台Node节
点,所以就不能使用Node节点的物理ip地址作为负载均衡器VIP地址了。

1.3.3、Node节点 VIP访问的解决方法

Kubernetes发明了一种设计,给Service分配一个全局唯一的虚拟ip地址--cluster IP,它不存在任何
网络设备上,Service通过内容的标签选择器,指定相应该Service的Pod资源,这样以来,请求发给
cluster IP,后端的Pod资源收到请求后,就会响应请求。
这种情况下,每个Service都有一个全局唯一通信地址,整个系统的内部服务间调用就变成了最基础的
TCP/IP网络通信问题。如果我们的集群内部的服务想要和外部的网络进行通信,方法很多,比如:
   NodePort类型,通过在所有结点上增加一个对外的端口,用于接入集群外部请求
   Ingress类型,通过集群附加服务功能,将外部的域名流量转交到集群内部。

1.3.4、Service vs Endpoint

1、当创建 Service资源的时候,最重要的就是为Service指定能够提供服务的标签选择器,
2、Service Controller就会根据标签选择器创建一个同名的Endpoint资源对象。
3、Endpoint Controller开始介入,使用Endpoint的标签选择器(继承自Service标签选择器),筛选符合条件的pod资源
4、Endpoint Controller 将符合要求的pod资源绑定到Endpoint上,并告知给Service资源,谁可以正常提供服务。
5、Service 根据自身的cluster IP向外提供由Endpoint提供的服务资源。

-- 所以Service 其实就是 为动态的一组pod资源对象 提供一个固定的访问入口。

2、工作模型

2.1、代理模型

2.1.1、简介

一个Service对象,对于当前集群的节点来说,就是工作节点上的一些iptables或ipvs规则,这些规
则由kube-proxy进行实时维护,kube-proxy将请求代理至相应端点的方式有三种:userspace/iptables/ipvs。

这些方法的目的是:kube-proxy如何确保service能正常工作。

2.1.2、UserSpace-代理模型

userspace模型是k8s最早的一种工作模型,从1.1版本就开始使用。他的作用就是将service的策略转换成iptables规则,这些规则仅仅做请求的拦截,而不对请求进行调度处理。
该模型中,请求流量到达内核空间后,由套接字送往用户空间的kube-proxy,再由它送回内核空间,并调度至后端Pod。因为涉及到来回转发,效率不高

2.1.3、iptables-代理模型

 

iptables模式在1.10版本开始使用。
为Service创建iptables规则,直接捕获到达ClusterIP和Port的流量,并重定向至当前Service的后
端。对每个Endpoints对象,Service资源会为其创建iptables规则并关联至挑选的后端Pod资源
优点:性能比userspace更加高效和可靠
缺点:
 不会在后端Pod无响应时自动重定向,而userspace可以
 中量级k8s集群(service有几百个)能够承受,但是大量级k8s集群(service有几千个)维护达几万条规则,难度较大

2.1.4、ipvs-代理模型

 

自1.11版本起为默认设置
请求流量的调度功能由ipvs实现,余下的其他功能仍由iptables完成
ipvs流量转发速度快,规则同步性能好,且支持众多调度算法,如rr/lc/dh/sh/sed/nq等
安装特点:echo 'KUBE_PROXY_MODE=ipvs' >> /etc/sysconfig/kubelet
优点:
 每条ipvs规则包含了两个功能:转发功能和调度功能
 
注意:
 对于我们kubeadm方式安装k8s集群来说,他会首先检测当前主机上是否已经包含了ipvs模块,如果加
载了,就直接用ipvs模式,如果没有加载ipvs模块的话,会自动使用iptables模式。

2.2、service & kube-proxy-关联关系

2.2.1、关联关系描述

1、Service作为一个资源对象,他会在在API Service服务中定义出来的。
2、Service Controller 触发每个节点上的kube-proxy,由kube-proxy实时的转换为本地的
ipvs|iptables规则。
3、默认情况下,内核中的ipvs|iptables规则,仅仅是负责本地节点用户空间pod客户端发出请求时的拦截
或者转发规则
4、如果pod客户端向Service发出请求
 pod客户端向内核发出请求,根据ipvs|iptables规则,匹配目标service
如果service匹配到的话,会返回当前service随对应的后端endpoint有哪些
 iptables|ipvs会根据情况挑选一个合适的endpoint地址
 - 如果endpoint是本机上的,则会转发给本机的endpoint
 - 如果endpoint是其他主机上的,则转发给其他主机上的endpoint

3、Service类型

对于k8s来说,内部服务的自由通信可以满足我们环境的稳定运行,但是我们作为一个平台,其核心功能还是
将平台内部的服务发布到外部环境,那么在k8s环境平台上。Service主要有四种样式来满足我们的需求。

3.1、ClusterIP 

这是service默认的服务暴露模式,主要针对的对象是集群内部。

3.2、NodePort

基于ClusterIP方式对外提供服务,端口范围 30000~32767 
NodePort是一个随机的端口,在所有节点上都会存在。

3.3、LoadBalancer

基于NodePort之上,使用运营商负载均衡器方式实现对外提供服务
底层是基于IaaS云创建一个k8s云,同时该平台也支持LBaaS产品服务

3.4、ExternalName

当前k8s集群依赖集群外部的服务,那么通过externalName将外部主机引入到k8s集群内部
外部主机名以 DNS方式解析为一个 CNAME记录给k8s集群的其他主机来使用
这种Service既不会有ClusterIP,也不会有NodePort.而且依赖于内部的CoreDNS功能

 

标签:iptables,25,Service,回顾,ipvs,集群,Pod,pod
From: https://www.cnblogs.com/ygbh/p/17242982.html

相关文章

  • Unable to cast object of type in System.DirectoryServices.AccountManagement.Grou
    在使用​​UserPrincipal.Current.ToString()​​获取域登录用户信息时,本地调试没有问题,上传到服务器报错Unabletocastobjectoftype'System.DirectoryServices.Accoun......
  • 25.封装、继承、多态
    封装、继承、多态一、封装1.高内聚,低耦合高内聚就是类的内部数据操作细节自己完成,不允许外部干涉。低耦合就是仅暴露少量的方法给外部使用。2.数据的隐藏通常,应禁止......
  • @Service注解为什么不能使用在接口上
    @Service注解为什么不能使用在接口上,而是写在实现类上这个问题从开始学习就有关注,但是一写@Service注解就会想到,不知道为啥要写在实现类上,好记性不如烂笔头,记录一下。接......
  • Rocky Linux 系列7 --- Service
    一、概要1.环境(1)RockyLinux9.12. systemdsystemd是Linux系统下的服务(Service)管理工具,从RHEL7开始systemd作为默认的系统管理工具。它具备以下功能:(1)按需......
  • SERVICE_UNAVAILABLE/1/state not recovered / initialized
    #情境首先,我在本地虚拟机中,成功启动了elasticsearch服务,具体没有细看启动日志不过在关闭防火墙和修改访问IP之后,可以通过浏览器访问es服务:http://IP:9200后来通过elasticse......
  • windows 下,获取文件的md5值、sha1、sha256值
    windows下,cmd窗口执行下列指令可获取对应的加密值certutil-hashfilefilenameMD5certutil-hashfilefilenameSHA1certutil-hashfilefilenameSHA256linux下,直接......
  • 创建controller/service/mapper/impl过程
    先创建entity包,在里面导入实体类然后创建controller/mapper/service包然后在service里创建impl包然后在mapper包里写mapper接口,加上@Mapper注解,继承BaseMapper<Employee......
  • Windows Service 服务中,不能访问挂载目录(网络映射盘)
    WindowsService服务中,不能访问挂载目录(网络映射盘)网盘挂载(映射网络驱动器)详见:https://www.cnblogs.com/vipsoft/p/17059153.html测试代码@GetMapping("/network")pu......
  • AOP面向切入实现service层嵌入缓存
    缓存方法:Srping+Ehcache在Service层配置缓存[url]http://panyongzheng.iteye.com/blog/2234167[/url]AOP面向切入实现service层嵌入缓存//放入......
  • CVE-2019-1256漏洞分析
    0x00漏洞信息漏洞影响:本地提权漏洞文件:win32kfull.sys漏洞函数:GreGradientFill漏洞原因:空指针引用分析系统:Windows1903【漏洞分析合集】0x01漏洞分析崩溃时的堆栈......