一、k8s 基本特性
(1)自动装箱
构建于容器之上,基于资源依赖及其他约束自动完成容器部署且不影响其可用性,并通过调度机制混合关键型应用和非关键型应用的工作负载于同一节点以提升资源利用率。
(2)自我修复(自我治愈)
支持容器故障后自动重启、节点故障后重新调度容器,以及其他可用节点、健康状态检查失败后关闭容器并重新创建等自我修复机制。
(3)水平扩展
支持通过简单命令或UI手动水平扩展,以及基于CPU等资源负载率的自动水平扩展机制。
(4)服务发现和负载均衡
k8s通过其附件组件之一的KubeDNS(或CoreDNS)为系统内置了服务发现功能,它会为每个service配置DNS名称,并允许集群内的客户端直接使用此名称发出访问请求,而service则通过iptables或ipvs内建立负载均衡机制。
(5) 自动发布和回滚
k8s支持“灰度”更新应用程序或其配置信息,监控更新过程中应用程序的健康状态,以确保不会同一时间杀掉所有实例,在这个过程中一旦出现故障,立马进行回滚操作。
(6)密钥和配置管理
k8s的configMap实现了参数配置和Docker镜像的解耦,修改配置时无需重新build镜像,这为应用开发部署带来了很大的灵活性。另外,对于应用依赖的一些敏感数据,如用户名和密码、令牌、密钥等,k8s专门提供了Secret对象为其解耦。
(7)存储编排
k8s支持Pod对象按需自动挂载不同类型的存储系统,包括节点的本地存储系统,云存储(AWS),网络存储系统(NFS、GlusterFS)。
(8)批量处理执行
除了服务型应用,k8s还支持批处理作业及CI(持续集成),如果需要,一样可用实现容器故障后恢复,
二、k8s的概念和术语
- Master
Master 是集群的网关和中枢,负责为用户和客户端暴露API、跟踪其他服务器的健康状态、以最优方式调度工作负载,以及编排其他组件之间的通信等任务。在用户将应用部署在集群上时,Master会使用调度算法将其自动指派到某个特定的node运行。在node加入集群或从集群中移除时,master也会按需重新编排影响到的pod(容器)。
- Node
Node是k8s集群的工作节点,负责接收来自Master的工作指令并根据指令相应的创建或销毁Pod对象,以及调整网络规则以合理地路由和转发流量等。
三、常用的资源抽象
- Pod
k8s并不直接运行容器,而是使用一个抽象的资源对象来封装一个或者多个容器,这个抽象叫Pod,也是k8s的最小调度单元。
- 资源标签
标签(Label)是将资源进行分类的标识符,资源标签其实就是一个键值型数据,标签的作用就是指定对象(Pod)辨识性的属性。一个对象可用有多个标签,一个标签也可以赋予多个对象。
- 标签选择器
标签选择器(Selector)全称为“Label Selector” ,它是一种根据Label来过滤符合条件的资源对象的机制。
- Pod控制器
Pod虽然是k8s的最小调度单元,但用户通常不会直接部署及管理Pod对象,而是借助另一种抽象----控制器(Controller)对其进行管理。控制器是一种管理Pod生命周期的资源抽象,它们是一类资源抽象,而非单个,包括ReplicationController、ReplicaSet、Deployment、StatefulSet、Job等。
- 服务资源(service)
Service是建立在一组Pod对象之上的资源抽象,它通过标签选择器选定一组Pod对象,并为这组Pod对象定义一个统一的固定访问入口。到达Service IP的请求将北负载均衡至其后的端点----各个Pod对象之上,因此Service从本质上来讲是一个四层代理服务。Service还可以将集群外部流量引入到集群中来。
- 存储卷
存储卷是独立于容器文件系统之外的存储空间,常用于扩展容器的存储空间并为它提供持久存储能力。k8s集群上的存储卷大体可以分为临时卷、本地卷、网络卷。临时卷和本地卷都在node本地,一旦Pod被调度到其他的node上,这种类型的存储卷将无法继续访问,因此临时卷和本地卷通常用于数据缓存,持久卷的数据则需要放置于持久卷(persistent volume)之上。
- Name和Namespace
名称(Name)是k8s集群中资源对象的标志符,它们的作用域通常是名称空间(Namespace),因此名称空间是名称的额外的限定机制。名称空间通常用于实现租户或项目的资源隔离,从而形成逻辑分组。
- Annotation
Annotation (注解)是另一种附加于对象之上的键值型的数据,但它用于更大但数据容量
- Ingress
k8s将Pod对象和外部网络环境进行了隔离,Pod和Service等对象间的通信都使用其内部专用地址进行,如若需要开发某些Pod对象提供给外部用户访问,则需要为其请求流量打开一个通往k8s集群内部的通道,除了service之外,Ingress也是这类通道的实现方式之一。
四、k8s集群组件
- Master组件
(1)API Server
API Server 负责输出RESTful风格的k8s API ,它是发往集群的所有REST操作命令的接入点,并负责验收、校验并响应所有的REST请求,结果状态被持久化存储于etcd中。因此,API Server 是整个集群的网关。
(2)集群状态存储(Cluster State Store)
k8s集群的所有状态信息都需要持久存储于存储系统etcd中,etcd是有CoreOS基于Raft协议开发的分布式键值存储,可用于服务发现、共享配置以及一致性保障(如数据库主节点选择、分布式锁等)。
(3)控制器管理器
在k8s 中,集群级别的大多数功能都是由几个控制器的进程实现的,这几个进程是集成在kube-controller-manager守护进程中。由控制器完成的功能主要包括生命周期和API业务逻辑。
- 生命周期功能:包括Namespace的创建和生命周期、Event垃圾回收、Pod终止相关的垃圾回收、级联垃圾回收及Node垃圾回收。
- API业务逻辑:例如,由ReplicaSet 执行的Pod扩展等。
(4)调度器
API Server 确认Pod 对象的创建请求后,由Scheduler根据集群内各节点的可用资源状态,以及要运行的容器的资源需求做出调度决策。
2.Node组件
Node 负责提供运行容器的各种依赖环境,并接收Master 的管理
(1) Node 的核心代理程序kubelet
Kubelet 是运行于工作节点之上的守护进程,它从API Server 接收关于Pod对象的配置信息并确保它们处于期望的状态。kubelet会在API Server 上注册当前工作节点,定期向Master 汇报节点资源使用情况,并通过cAdvisor 监控容器和节点的资源占用情况。
(2)容器运行时环境
每个node都要提供一个容器运行是环境,它负责下载镜像并运行容器。
(3)kube-proxy
每个工作节点都需要运行一个kube-proxy守护进程,它能够按需为service资源对象生成iptables或ipvs规则,从而捕获访问当前service的ClusterIP的流量并将其转发至正确的后端Pod对象。
3.核心组件
k8s 集群还依赖于一组称为“附件”的组件以提供完整的功能,它们通常是由第三方提供的特定应用程序,且托管运行于k8s集群之上。介绍几种附件:
CoreDNS:在k8s集群中调度运行提供DNS服务的Pod,同一集群中的其他Pod可使用此DNS服务解决主机名。
Kubernetes Dashboard :Kubernetes 集群的全部功能都要基于Web 的UI,来管理集群中的应用甚至是集群自身。
Heapster: 容器和节点的性能监控与分析系统,它收集并解析多种指标数据,如资源利用率,生命周期事件等。
Ingress Controller: Service是一种工作于传输层的负载均衡器,而Ingress 是在应用层实现的HTTP(s) 负载均衡机制。