开发者学习笔记【阿里云云原生助理工程师认证(ACA)课程:容器技术基础-Kubernetes 概念与架构】
课程地址:https://edu.aliyun.com/course/3112075/lesson/19013
容器技术基础-Kubernetes 概念与架构
内容介绍:
一、Kubernetes 核心概念
二、Kubernetes 架构
一、Kubernetes 核心概念
(1)pod
Kubernetes 的核心概念是 pod,它作为容器的扩容机制解决了很多问题,它将容器归类为一体,形成一个容器体,就是我们说的 pod,pod 集群可承载任务的原子单元。
一个 pod 实际上分装了多个容器化的应用,用于帮助用户调度工作,负载,并为这些容器提供所需的联网和存储服务。Kubernetes其他部分可以帮助用户在这些pod之间达成负载均衡,确保运行正确的数量容器,以充分来支持实际的工作负载。
我们可以理解为 Pod 是 Kubernetes 中能够创建和部署的最小单元,是 Kubernetes 实际的一个应用实例。在Kubernetes上,它并不是以Docker的容器方式去运行,而是以pod的方式来运行一个实例。一个pod总是部署在同一个节点的node上,Pod集群是可承载任务的原子单位。 Pod不仅仅支持这Docker样的一个环节,还是支持多种容器的环境。Docker是现在最流行的一个事实标准的技术。
Pod可以给我们带来哪些好处呢?
1.首先Pod作为一个可以独立运行的服务单元,解放了应用部署的难度,以更高的抽象性为应用部署提供了极大的方便。
2.Pod作为最小的应用实例可以独立运行,可以方便的进行部署,包括水平扩展以及水平收缩,方便进行资源的调度管理,资源的合理分配。
3.pod中的容器共享相同的数据和网络空间,它们之间可以进行统一的资源管理与分配。
4.pod也有自己的生命周期,像单独的容器应用一样,pod并不是持久运行。pod创建后Kubernete为其分配一个uid,并且Container调度到 node 中运行,然后 pod 一直保持运行状态直到运行结束或者被删除。在node 发生故障时,Container负责将其调动到其他的node 中。node和容器的运行时是比较相似的,可能随时会被停止,启停或发生故障。由于其他的节点来去承担这个 pod 工作。这就是pod 一个核心概念,它是供你部署和创建的最小单元,Kubernetes集群中的一个应用实例。
(2)volume
第二个核心概念是volume,volume就是劵的概念, 它是用来管理Kubernetes存储的,是用来声明pod中的容器可以访问的文件目录。pod本身是不储存数据的,需要定制一个底层可以访问的文件目录。一个劵可以在挂在pod中一个或多个的容器指定的目录下。
volume本身也是一个抽象概念,一个 volume可以支持多种后端存储,比如Kubernetes volume就支持很多的存储插接的方式,它可以支持本地存储,也可以支持云的存储,还可以支持一些分布式的存储,还有阿里云上的云盘等。
默认情况下Docker容器中的数据是非持久化的,在容器消亡后数据也会消失,因此Docker提供了Volume机制以便实现数据的持久化。Kubernetes中 Volume 的概念与Docker 中的 Volume 类似,但不完全相同。区别主要在Kubernetes中的Volume 与pod的生命周期相同,但与容器的生命周期不相干,但容器终止或重启时Volume中的数据不会丢失,但pod被删除时,Volume才会被清理,并且数据是否丢失取决于Volume的具体类型。比如,App DIR类型的pod数据会丢失,而PV类型的数据则不会丢失。 要了解volume是pod中能够被容器共享的磁盘目录,要理解持久化的理念。
(3)deployment
第三个核心概念 deployment,Deployment是在 pod 这个抽象上更为擅长的一个抽象,它可以定义一组pop的复合数,以及这个pod的版本。
一般我们用Deployment这个抽象来做应用真正的管理。pod是组deploy最小的单元。 一般情况下,我们并不会直接去创建某一个pod的,而是先创建Development,然后通过Development再去创建pod。由Development负责创建、更新、维护管理所有pod。Kubernetes是通过controller,也就是我们刚才提到的控制器去维护Deployment中的pod数目, 他也会去帮助Deployment自动恢复失败的pod。
比如说我们定义了一个Deployment。 这个Deployment里面需要两个pod。 当一个pod失败的时候,控制器就会监测到,重新把Deployment中的pod数从一个恢复到两个,再去新生成一个pod。通过控制器,我们也会帮助完成发布的策略。比如说,进行滚动升级,进行重新生成的升级,或者进行版本的回归,这就是我们为什么在通过 Kubernetes上可以进行相应的自动回滚和进行相应的不同版本的发布。
它都是通过Development这个概念,通过控制器指定不同的策略来进行版本的发布。Development是管理pod种抽象的方式, 我们一般不直接创建pod,而是通过Development创建pod。这个也是我们需要了解的,这些核心概念能够更好的帮我们理解Kubernetes是如何来运转的。
(4)Service
Kubernetes还有一个核心概念 Service,Service 是 Kubernetes最核心的概念,通过创建service服务为一组具有相同功能的容器应用提供一个统一的入口地址,并且将其请求进行负载分发到后端的各个容器应用上。
在上面我们也看到一个Deployment,可以有两个或者更多的这种相同的pod,对外部用户来说,访问哪个pod其实都是一样的,所以就希望做一次负载均衡,所以做负载均衡的同时,我们可能只访问某一个固定的VIP,也就是虚拟的ip地址,而不希望知道每个具体pod ID地址。
Pod本身像容器一样,随时可能会被停止或随时会被终止,一个pod败了会换成另外一个新的pod来提供服务。
对一个外部用户来说,如果把每个pod都用来提供一个访问ip的话, 用户需要不停的更新pod地址会带来很多的麻烦,Pod在失败重启之后,我们希望有一个抽象把所有pod访问能力抽象成第三方的一个ip地址。用来实现 Kubernetes这种抽象,我们称之为Service。
它相当于是一组服务的一个统一入口地址,就是提供一个或者多个pod指令,一组具有相同功能的容器来提供一个统一的入口地址,稳定的访问地址。
service和网络有很大的关系,网络本身的分配才能实现service访问,所以说Service本身支持多网络访问方式的实现,比如常见的class ID、No pot和no balance多种方式来实现设备访问。
知道了服务概念就能理解pod之间如何形成多个服务,服务之间如何来发现,需要统一的入口,通过统一的入口保证pod失败,而不影响对外的服务,这就是Service重要的一个概念。
(4)Namespace
Kubernetes还有一个核心的概念namespace。namespace做为一个集群内部的逻辑隔离,它包括健全管理、资源管理。
Kubernetes的每个资源在很多情况下, Namespace是用于实现多用户的资源管理,相当于同一个 Namespace资源需要命名不同的kubernetes资源可以重名,Kubernetes相当于为用户提供了一个逻辑隔离的空间,可以让他为不同的开发者去做相应的部署和服务。可以认为Namespace是供应集群的一个虚拟化集群,在一个库里集群中可以拥有多个命名空间,他们在逻辑上是彼此隔离的,他们可以为你的团队提供组织安全性能方面的保障,通过这种方式 Namespace实现了逻辑的隔离。可以把它理解为一个虚拟化机群,帮助实现多租户的概念。
kubernetes平台上多个考察团队他们相互之间的开放运行就会受到影响,能够更好的帮们管理多团队多用户之间的资源划分和管理,这就是Namespace概念。
前面我们说了pod、Volume Deployment.、Service.Namespace,这些概念都是Kubernetes技术实现的一个核心基础。
首先Kubernetes通过 pod 实现这个容器的管理,我们认为一个 pod就是方块,它可以包含多个容器运行的示例,volume就是实现数据持久化的存储。
关注 pod来写底层数据,pod失败的时候不会影响数据存储和数据化的泄露。deployment是实现容器的这种部署和扩容以及历史版本的回归。service实现了容器应用对外提供的一个统一的目录地址,实现服务被外部的统一访问和调用。
namespace实现了多租户的资源隔离,提供了整个租户类的资源安全性等方面的保障,知道了这几个概念之后,就能够帮助kubernetes实现核心的功能。
二、Kubernetes 核心架构
Kubernetes系统用于管理分布式节点集群中的微服务或容器化应用程序,提供了零停机时间部署、提供相应的版本自动回滚、扩缩容和容器的自愈,自动配置、自动重启、自动复制的高弹性基础架构。Kubernetes是如何实现的呢?
Kubernetes也是遵循CS,也就是客户端和服务端得到架构模式。系统架构分为Master节点和Node节点两部分。
Master是主控节点,Master为服务端,Node节点作为客户端。控制系统具有多个Master,可以部署多个Master服务端,帮助系统来实现高可用。
在MOD情况下,一个Master服务端可以完成所有的工作,但需要做相应的高可用。
我们推荐三个或者甚至更多的节点去做Master。多个Master可以帮助我们更好的提高系统的高可用。
Kubernetes Master (主控节点)是集群的“大脑”,负责管理所有节点(Node),相当于中间的主控节点,负责所有集群信息的通知,调度Pod在哪些节点上运行,负责控制集群运行过程中的所有状态。
Kubernetes Node(工作节点)是负责管理Node节点上所有运行的Pod,负责监控上报Node节点上所有Pod的运行状态。
Node是一个容器运行的环境和状态时,主控节点是它的一个管理节点,可以这样去理解它。
Master服务端核心组件包括apiserver、controller-manager,scheduler集群调度服务,etcd一个分布式的存储系统。
1. kube-Apiserver
Apiserver就是kube-apiserver,顾名思义它是用来做API操作的。Kubernetes中所有的组件都会和apiserver进行连接,组件与组件之间,它不会进行独立的连接,都是依赖于apiserver进行消息的传送,可以把apiserver简单的理解为Kubernetes统一对外的控制器的统一入口,无论在操作任何电器的时候,比如冰箱有冷冻冷藏统一有一个控制界面,相当于Apiserver
通过apiserver和其他所有的功能节点进行交互,来实现命令的传达和信息的传送。
2.kube-controller-manager
kube-controller-manager是集群中所有资源对象的自动化控制中心,controller-manager被称为管理控制器,负责管理Kubernete集群的节点以及Pod副本。service服务端点访问的端口namespace服务账户、资源定额等所有管控的一个组件。自动化控制中心控制器负责完成对集群状态的一些管理,其默认提供了一些控制器,它是由多个不同的控制器组合而成,例如deployment controller控制器、Lets base控制器等这些,每个控制器都通过kube-apiserver组件来提供接口实时监控,调入整个集群的资源来满足当前的一个状态。当发生一些故障而导致系统出现状态变化的时候,会尝试将系统的状态修复到一个可期望的状态,这就具备Kubernete治愈功能。
3.kube-Schedule
Schedule是调度器,调度器顾名思义就是完成所有资源的调度,可以把一个用户提交的容器以及对CPU和内存的请求大小,找到一个合适的Pod基点进行Pod放置。
后面的场景中,我们会来讲解一下Pod的调度算法,如何找到一个合适的Pod进行容器的放置,调度器每次只调度一个Pod资源对象,为每一个Pod资源对象找到一个合适的Pod过程,是调度的一个整体的周期。Pod本身是不具备此句话的,因此它需要一个Etcd,一个分布式的存储系统。apiserver中所需的原始信息都放置在Etcd中.
4.Etcd
Etcd本身就是一个高可用的系统,通过Etcd机制,能够保证整个Kubernetes Master组件高可用。apiserver是集群的统一入口,controller-manager控制器去做集群中所有状态的控制,scheduler调度服务器是对集群Pod的资源对象整体的一个调度服务,Etcd分布式存储系统.
Kubernetes 架构-node 客户端组件,Node节点客户端有哪些组件,起到哪些重要的作用
1. kubelet
Kubernetes Node是真正运行右负载的地点,每个右负载都会以pod形式进行运行,一个pod中会运行一个或多个容器,真正去运行pod组件叫做kubelet,kubelet负责管理节点上容器的创建,删除,启停等任务,与Master节点进行通信。
Kubelet是Kubernetes中最重要的Node节点控制器,是维护容器的生命周期,并管理容器存储和容器的网络,它是Pod和Node api主要实现的方式,kubelet负责驱动容器底层的执行层,在kubelet中应用容器彼此是隔离的,运行主机也是隔离的,对应用进行独立管理的关键节点是Kubelet,Node节点是对外执行命令的一个关键的统一路口,他是负责节点上容器的创建,删除、启停的功能。
2. Kube-proxy
Kube-proxy负责Kubernetes服务的通讯及负载均衡的服务,在Kubernete中自己环境中也会有Kubernete网络服务,为了提供severce net来进行搭网主网,真正完成service 主网的组建是Kubernetes,它是利用achetable的能力 组建Kubernetes network,就是classnetwork。
3. Container Runtime
Container Runtime是Kubernetes工作节点中的一个组建是为了运行每个节点上的容器。我们知道Kubernetes是容器的编排和管理引擎,容器运行是非常重要的。Container Runtime、K8s节点的底层使容器运行时支撑负责启停容器,理解容器的是docker,但它并不是唯一的事实。
事实上容器运行时在这个领域包含很多技术,使得Kubernetes扩展变得更加开放,扩展变得更加容易,node的客户端的关键的三个组件。
Kubernetes是负责管理节点上的容器的创建删除启停的任务,与master节点进行通讯,传达master节点所下发的apiserver的指令。
Kube-proxy是负责server网络的主管,负责Kubernetes服务的一种通信及负载均衡。Container Runtime负责容器的基础管理的服务,是接收kubelet组件的指令对容器启停或者是增加这样具体的启动命令。