Docker:kubernetes简介之一

目录

Kubernetes是什么/p>

Kubernetes架构

Kubernetes 是由中心节点的架构 Master(最少三个)

Node上的节点(Work)

Pod 调度的最小单元

Service 充当服务发现功能

Label Select 标签选择器


Kubernetes是什么/h2>

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。

主要特性:

1、自动装箱 【基于资源依赖,最大约束能够自动完成容器的部署,而且不影响其可用性】

2、自我修复 【容器崩了,可以在短时间内启动(容器kill掉,用重启来代修复)】

3、自动水平扩展 【只要物理资源可以支撑,一个容器不能够满足服务,就会水平启动多个】

4、服务发现和负载 【微服务化以后,服务之间的依赖,通过服务发现的功能会自动发现依赖到的服务,每一种的服务启了一个容器的话,会自动做负载均衡 】

5、自动发布和回滚

6、支持密钥和配置管理

比如:以前我们修改Nginx配置文件,修改完成后需要使用Ansible推向Nginx物理机,重新读取生效;现在是应用的程序的配置西信息,不在本地加载,而是通过读取配置中心的配置,就可以实现

Docker:kubernetes简介之一

7、存储编排   【存储卷实现动态供给】

8、任务批量执行 

Kubernetes架构

Kubernetes简单理解可以是一个集群,组合多台主机的资源,组合资源统一向外提供,计算,存储

【集群的常用的模型是:1、P2P:没有中心节点,每个节点都可以接受用户的请求(Redies Buff)2、有中心节点,从节点从主节点同步(Mysql,主从复制)】

Kubernetes 是由中心节点的架构 Master(最少三个)

简单的请求过程:用户请求发送到Master,Master中调度器去分析各个Node中可用资源,从中找一个最佳适配的,在本地把这个容器启动起来【没有镜像的话,去吧镜像拉取下来再启动】Master是主机点,其他节点是从节点(高可用);各个Node节点,每个节点都是贡献一部分计算能力,存储能力等(也就是运行容器的节点);

Docker:kubernetes简介之一

APIServer: APIServer负责对外提供RESTful的Kubernetes API服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给APIServer处理后再提交给etcd。如架构图中所示,kubectl(Kubernetes提供的客户端工具,该工具内部就是对Kubernetes API的调用)是直接和APIServer交互的 

Scheduler: 主要负责挑选出一个最佳node节点来运行pod,它挑选合适的node,通常分两个阶段,第一个阶段:是先通过初步筛选, 根据运行pod的最大要求,如: 4G内存, 6颗CPU等需求,来做初步筛选,假如从20台中选出了3台, 则进入第二阶段,在从这3台中选出一台最符合的节点这时就需要综合考量各种因素,最后将选出了一台最佳运行节点告诉给API Server,在由Master节点负责调度Pod在该node节点上运行起来。
Controller-Manager:它是负责监控所有Controller是否正常工作的,在Kubernetes集群中,有很多个功能各异的Controller, 监控Pod健康状态的Controller只是其中之一,Controller-Manager它用于监控这些Controller工作状态的,一旦Controller故障,它将重启一个新的Controller来代替它工作。Controller-Manager管理器支持多种控制器
但是若Controller-Manager故障怎么办其实Master在创建时,要求最少要有3个节点,每个节点都会启动一个Controller-Manager,启动一个为主Controller-Manager,其它两个或多个为备用的Controller-Manager,一旦主Controller-Manager故障,则备用的Controller-Manager将代替它继续工作。

Etcd:etcd是一个高可用的键值存储数据库系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API,Etcd更像zookeeper,Etcd如果宕机了,整个集群也就挂了,整个集群的所有对象的状态信息都在这里,因此Etcd是要做高可用的最少三组

Node上的节点(Work)

每个Node节点主要由三个模块组成:Kubelet、Kube-proxy、Runtime、容器引擎。

Kubelet:一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器;本质上,它负责使Pod得运行状态与期望的状态一致。

Kube-Proxy:该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。

随和和API Service进行通信,每一Pod发生改变结果都需要保存在API Service中,Pod该表后API Service 会发生一个通知事件,这个事件会被任何关联的组件发现(比如Kube-Proxy),发现该表后Kube-Proxy会在本地反映到IPtables或IPVS中,API Service的管理实现是靠Kube-Proxy在每个节点实现的

Runtime:runtime指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器

容器引擎:Kubelet介绍到Maters的任务后,由容器引擎去启动容器引擎(只是docker流行并非只能运行Docker)

Pod 调度的最小单元

在Kubernetes在调度最小单元已经不是容器而是Pod;可以理解是容器的外壳,对容器抽象进行了封装,主要是来放容器的【在一个Pod中运行多个容器,容器之间共享Network,UTS,IPC,对外更像一个虚拟机,内部之间可通过loop通信;同一Pod共享同一个存储卷,不在属于容器,而是属于入Pod;一般来讲一个Pod只放一个容器,或者一个Pod中存放一个Master容器+辅助容器(辅助Master容器),而构建的】

Docker:kubernetes简介之一

Pod:是k8s进行资源调度的最小单位,每个Pod中运行着一个或多个密切相关的业务容器,这些业务容器共享这个Pause容器的IP和Volume,我们以这个不易死亡的Pause容器作为Pod的根容器,以它的状态表示整个容器组的状态。一个Pod一旦被创建就会放到Etcd中存储,然后由Master调度到一个Node绑定,由这个Node上的Kubelet进行实例化。
每个Pod会被分配一个单独的Pod IP,Pod IP + ContainerPort 组成了一个Endpoint。

Pod大致分为两种:

自主式Pod : 自我管理,创建后提交给API Server,由API Server 借助Schedule,调度到Node,Node启动此Pod,如果这个容器由故障,会有Kubelet来重启启动,如果节点故障,这个Pod就消失,无法实现全局控制,不建议使用

控制器管理的Pod:由于控制器的使用,使得Pod有了生命周期对象,由Schedule调度到集群中某节点来启动/删除;对于某种守护进程的Pod,我们要时刻保证它处于运行状态,一旦发现状态异常要用就要重启;控制器管理对于这种也不太适用,为此Kubernetes提供了

  • ReplicationController:副本控制器【ReplicationControlle会控制同一类Pod的对象,比如规定同一类Pod规定启动两个副本,小于两个:在Node节点上资源合适的上启动一个Pod;大于两个:多退少补要符合规定2个副本】还能实现滚动更新:替换旧版本(在更新过程中,临时超过规定的副本个数)启动新版本,kill老版本;同理可回滚
  • ReplicaSet:副本及控制器 (新版本):不直接适用,有一个声明式的更新控制器Deployment
  • Deployment:只能管理无状态控制器
    • 他还有二级控制器:HPA(HorizontalPodAutoscaler):Pod水平伸缩器 【当资源不够的时候,水平增加Pod】
  • Statefulset: 管理有状态
  • DaemonSet:控制在节点运行副本的数量
  • Job/CtonJob:运行作业/运行周期话作业 【临时任务】

Service 充当服务发现功能

Pod是由生命周期的,当一个Pod结束后,在重新重建一个Pod,Pod已经不是原来的Pod,里面的IP地址都不会和原来的一样,这么一来就会产生问题户端如何来访问这些Pod/p>

因为客户端无法固定访问Pod(Pod本身都是不固定的,随时消亡,创建),这里就使用服务发现的机制来实现,在客户端和Pod之间增加了Server层【Service地址是固定的,当客户端需要写在配置文件中访问某种服务,无须自动发现,只需要在配置文件中写服务的名称或地址,这个服务其实是个调度器,不仅仅是稳定的访问入口;当访问的时候只需要访问的Service,Service在把请求代理到Pod上,通过Label Select 来访问这一类服务随后在进行动态探测则这个IP+端口,最为自己后端可用的服务】

Docker:kubernetes简介之一

 

Service是怎么和Pod产生关联的尼/strong>

由于Pod的是由生命周期的,无法通过IP+Port进行连接,这里就通过Pod的标签来产生关联关系,在通过探测对Pod获取去IP

Service:其功能使应用暴露,Pods 是有生命周期的,也有独立的 IP 地址,随着 Pods 的创建与销毁,一个必不可少的工作就是保证各个应用能够感知这种变化。这就要提到 Service 了,Service 是 YAML 或 JSON 定义的由 Pods 通过某种策略的逻辑组合。更重要的是,Pods 的独立 IP 需要通过 Service 暴露到网络中。

Service在Kubernetes不是实体组件,也不是应用程序,只是一个IP tables【新版本已经更新未IPVS(基于Net)】的DNet的规则(通过某某口进来,转发的哪里);Service作为Kubernetes的对象,Service的名称也是服务的名称,而这个名称是可以解析直接解析成Server的IP,而解析名称是DNS做的,装完DNS后就会装一个DNS POD,来保证各个POD能被解析,这种POD是K8s的基础架构,这类也叫做:AddOns【基础附件】这里是动态改变;当Service名称改了,Kubernetes的集群中DNS记录也会动态改变【DNS pod一般是Server的DNS地址】

Docker:kubernetes简介之一

Service有两种,一种可只共外部使用;一种只供内部使用

Label Select 标签选择器

Node节点是Kubernetes上的Master分配任务的工作节点,最核心使用Pod去运行,node理论上可以是任何节点,只要有CPU,MEM等并安装上Kubernetes,都是作为Kubernetes的一份子来工作,他实现的效果如图

 所有的Node节点统一来用Kube_Cluseter来管理,当用户请求在Master创建资源的时候,会在Kube_Cluseter来做统一的调度和评估;所以终端用户在无需关心运行在哪里【云计算】

Docker:kubernetes简介之一

一个Pod运行在我们的容器集群当中,我们怎么来进行识别和管理/p>

为了能够识别Pod,我们会在Pod上增加一层源数据,【在docker file中经过,我们会给容器打赏标签(Key-Value类型的数据)】在Kubernetes利用类似标签的原理来识别Pod,在创建Pod的是时候打上标签(比如Pod中有Nginx容器:给Pod打上标签叫APP,那么他的Key = APP,Value = Nginx这种Key=Value我们称为:Lab)这样来找到它,来对Pod的识别和管理;所以筛选的机制靠Lab Select来实现

Lab Select:相当于标签,给某个资源对象定义一个Label,就相当于给它打上一个标签,随后可以通过Label Selector查询和筛选拥有某些Label的资源对象;不单单使用于Pod

Kubernetes是一个Restful风格的API,通过HTTP/HTTPS对外提供API服务,Restful风格几乎所有被操作的目标都是对象;所有兑现对可以打标签,只不过Pod是最早要的

文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树容器(docker)安装docker8829 人正在系统学习中

来源:Amae

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月18日
下一篇 2022年7月18日

相关推荐