k8s基础概念

1、容器编排得特点和功能

容器编排系统其实只是容器得生命周期管理工具,尤其是在我们组件一个微服务环境当中,存在得服务数量非常多得时候,并且期望能够以动态注册部署等方式,容器编排系统得价值体现更加充分

一般来讲我们得软件团队会使用容器编排系统来完成以下任务的自动化(同样这也是容器编排核心价值所在)

    (1)容器的供应和部署  如何获取镜像,如何部署容器并运行起来

    (2)容器的冗余及可用性  如果某个容器down了,我们如何自动的将一个出现故障的容器恢复回来

    (3)扩展或删除容器,以便在主机基础设施上均匀地分布应用程序负载,自动扩缩容

    (4)在主机资源短缺或主机死亡时,将容器从一个主机移动到另一个主机    

    (5)对外公开在容器中运行的服务     暴露集群让外部去访问

    (6)容器之间服务发现的负载平衡      

    (7)容器和主机的运行健康状况监视

    (8)与运行应用程序的容器相关的应用程序配置

简单来说,容器编排是指容器应用得自动布局,协同及管理,它主要负责完成以下具体任务(这就是容器编排所具有得功能当中得几个重要部分)

    (1)服务发现

    (2)负载均衡

    (3)配置和存储管理

    (4)健康状态检测

    (5)自动扩容|缩容|重启等

    (6)0宕机部署

2、k8s的物理结构:

k8s本身一定是一个集群,host被分为两类一类是主节点master,一类是node;master类似于蜂群当中的蜂王,每一个node可以理解成是工蜂,node是负责运行容器的主机,也就意味着我们将来运行应用程序都是运行再node之上的,而master是负责管理有多少个节点每一个节点上应该运行哪个或者哪些个容器鹅统一的控制中心,因此再k8s中,master被称为control plane,node称之为真正运行应用程序的工作节点worker,master有多个是为了冗余的,node是负载均衡的,多个node之间都需要同时进行工作,每个只负责一部分任务,万一某个node宕机了,再找另外一个Node把程序重新运行起来。

3、K8s角色划分

在k8s之上,k8s运行的元子单元并非是容器,而是叫做Pod的组件

K8s集群本身就是kubernetes Master到node节点那一块,master在实验环境中有一个就可以,节点node有两三个足以体现出分布式逻辑,但是k8s的主要目的是在node上运行容器化应用的,但是容器的运行要靠镜像,镜像需要从镜像registry来提取,registry不是k8s的组成部分,无论通过API接口(编程接口)写程序与master交互,还是通过命令行接口CLI与Master交互,甚至是通过图行界面UI来与master交互,都是像master发请求,比如我创建删除一个容器等操作请求的发出者我们称之为管理客户端或者用户客户端,这些管理者或者像master发请求,master负责实现在主节点上完成对应应用程序的创建,一般来讲我们称为增删改查

3.1kubernetes  master组件的组成

 master组成

master主机有四个逻辑组件组成:API Server、Scheduler、Controller、etcd,它们被称为是程序组件,每个组件之间都必须运行一个守护进程,API Server、Scheduler、Controller这三个组件是k8s自己提供的,而etcd不是k8s自己提供的,它只是被拿来当作是k8s当作重要组成部分而已

 什么是Scheduler?

Scheduler:调度器,你无论通过API、UI、CLI像master提起你要创建一个容器的时候,这个容器到底要运行在node节点中的哪一个呢,需要调度器去评估一下哪一个node是最佳目标节点,如果多个node节点都是最佳的那就从中随机选择一个,例如用户新建一个容器,Scheduler会watch到api server,Scheduler会把它调度到某一个节点上创建出来,创建出来健康与否,Controller去负责监控它

什么是 Controller?

Controller:控制器,k8s的api提供的是一种声明式api,在应用程序当中有两种api范式,一种叫陈述式,一种叫声明式,例如这里有一个饭馆,你可以调用饭馆的服务能让他端上来饭你可以去进食,然后你给饭馆下命令的方式有两种,一种是老板给我来碗鸡蛋面,你不用管老板怎么去做鸡蛋面等会他把面做好给你端上来就行,这叫声明式;一种是老板给我来碗鸡蛋面,你要这么这么这么这么的给我做好每一个步骤说清楚让老板根据你的指令来做,这叫陈述式。陈述式和声明式的最大区别在于陈述式的假设在于这个老板是不懂鸡蛋面怎么做的,你需要用具体详细的指令告诉他怎么干,也就意味着核心操作方是那个被调用者,但真正如何操作是调用者,而声明式老板来碗鸡蛋面至于老板怎么做鸡蛋面如何获得鸡蛋和面你不用管,老板自己被调用者有一套自己的逻辑可以帮你自动完成,你只需要告诉他你要的是一碗热腾腾的鸡蛋面就可以了。k8s提供的是声明式api,比如某一个客户端想运行容器,通过API、UI、CLI告诉master来给我运行一个容器,运行一个nginx容器,运行这个容器的镜像占多少内存,镜像从哪里来,是否能跑起来你都不用管,只需要告诉master给我运行一个nginx容器,Controller知道到哪去找镜像,拿过来以后通过Scheduler调度以后,Controller知道nginx容器运行健康与否,有没有正常监听用户所指定的端口,如果没有,Controller会试图把它干掉在重新启动,这叫自动创建,这个所有功能都是Controller来实现的。Controller是整个master当中的大脑,因为用户指令下来以后,真正能负责执行并监控它、能符合用户所指定的期望都由Controller负责。

什么是API Server?

API Server:整个k8s中的功能要提供给客户端能调用,因此API Server是整个K8S上唯一接收客户端请求的入口,它负责接进来,负责检查用户创建提交的命令是否合乎语法规范,如果合乎语法规范接下来他就把它保存到etcd当中,API Server是一个数据库,它负责用户通过任何一个接口完成对容器的增删改查,这个时候容器并没有跑起来,它只是存下来用户提交了一个创建容器得请求,这个容器有没有跑起来由Controller来负责,API Server会通知Controller,Controller会watch到 API server上得变动,比如创建删除操作,一旦有了变动,Controller会立即获得变动得相关状态,然后Controller对用户下达得得指令进行操作。

 K8S的两种状态分别是什么?

因此,在k8s之上一个资源有两种状态,一种是用户期望状态。用户请求并保存在etcd当中用户期望应该聚合得状态,老板来碗热腾腾得鸡蛋面,这个命令已经发过去了,到底这个鸡蛋面有没有被做出来是不是热腾腾的是粗面还是细面,假如这个老板做出来得是一碗鸡蛋面是凉的可能不符合你的期望那么,第二种状态是当前实际状态。Controller把指令从etcd中取出来并确保在节点上可以运行起来,这个是真正运行它的容器,这个真正运行它的容器的状态和用户期望保存在etcd的状态有可能是不一致的,比如用户运行的状态etcd监听80端口,而Controller监听的是8080端口,就会不符合用户期望,Controller会对比etcd的状态和Controller上的状态是否一样,如果不一致,Controller就负责确保真正运行的状态和etcd的状态是否一致,不一致就Controller重启或者重建确保他们一致

什么是etcd?

etcd:是一个k/v存储系统,定义容器是通过不同的k/v来描述一个容器的多个状态信息,比如一个容器里面有容器名,有镜像,监听端口,为了能够确保用户能够合理合法的描述k8s所支持的资源的属性,API server对etcd进行了包装和抽象,使得用户只能按照api server中定的结构来定义数据,以mysql为例,对mysql来讲,假设有一张表是万能的你可以填任何数据,但是如果是这个库建好了这个表一共只有4个字段,你插入一行数据时,定义了第五个字段是不是就不符合表的定义了。API server对etcd存储的能力做了进一步规范化,使得用户能够存进来API server中的数据只能时符合API server所支持的资源属性的数据。

3.2 Kubernetes Node组件组成

比如用户创建一个容器像API server发请求,Scheduler watch到api server创建容器的请求开始调度,调度就是从当前集群中的node中选一个作为真正运行这个容器的节点,选完以后,Scheduler会把调度的结果依然保存到etcd当中,然后看上图每一个node组件中有一个kubelet,这个组件也会watch API server上的资源变动,如果说某一个Scheduler调度某一个容器给一个节点以后,这个节点会能通过 api server看到这个是由自己负责执行的,kubelet会创建执行容器的任务,kubelet会调用docker,docker会找registry去下载镜像,下完镜像以后会在当前节点上启动容器

在k8s上不会直接运行容器,而会直接运行pod,pod是容器的又一层外壳,容器本身就是一个组件,但是K8S认为它自己不方便直接管容器而在容器之外又加了一层壳叫pod,说白了pod是容器的外壳,一个pod中可能存在多个容器,这多个容器是被当成多个元子单元管理,假如一个pod中有3个容器,这三个容器只能同时运行在同一个node上,因为它被统一调度,假设都调度到node1上,三个容器只能在node1上运行,不能够分裂到不同节点上去运行,所以我们称之为元子单元。因此k8s运行的核心基本单元叫pod,而不是容器,一个pod中的多个容器彼此之间是共享同一组网络名称空间、共享同一组IPC、共享同一个UTS,因此他们也共享同一组网卡,所以同一个pod中的多个容器的关系是非常紧密的,其实pod底层还有一个容器,这个容器通常我们把它叫做基础架构容器infra,同一个pod内的容器可以共享存储卷

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值