一、架构
说到K8S关键组件或对象,先上一张官网图:
核心对象和概念有:Master、Node、Pod、Label、Replication Controller、Deployment、Horizontal Pod Autoscaler、StatefulSet、Services、Job、Volume、Persistent Volume、NameSpace、Annotation、ConfigMap
二、核心组件简介
(一)、Master
即K8S的控制节点,集群的大脑,因为比较重要,生产环境一般建议高可用部署(3台及以上)。上面运行的关键进程有:
1、 API Server:提供HTTP Rest接口的关键服务进程,是集群控制的入口进程,也是K8S里所有资源的增、删、改、查等操作的唯一入口。
2、 Controller Manager:所有资源对象的自动化控制中心。
3、 Scheduler:负责调度Pod资源的进程。
4、 etcd:分布式键值对存储数据库,负责集群所有资源对象的数据存储。此组件可以单独部署,也可以放在Master节点上。
(二)、Node
K8S集群中除了Master以外的机器,是工作负载节点。运行关键组件有:
1、 kubelet:负责Pod的创建、启停等操作。
2、 kube-proxy:实现Service的通信和负载均衡功能。
3、 docker:docker引擎,负责本机的容器创建和管理工作。
(三)、Pod
K8S中最小资源调度单位,也是最基本概念。其直译为豆荚,可以把容器想象为里面的豆子。分为两大类:普通Pod和静态Pod(只运行在Node节点上,不存放于etcd数据库中,存放在Node节点上的具体文件中)。
每个Pod都由一个特殊的rootcontainer(根容器)的Pause容器和若干个业务容器组成,如下图:
其结构有两大好处:Pause容器状态代表所有容器组的状态;所有业务容器共享Pause容器的IP和存储卷。
(四)、Label
是一个(key,value)键值对,运用于各种资源对象上。类似于SQL中的对象查询机制。通过更多个标签组合方式实现复杂筛选,多个表达式用“,”连接,几个条件之间是“AND”关系(即:必须同时满足)。主要运算符有:In、NotIn、Exists、DoesNotExist。
(五)、Replication Controller(简称RC)、Replica Set
RC:声明了某种Pod的副本数量在任意时刻都符合某个预期值。老版本的API V1支持,只支持基于等式的标签选择,现已被ReplicaSet替代。
ReplicaSet:副本数集,跟RC一样的作用,是新一代的RC,除了支持等式的标签选择,还支持基于集合的选择。调用API的版本为:apps/V1
(六)、Deployment
实如其名,调度部署。包含了RC的功能,可以随之知道当前部署的进度。其声明和定义跟ReplicaSet相似。
(七)、Horizontal Pod Autoscaling(简称:HPA)
Pod横向自动扩容。通过追踪分析RC或者ReplicaSet控制的目标Pod的负载变化,来确定是否需要调整目标Pod的副本数量。
Pod的负载度量指标主要有:
1、 CPU Utilization Percentage 即:同一RC或ReplicaSet或 deployment控制下的Pod所有副本的CPU利用率平均值。
2、 应用程序自定义的度量指标,如(TPS或QPS)。
(八)、StatefulSet
有状态集,是一种特殊的deployment对象。其特殊性在于:
1、 其里面的每个Pod都有稳定、唯一的网络标识。
2、 其控制的Pod副本的启停顺序是受控的,起从编号0开始,停则倒序从n开始,n-1递减。
3、 其Pod采用稳定的持久化存储卷,删除Pod是默认不会删除与相关的存储卷。
(九)、Service
就是一个微服务。每个Service拥有一个全局唯一的虚拟IP地址(Cluster IP),其通过运行在每个Node上的Kube-proxy作为负载均衡器,把对Service的请求转发到后端的Pod实例上,并在内部实现服务的负载均衡和会话保持。
访问Service的最常见三种方式:
1、 Node Port
2、 Load Balance
3、 Metal LB
(十)、Job
是一种特殊的Pod副本控制器,主要用于启动一个批处理任务。其控制的Pod运行时间短暂,不能重启,只运行一次。
(十一)、Volume
存储卷,是Pod中能够被多个容器访问的共享目录。其主要类型有:
1、 emptyDir:临时目录,当Pod被移除时,其中数据也被删除。其使用场景有:
(1)、某些应用运行时所需的临时目录
(2)、长时间任务的过程数据临时保存目录
(3)、多容器共享目录
2、 hostPath:在Pod上挂载宿主机上的文件或目录。其应用场景有:
(1)、容器应用程序生成的日志文件需要永久保存。
(2)、需要访问宿主机上Docker引擎内部数据的容器应用。
3、 公有云Volume:gcePresitentDisk、awsElaticBlockStore等
4、 NFS
5、 其他类型
(十二)、Persistent Volume (简称PV)
PV是K8S集群中的网络存储对应的一块存储。只能是网络存储或者分布式存储,在每个Node上都可以访问。
其状态主要有:Available(空闲可用)、Bound(已绑定到某个PVC)、Released(其PVC已经被删除,但资源未被回收)、Faild(PV回收失败)。
(十三)、Namespace
命名空间,以实现多租户的资源隔离。如创建对象时不指定,默认被放在default命名空间中。
(十四)、ConfigMap
用来保存配置参数的Map表。通过以Volume映射发方式使其成为Pod内的配置文件,如果ConfigMap配置文件发生变化,其值也会动态映射到Pod中。