赞
踩
Pod的特点:封装docker容器的容器
Pod实际上也相当于是一个独立的容器(虚拟机器),而这个pod容器内部封装的是由docker引擎所创建的容器,可以理解为pod就是一个虚拟化分组,pod内部可以存储一个或者多个容器。
Pod内部封装的是容器,容器内部运行是开发的应用程序
。Pod管理上线的运行的应用程序
定义:在通常情况下,在服务上线部署的时候,pod通常被用来部署一组相关的服务。(什么一组相关的服务?
)
C:container,容器
Fluentd:日志
一组相关服务: 在一个请求链路上的服务,叫做一组相关服务。通常情况下,这一组相关的服务在调用链路上处于上下游的关系。
经验来说:(可维护的角度)
建议一个pod内部只允许部署一个容器(一个服务)。
日志收集的容器例外
问题:服务集群该如何部署????(pod内部运行就是容器,容器中运行的就是服务)
使用kubernetes构建服务集群,只需要创建多个部署了相同服务的pod即可。也就是说k8s可以实现一键式部署,一键式扩容
Pod底层核心原理:
POD容器内有一个基础容器 pause容器,它是和pod容器一起创建的
pause容器会构建一个虚拟网卡、挂载一个数据卷
POD中所有容器和pause容器会共享 这个虚拟网卡、和数据卷
在使用了pause容器创建共享网卡后,pod内部容器之间访问就使用localhost访问,就相当于本地访问一样,因此性能非常高。
注意: 一个pod不能分裂存储在多个node节点,但是多个pod副本可以随机分配到不同的node节点进行存储。
ReplicationController — 副本控制器
用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代,而如果异常多出的容器也会自动回收。
在新版本的 Kubernetes 中建议使用ReplicaSet 来取代ReplicationController
副本控制器作用:永远保证服务数量和预期的数量保持一致。也就是说服务永远不会宕机,服务永不停机,服务永远处于高可用状态。
如果pod全部宕机:全部重新创建
注意:在新版本的 Kubernetes 中建议使用ReplicaSet 来取代ReplicationController
ReplicaSet
RS 控制器和pod控制架构—副本控制器是如何控制pod副本的??
RS 和 RC 副本控制器到底有和区别?? 为什么要是有RS,不使用RC呢??
Labels: 标签,是用来唯一标识一个组件的,k8s中所有的资源对象都可以被标签类进行标识。通过标签标识后,方便,灵活的查询到这个组件。
查询一组相同业务pod:
app = MyAPP 此标签可以查询出下面4个pod.这4个pod是一组相关副本的pod. 标签相同,说明是同一个服务部署了多个副本。
标签选择器:
复合选择器:支持多个标签选择器
Selector:
app = MyApp
release = stable
注意: 如果单独使用rs,就不支持滚动更新。(在企业中,产品经理不停提出新的需求,项目版本不停的迭代…如何实现不停机更新??)
虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment支持)
Deployment为Pod和ReplicaSet 提供了一个 声明式定义方法,用来替代以前的 ReplicationController 来方便的管理应用。
典型的应用场景:
Deployment不仅仅可以滚动更新,而且可以进行回滚,如果发现升级到V2版本后,发现服务不可用,可以回滚到V1版本。
Deployment和rs结合使用,支持滚动更新。(发新版,不停机更新)
Deployment管理着RS,RS控制着Pod
滚动更新:新创建的RS,每创建一个新版本的pod会将原来旧的pod删除(更新过程中新旧pod会维持一个比例,最终会全部更新完),最终全更新完后, 旧的RS也是不会删除的,可以用来回滚操作!!旧版本的镜像还是在的。
RS之间的感知,由Deployment控制
资源对象组成关系:
注意:RS是怎么知道哪几个pod受它控制?rs通过标签选择器选择受rs所管理的资源对象。
HPA(HorizontalPodAutoScale) — 自动扩容
Horizontal Pod Autoscaling 仅适用于 Deployment 和 ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩容,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容
HPA也是一个资源对象
Deployment ,StatefulSet都是用来部署服务的。
StatefullSet 是为了解决有状态服务的问题(对应Deployments 和 ReplicaSets 是为无状态服务而设计),其应用场景包括:
无状态:
例如一些业务逻辑服务:
有状态:
ES/MYSQL/Mongodb/……………等都是有状态服务
为什么有状态服务的pod,必须使用statefulSet来进行部署????
前提(本质原因): 副本创建,滚动更新,扩容 ,都是创建一个新的pod。当一个pod宕机后,会重新创建一个新的pod.这个新的pod如何共享之前数据?如果不做任何处理,此时这个新的pod就会丢失之前的数据,对于有状态服务来说,就是灾难。
每个pod都对应一个自己的volum,数据卷
有状态的pod挂了,新创建的pod,它还能找到原来挂掉的pod的数据卷
Statefulset部署有状态服务网络拓扑结构:
Statefulset模式下,pod的数据卷就不是volume,而是两个持久化存储资源对象PVC和PV,PVC下面挂载PV
PV挂载了一个文件服务器,例如nfs文件服务器
即数据是挂载在网络存储上的,当然本地也能存储但是不推荐
PersistentVolumeClaim(持久化卷申明/存储)
PersistentVolume(持久化数据卷)
Statefulset保证数据不丢失根据pod的名称来挂载数据的,也就是说可以让pod的名称永远保持不变,在pod宕机,重新创建后,根据名称找回数据。
DaemonSet确保全部(或者一些 [ node打上污点(可以想象成一个标签),pod如果不定义容忍这个污点,那么pod就不会被调度器分配到这个node ])Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除他创建的所有Pod,使用DaemonSet 的一些典型用法:
Daemonset就是让每一个node节点都运行一个相同的pod.
例如:
Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束
Cron Job管理基于时间Job,即:
数据卷,共享Pod中容器使用的数据。
标签用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。
Kubernetes中任意API对象都是通过Label进行标识
,Label的实质是一系列的Key/Value键值对,其中key于value由用户自己指定。
Label可以附加在各种资源对象上,如Node、Pod、Service、RC等
,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
Label是Replication Controller和Service运行的基础,二者通过Label来进行关联Node上运行的Pod。
我们可以通过给指定的资源对象捆绑一个或者多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便的进行资源分配、调度、配置等管理工作。
一些常用的Label如下:(规范,也可以随意定义)
Label相当于我们熟悉的标签,给某个资源对象定义一个Label就相当于给它大了一个标签,随后可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实现了类似SQL的简单又通用的对象查询机制。
Label Selector在Kubernetes中重要使用场景如下:
各种组件之间的关系,例如 StatefullSet怎么知道自己要管理哪些 ReplicaSet,ReplicaSet怎么知道自己要管理哪些POD,这些都是通过标签、标签选择器 实现的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。