本文分享自华为云社区《当创建一个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的本质原因。

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

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

用户使用通过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的列表中。

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

创建service后,kubernetes会发生什么的更多相关文章

  1. 运行一个nodejs服务,先发布为deployment,然后创建service,让集群外可以访问

    问题来源 海口-老男人 17:42:43 就是我要运行一个nodejs服务,先发布为deployment,然后创建service,让集群外可以访问 旧报纸 17:43:35 也就是 你的需求为 一个a ...

  2. 【Azure微服务 Service Fabric 】使用az命令创建Service Fabric集群

    问题描述 在使用Service Fabric的快速入门文档: 将 Windows 容器部署到 Service Fabric. 其中在创建Service Fabric时候,示例代码中使用的是PowerS ...

  3. laravel5如何创建service provider和facade

    laravel5如何创建service provider和facade laravel5创建一个facade,可以将某个service注册个门面,这样,使用的时候就不需要麻烦地use 了.文章用一个例 ...

  4. 宝塔控制面板创建ftp后链接不上的解决方法

    很多的新手在安装宝塔面板并且创建完ftp管理后链接ftp居然链接不上?有许多朋友都不知道本站q302博客也是基于宝塔控制面板管理的,本站在安装网站完成后也和你们一样ftp链接不上,后面经过多次测试之后 ...

  5. C#使用File.Create()创建文件后资源被占用

    由于文件被占用不能读写,所以报错“另一个程序正在使用此文件进程无法访问” 解决方法是在创建文件后立即Dispose掉 File.Create(path).Dispose();

  6. c++ Pthread创建线程后必须使用join或detach释放线程资源

    http://www.cppblog.com/prayer/archive/2012/04/23/172427.html 这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthre ...

  7. iis6手工创建网站后无法运行php脚本

    给人搬了十几个网站,老站用西部数码建站助手创建的,现在过期了无法继续创建,只能在Internet 信息服务(IIS)管理器创建网站,创建下来都没问题,但是就是无法打开网站. 测试打开txt文档.静态页 ...

  8. collection 在创建迭代器后 不能在添加数据 否则会出现并发问题

    collection 在创建迭代器后 不能在添加数据 否则会出现并发问题

  9. 创建线程后马上CloseHandle(threadhandle)起什么作用

    原文:http://www.cnblogs.com/eddyshn/archive/2010/04/14/1711674.html HANDLE threadhandle = CreateThread ...

  10. 使用myeclipse创建servlet后输入地址无法访问

    问题: 使用myeclipse创建servlet后输入地址无法访问 1.首先,路径的访问地址是在web.xml里设置的,一般会自动生成(但是可能会和你自己输入的有出入) 你必须按照<url-pa ...

随机推荐

  1. Go函数介绍与一等公民

    Go函数介绍与一等公民 函数对应的英文单词是 Function,Function 这个单词原本是功能.职责的意思.编程语言使用 Function 这个单词,表示将一个大问题分解后而形成的.若干具有特定 ...

  2. Android Studio里导入制作好的图片后,直接报错,图片名下方出现红色波浪线

    症状:Android Studio里导入制作好的图片后,直接报错,图片名下方出现红色波浪线. 比如:bk_Image_BackGround,报红 解决办法:如:bk_Image_BackGround, ...

  3. Hyper-V 下的 Debian 双网卡配置

    Debian 双网卡配置 因为 Hyper-v 不能在 Hyper-v Manger 里设置网卡的静态 IP, 而每次开机自启之后又要连接 Debian 虚拟机,所以使用了双网卡. 双网卡分为内网网卡 ...

  4. 大一下c语言课程设计

    // // main.c // 高级语言课程设计图书管理系统 // // Created by 蔡星旖 on 2022/8/1. // #include <iostream> #inclu ...

  5. 比较并交换(compare and swap, CAS)

    比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生 ...

  6. Windows下SVN服务端(Subversion)及客户端(TortoiseSVN)详细安装教程

    1. Subversion和TortoiseSVN 是什么? http://www.uml.org.cn/pzgl/200811146.asp Subversion 是什么,我想如果不知道的话就没有必 ...

  7. (转)用GPU做DeepLearning要比CPU快40~80倍

    The speed difference of CPU and GPU can be significant in deep learning. But how much? Let's do a te ...

  8. 手把手教你如何扩展(破解)mybatisplus的sql生成

    mybatisplus 的常用CRUD方法 众所周知,mybatisplus提供了强大的代码生成能力,他默认生成的常用的CRUD方法(例如插入.更新.删除.查询等)的定义,能够帮助我们节省很多体力劳动 ...

  9. JavaScript高级程序设计笔记07 迭代器与生成器

    迭代器与生成器 1.迭代 反复多次执行一段程序,(有明确的终止条件) 迭代器.生成器 ES6 计数循环(for):最简单的迭代 迭代次数.迭代每次执行的操作 (顺序已知) 古早迭代(有序->数组 ...

  10. go基础-函数

    概述 在任何语言中函数都是极其重要的内容,业务功能都是由一个或多个函数组合完成.go语言是函数式编程语言,函数是一等公民,可以被传递.有函数类型,go语言有三种类型的函数,普通函数.匿名函数(Lamb ...