细致解析:kubernets整体架构

一、Kubernetes 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心。

建于 Docker 之上的 Kubernetes 可以构建一个容器的调度服务,其目的是让用户透过 Kubernetes 集群来进行云端容器集群的管理,而无需用户进行复杂的设置工作。系统会自动选取合适的工作节点来执行具体的容器集群调度处理工作。其核心概念是 Container Pod。一个 Pod 由一组工作于同一物理工作节点的容器构成。这些组容器拥有相同的网络命名空间、IP以及存储配额,也可以根据实际情况对每一个 Pod 进行端口映射。此外,Kubernetes 工作节点会由主系统进行管理,节点包含了能够运行 Docker 容器所用到的服务。


二、架构模型为master/nodes(work)

可以理解master为蜂后,nodes为工蜂(干活的)

  1. master为集群唯一入口,需要做高可用。
  2. 每一个node节点都提供一部分计算能力和存储能力。(运行容器的节点)

请求过程

1 客户端请求(创建启动容器)首先发往master,master当中有一个调度器,会去分析各node节点的资源状态.
2 找一个最佳适配运行用户所请求的容器的节点,并把它调度上去,由这个node的docker或是其他容器引擎来负责把这个容器启动起来。
3 启动容器时检查本地是否有镜像,如果没有需要从镜像仓库中pull来启动(镜像仓库可以是云上的,也可以是自检的私有仓库,也可以以容器运行在node节点上)。


三、Master集群组件

  • API Server 接收并处理用户请求
  • Scheduler 调度容器创建的请求
### 两级调度
#### 第一步:先做预选
1. 评估各node有几个是符合需求的
#### 第二部:再做优选
2. 再从符合需求中的几个选出最优的(优选算法)
> 负责观测每一个node之上总共可用的计算和存储资源,并根据用户所请求创建的容器所需要的资源量来评估
  • controller-manager 确保已创建的容器处于健康状态

    控制器管理器是确保控制器健康的,控制器是用来确保容器健康的。

  • label selector 可以通过控制器给pod打标签,之后控制器可以根据tag来识别出pod

    创建pod时可以给pod直接打上一个标签,然后让控制器通过标签的值来识别出pod来


四、Node集群组件

  • kubelet 与apiserver交互运行的,接收并处理master调度过来的各种任务。
  • docker 运行pod中的容器
    • 在K8s上运行的最小单元不是容器,而是pod
    • kubernets并不直接调度容器,而是调度pod,pod是对容器的一层封装。
    • pod里可以有多个容器,他们共享同一网络协议栈,存储卷
    • 一般一个pod只有一个容器
  • kube-proxy 与apiserver进行通信,每一个pod发生变化,结果是需要保存到apiserver中,apiserver会生成一个通知事件,该事件可以被任何关联的组建所接收到, 管理service,service的创建及变动是依靠kube-proxy在iptables上创建出规则

Pod简介

pod中的每一个容器有自己的user,mnt,pid的名称空间,然后他们共享pod的net,uts,ipc的名称空间。
一般一个pod中只有一个容器,除非容器之间有特别特别紧密的关系需要放在同一pod中,如果一个pod放置了多个容器,通常有一个为主容器,其他容器来辅助主容器上的应用程序完成更多功能来实现。
创建pod时可以给pod直接打上一个标签,然后让控制器通过标签的值来识别出pod来

由于pod为kubernet集群中的原子单元,是不可再分割的,一个pod中无论是一个容器还是多个容器,当pod被master调度至某一node上时,这个pod中的所有容器都被调度到了一台node上

  1. 自主式Pod

    自我管理,创建后仍然要提交给apiserver,由apiserver将其调度至指定的node的节点,由node启动此pod,如果一个pod中的容器出现故障,需要重启容器,需要又kubelet来完成。但是,如果节点故障了,该容器就消失了。无法实现全局进行调度。

  2. 控制管理的Pod

    正是有控制器机制的引入使得pod成为有生命周期的对象,而后由调度器将其调度至集群中的某节点运行以后,有一些任务作为守护进程运行为pod或容器,要确保它们随时处于运行状态,一旦发生故障,要随时重启它或者替代它。

pod控制器种类

  • Replication Controller

    • 多退少补,必须精确符合人定义的期望
    • 滚动更新(类似用户无感知发布)
    • 回滚
  • ReplicaSet
  • Deployment 只能管理无状态应用
  • StatefulSet 管理有状态的应用
  • DaemonSet 每个node上运行一个副本,而不是随意运行
  • Job,Cronjob 运行作业或者周期性作业
    • 有些任务是临时需要而运行,运行完以后结束,这种不需要一直处于运行状态,可以运行为一个job
  • HPA(HorizontalPodAutoscaler) 自动监控并系统负载分析添加或减少pod


服务发现功能

每重新生成一个pod都是一个全新的pod,比如ip地址和主机名之前的是不一样的。
kubernets为每一组提供同类服务的pod和它的客户端之间添加了一个中间层,这个中间层(service)是固定的,service再将客户端请求端口代理至后端pod上(通过dnat规则 ),一旦其中一个pod宕机了,一个新的pod会立即被关联上来(通过标签选择器,具有相同标签的来关联起来),然后在动态探测新关联的pod的ip地址和主机名.


五、k8s网络模型

  1. pod网络。各pod运行在同一个网络,pod的网络地址是真实的地址,存在于它的网络名称空间当中。
  2. service网络(集群网络)。service地址不是真的地址,存在于iptables中或者ipvs规则中。
  3. 节点网络 。

六、k8s通信分类

  1. 同一pod内的多个容器间:lo网络
  2. 各pod之间通信。(overlay network,叠加网络)

    各pod之间直接通信,无论pod运行在哪个节点之上,各pod的地址是不应该也绝对不可以相同。

  3. pod与servic之间通信

    service地址只不过是主机上的一条iptables规则中的地址,所以需要配置一下目标地址不是自己的指向网关。每个主机上都应该有所有的service的地址规则。当pod试图访问service的地址时,首先将请求送给网关(一般为docker0桥),然后docker0桥通过内核发现当前访问的地址为一条iptables或ipvs规则,然后将请求送达。

之前说过,当service后端的node节点宕机,pod的控制器通过标签选择器会自动创建一个新的pod并加入至该服务中,而node中的另一个组件,kube-proxy 在此时会将service的变动存储在master上的api server中,然后api server生成通知事件,又kube-porxy将iptables规则的变化反映至每一个节点的iptables规则上。

七、etcd k8s的存储

Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息。

存储集群的所有变化信息以及网络配置,非常重要,所以需要做高可用。

八、k8s集群组成要件

如图所示,每一个服务都有一个service,用来调度请求流量。如果其中的某个服务中的pod宕机了,pod控制器会自动创建一个新的pod并加入到该服务中。不同的pod的控制器通过pod标签来管理其所属的pod。当然k8s集群内部也是需要主机名来表示不同的主机的,提供dns服务的也是通过pod,同样的它也有一个service,也有一个pod控制器来管着的dns的pod。


总结。

画了个图总结一下整个的k8s集群,如下。


喜欢我写的东西的朋友可以关注一下我的公众号,上面有我的学习资源以及一些其他福利。:Devops部落

原文地址:https://blog.51cto.com/dashui/2358613

时间: 2024-10-31 01:13:15

细致解析:kubernets整体架构的相关文章

1.1 Spring的整体架构--Spring源码深度解析

前言: Spring 始于2003年,轻量级 Java 开源框架. Spring 是为了解决企业应用开发的复杂性而创建的,它使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情. Spring 的用途不仅限于服务器端的开发,从简单性.可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益. Spring 的整体架构: Spring 框架是一个分层架构,被分为大约20个模块. (1)Core Container Core Container (核心容器)包含

jQuery整体架构源码解析

最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹. 另外,阅读源码让我接触到了大量底层的知识.对原生JS .框架设计.代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章. 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下

tomcat原理解析(二):整体架构

一 整体结构 前面tomcat实现原理(一)里面描述了整个tomcat接受一个http请求的简单处理,这里面我们讲下整个tomcat的架构,以便对整体结构有宏观的了解.tomat里面由很多个容器结合在一起,主要有server,service,context,host,engine,wrapper,connector这7个容器来组装.当然了tomcat里面还有其它容器这里就不一一列举,因为我只看重点的.这7个容器存着父子关系,即可以通过当前容器找自己的父容器和自己的子容器.说到这我画了一个简单的结

【Spring源码深度解析系列 】Spring整体架构

一.Spring的整体架构和模块 二.模块分类: 1.Core Container Core Container包含有Core .Beans.Context.和Expression  Language模块 2.Data Access/Integration Data Access/Integration包含有JDBC.ORM.OXM.JMS和Transaction模块 3.Web Web层包含了Web.Web-Servlet.Web-Struts.Web-Porlet模块. 4.AOP 5.Te

【深入浅出jQuery】源码浅析--整体架构(转)

最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹. 另外,阅读源码让我接触到了大量底层的知识.对原生JS .框架设计.代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章. 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下

【深入浅出jQuery】源码浅析--整体架构

最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹. 另外,阅读源码让我接触到了大量底层的知识.对原生JS .框架设计.代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章. 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下

解构jQuery之jQuery整体架构

在前端开发过程中必然绕不开jQuery库,移动端zepto.天天用到的一个库,很久就想通读一下源码,行动力不够一直没有执行……现在终于开始学习它,参照网上大神的博文和教程辅助自己学习.自己同时也构建一个自己的jQuery库,体验造轮子的整个过程.计划就是这样子啦,下面就是行动! jQuery源码可以精简为以下内容: 方框上面的代码是对AMD规范的支持. jQuery整体上被包裹在一个匿名函数中,这个匿名函数再作为另一个匿名函数的参数被传入,形参factory. "()"圆括号包裹函数声

转:Socket服务器整体架构概述

Socket服务器主要用于提供高效.稳定的数据处理.消息转发等服务,它直接决定了前台应用程序的性能.我们先从整体上认识一下Socket服务器,Socket服务器从架构上一般分为:网络层.业务逻辑层.会话层.数据访问层,如图: (图1) (一) 网络层 网络层主要用于侦听socket连接.创建socket.接受消息.发送消息.关闭连接.作为socket通信服务器,网络层的性能相当重要,所以我们在设计网络层时,要着重在以下几方面获得突破:最大连接数.最大并发数.秒处理消息数.如何突破呢?下面我为大家

Biztalk学习第一章(整体架构)

Biztalk运行时的结构 BizTalk Server 本质上就是消息处理引擎.个人认为在了解Biztalk之前必须要知道的一部分便是BizTalk Server 的整体架构,只有对架构烂熟于心这样才能为往下深入学习做好基础. 首先来看一下Biztalk的整体架构图 如上图所示,完整的绘制了Biztalk在接受端口接收到文件后整个处理文件的过程. 接下来分开叙述:(参照微软官方文档) 接收端口和接收位置 "接收端口"是一个或多个接收位置的集合,是BizTalk Server 的特定入