首页 > 其他分享 >创建service后,kubernetes会发生什么

创建service后,kubernetes会发生什么

时间:2024-01-11 14:11:57浏览次数:32  
标签:Endpoint kubernetes service 创建 Service 集群 Pod 资源

本文分享自华为云社区《当创建一个service后,kubernetes会发生什么?》,作者:可以交个朋友。

一、Service介绍

1.1 Kubernetes为什么会引入service?

考虑到集群中Pod实例IP地址随着工作负载的生命周期的变化,常规通过访问Pod实例的IP方法变得不再实用。

每个工作负载通常有一个或者更多个后端Pod实例,如何将流量请求做到负载均衡转发也是迫在眉睫。

1.2 Service概念

service用于一组提供服务、具有相同 label Pod的抽象集合的网络访问地址(包括网络协议IPv4/IPv6地址和服务域名地址),提供集群内/外访问通信,屏蔽后端实例Pod信息并为后端Pod实例提供负载均衡的能力。

1.3 Kubernetes中存在哪些类型的service?

clusterIP:Kubernetes集群默认自动设置service的虚拟IP地址,仅可被集群内的其他客户端访问。

NodePort:将service的端口映射到每个Node的(指定/随机)端口,供集群外客户端通过集群任一节点的IP地址+(指定/随机)端口访问,即NodePort。

LoadBalancer:将service映射到一个已存在的负载均衡器IP地址上,此service方式多见于云厂商。

ExternalName:通过在集群内创建该类service,可将集群外部服务引入至集群内,供集群内其他服务通过IP地址或域名地址访问。

Headless service: 在一些特殊场景中,客户端访问不需要kubernetes中service实现的负载均衡功能,而是由客户端直接去发现/选择服务端的后端实例访问,就需要一种特殊的服务“Headless service”。这是一种没有访问入口(即service没有IP地址)的service。kube-proxy不会为这种类型的service(Headless service)创建iptables/ipvs转发规则。

二、Service、Endpoint、Pod以及与kube-proxy组件的关联协作结构示意图

下图是一个实际访问Service的图示,PodX访问Service(10.247.124.252:8080),在发送数据包时,在节点上根据iptables规则,目的IP:Port被随机替换为后端Pod组中某一个Pod的IP:Port,从而通过Service转发到到实际的Pod。从这里也可以看出,service对应的ip(clusterip)不是一个真实的ip地址,是通过节点kube-proxy组件通过刷新节点iptables或者ipvs规则,将四层报文的目的ip从clusterip DNAT转换为podip做通的通道。集群外节点没有kube-proxy组件去刷新相关规则,是集群外节点无法访问clusterip的本质原因。

cke_117.png

三、Service创建流程图以及解读

3.1 Service创建后,各个组件协同关系介绍

cke_118.png

用户使用通过kubectl客户端发起创建service资源对象请求至api-server。

api-server对请求用户鉴权、准入控制操作,然后将该请求事件写入到etcd存储中。

考虑到Endpoint-controller采用非阻塞式长连接watch机制实时获取service资源对象信息,一旦集群中有service变化(包括创建、更新、删除),则通过apiserver获取etcd中相关service资源对象。且通过service资源对象中lable字段遍历、关联相关Pod资源。

api-server将相关service资源信息和pod资源信息返回给Endpoint-controller的watch接口长连接。

Endpoint-controller通过获取的service和pod资源对象生成对应的Endpoint资源对象,并将结果通过调用api-server写入etcd。

api-server将endpoint资源写入到etcd做持久化存储

考虑到kube-proxy采用非阻塞式长连接watch机制实时获取service资源对象和endpoint资源对象信息,一旦集群中有service和Endpoint变化(包括创建、更新、删除),则通过apiserver获取etcd中相关资源对象。

api-server将相关service资源信息和Endpoint资源信息返回给kube-proxy 的watch接口长连接。

每个节点上kube-proxy组件进程生成节点系统iptables规则或ipvs规则。

3.2 EndpointController能力说明

Endpoint也是Kubernetes集群中的一个资源对象,存储在Etcd中。Endpoint-controller控制器通过监听集群内Service和Pod资源对象的变化,管理维护Endpoint的生命周期。

监听到service创建,则创建同名的Enpoint资源,然后根据service的标签,获取集群中关联的Podip和相关端口生成Endpoint资源对象。。

监听到service更新,则根据更新后的service信息获取关联的Pod的信息,更新对应Enpoint对象。

监听到service删除,则删除与service同名的endpoint。

如果监听到Pod发生变化,则更新endpoint对象的Pod IP列表,将异常的Pod从endpoint后端列表中剔除,恢复或者新建后加入到Endpoint的列表中。

 

点击关注,第一时间了解华为云新鲜技术~

 

标签:Endpoint,kubernetes,service,创建,Service,集群,Pod,资源
From: https://www.cnblogs.com/huaweiyun/p/17958478

相关文章

  • 11-K8 Service:轻松搞定服务发现和负载均衡 (copy)
    经过前面几节课的学习,我们已经可以发布高可用的业务了,通过PV持久化地保存数据,通过Deployment或Statefulset这类工作负载来管理多实例,从而保证服务的高可用。想一想,这个时候如果有别的应用来访问我们的服务的话,该怎么办呢?直接访问后端的PodIP吗?不,这里我们还需要做服务发现(S......
  • Spring创建的单例对象,存在线程安全问题吗?
    这个问题涉及到Spring框架中的Bean的作用域、单例模式的线程安全性以及如何判断和处理线程安全问题。让我们一步步深入探讨这些概念。SpringBean的作用域Spring提供了几种不同的Bean作用域,包括:1、 Singleton(单例): 默认作用域,保证每个Spring容器中只有一个Bean实例。2、 Prot......
  • Oracle 21c-创建数据库
    1、创建数据库报错‘ORA-01501:CREATEDATABASE失败,ORA-01100:数据库已装载’  执行‘CREATEDATABASETest12;’时报错如下:  2、原因及正确创建数据库的方法  oracle自12C版本开始后,有了多租户的概念(PDB和CDB);可使用创建用户的方式创建数据库。,语句如下:    cre......
  • 快速掌握服务网格系列二:云原生、K8S、服务网格(Service Mesh)及微服务之间的关系
    快速掌握服务网格系列二:云原生、K8S、服务网格(ServiceMesh)及微服务之间的关系首先看下CNCF对云原生的定义:Cloudnativetechnologiesempowerorganizationstobuildandrunscalableapplicationsinmodern,dynamicenvironmentssuchaspublic,private,andhybridcl......
  • 微信小程序创建formdata对象,并通过 wx.request 发送file文件
    本文申明:仅作学习使用需求:需要绕过wx.uploadFile进行图片的传输,通过接口给服务器问题:因涉及到域名安全问题,不能使用wx.uploadFile。微信本身没有FormData对象,无法使用newFormData后端接口需要接收一个file,所以只能想办法,通过wx.request发送multipart/form-data请......
  • 【MITK框架】如何创建插件Plugin
    以创建org.mitk.example.gui.xxxxx为例1、修改D:\0_MITK\MITK\Examples\Plugins\PluginList.cmake添加org.mitk.example.gui.xxxxx:ONset(MITK_EXAMPLE_PLUGINSorg.mitk.example.gui.minimalapplication:ONorg.mitk.example.gui.customviewer:ONorg.mitk.example.gui......
  • 如何使用Highcharts创建响应式数据可视化
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • 如何使用Highcharts创建温度计图表
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • 如何使用Highcharts创建雷达图表
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • 如何使用Highcharts创建交互式数据可视化
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......