1、API对象
API对象是K8s集群中的管理操作单元。

每个API对象都有3大类属性:元数据metadata、规范spec和状态status。
元数据metadata是用来标识API对象的,每个对象都至少有3个元数据:namespace,name和uid;除此以外还有各种各样的标签labels用来标识和匹配不同的对象。

K8s中所有的配置都是通过API对象的spec去设置的,也就是用户通过配置系统的理想状态来改变系统,这是k8s重要设计理念之一,即所有的操作都是声明式(Declarative)的而不是命令式(Imperative)的。声明式操作在分布式系统中的好处是稳定,不怕丢操作或运行多次,例如设置副本数为3的操作运行多次也还是一个结果,而给副本数加1的操作就不是声明式的,运行多次结果就错了。

2、POD
Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod对多容器的支持是K8s最基础的设计理念。

目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的控制器为Deployment、Job、DaemonSet和StatefulSet。

3、复制控制器(Replication Controller,RC)和副本集(Replica Set,RS)
RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。
RS是新一代RC,提供同样的高可用能力,区别主要在于RS能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。

4、部署(Deployment)
部署表示用户对K8s集群的一次更新操作。部署是一个比RS应用模式更广的API对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。

5、服务(Service)
在K8s集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个;这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。

6、任务(Job)、后台支撑服务集(DaemonSet)
Job是K8s用来控制批处理型任务的API对象。
典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支撑K8s集群运行的服务。

7、有状态服务集(StatefulSet)
在云原生应用的体系里,有下面两组近义词;第一组是无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable);第二组是有状态(stateful)、宠物(pet)、有名(having name)、不可丢弃(non-disposable)。
RC和RS主要是控制提供无状态服务的,其所控制的Pod的名字是随机设置的,一个Pod出故障了就被丢弃掉,在另一个地方重启一个新的Pod,名字变了、名字和启动在哪儿都不重要,重要的只是Pod总数;而StatefulSet是用来控制有状态服务,StatefulSet中的每个Pod的名字都是事先确定的,不能更改。
对于RC和RS中的Pod,一般不挂载存储或者挂载共享存储,保存的是所有Pod共享的状态,Pod像牲畜一样没有分别(这似乎也确实意味着失去了人性特征);对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续以它的状态提供服务。
使用StatefulSet,Pod仍然可以通过漂移到不同节点提供高可用,而存储也可以通过外挂的存储来提供高可靠性,StatefulSet做的只是将确定的Pod与确定的存储关联起来保证状态的连续性。

8、存储卷(Volume)、持久存储卷(Persistent Volume,PV)和持久存储卷声明(Persistent Volume Claim,PVC)
K8s集群中的存储卷跟Docker的存储卷有些类似,只不过Docker的存储卷作用范围为一个容器,而K8s的存储卷的生命周期和作用范围是一个Pod。
PV是k8s中的持久化存储对象,类似于linux中的存储设备/dev/sda1,支持很多种存储类型,包括块存储、nfs、本地文件系统、本地磁盘、dfs等
PVC是服务对PV的使用声明,类似于linux中的mount,本质上是建立一个服务对存储资源使用的逻辑关系

9、其他
节点(Node):k8s的工作主机节点
名字空间(Namespace):名字空间为K8s集群提供虚拟的隔离作用,K8s集群初始有两个:default和kube-system

10、核心组件
etcd 保存了整个集群的状态;
API Server 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
Controller Manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
Scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
Kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
Container Runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
Kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;

在生产环境下部署容器应该尽量避免使用 :latest 标签。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐