应用部署演进过程
我们从上图可以看到,应用越来越看重应用本身了,慢慢的不受物理机的差异,不受操作系统的差异,开发者可以花更多精力去到应用本身。
k8s概念
简单理解,k8s就是传统的云平台上的linux。
kubernetes是一个以Google Borg(google内部容器管理平台)为原型,重新设计和实现的容器管理和调度编排工具。
2014年由谷歌开源。
同样功能的工具还有docker公司的Swarm和apache的Mesos,但目前kubernetes好像笑到了最后。
容器编排管理平台
k8s可以以容器组pod为基本编排和调度单位
k8s提供资源分配管理功能
k8s提供健康检查,伸缩,滚动升级功能
k8s提供声明式的对象配置模型
微服务架构平台
k8s提供服务发现与内部路由
k8s提供对服务的快速部署和自动的负载均衡
可移植云平台
k8s被各大云厂商承认并支持,在各个云平台之上,又搞了一层通用平台,即可实现跨云移植
k8s架构
k8s集群是由一群节点(node)组成,这些节点可能部署在物理服务器或云服务器上。
每个节点都安装了node组件,node组件是真正运行负载的组件
另外有个特殊节点上安装了master组件,那这个节点也就是master节点
master组件
集群的控制中心,每个集群至少一个master组件,
高可用就多个master节点装多个master组件
master组件包含:apiserver,etcd数据库,controller manager,scheduler
apiserver是master组件的核心,提供各种api接口,是整个集群的唯一入口,其他master组件都通过调用api接口实现各自的功能
scheduler通过apiserver接口监听新建pod副本信息,通过调度算法为该pod选择一个最合适的node节点,调度算法包括先预选出一批预选节点,再优选处一个积分最高的节点,调度算法也可自定义配置
controller manager是集群内各种controller资源的核心管理者,controller资源有集群内的node,pod副本,服务端点,命名空间,服务账号,资源配额等。当某个node宕机时,controller manager就会及时发现并执行修复流程,保证集群始终可用。
etcd数据库是一个高效的k-v数据库,存储着集群中所有的对象和状态。一般和master组件安装在同一个node上,高可用模式需要部署数据量集群
node组件
通过code controller可以动态的在集群中添加或删除node资源
node组件包含:kubelet,kube-proxy
kubelet组件是node中唯一一个以非容器形式进程组件,节点启动就被自动拉起,常驻节点中,也称节点管家,管理节点使用状况,定期向master汇报,是master node和worker node连接的桥梁。
kube-proxy组件就是个代理,主要是负责将到达的请求负载均衡的转发到后端的多个pod实例上。
一个node组件管着一批pod在执行任务
pod
pod是集群的调度基本单元。
是一个有特定关系的容器的集合。
一个pod就代表集群中的一个进程。
pod一般不由用户创建,pod的ip也是不稳定的。
kubectl工具
最左边的kubectl是一个k8s的命令行工具,用户使用命令行的方式与集群交互
k8s概念
k8s对象:
一种持久化用于表示集群状态的实体,一般使用yaml文件描述对象,对象信息包括有哪些容器在运行,运行在哪个node上,有哪些可用资源,应用的各种策略(重启策略,容错策略等)。
所有k8s对象状态的集合,就是整个k8s集群的状态。
通过kubectl工具或者api可以直接管理k8s对象。
可以类比java中的对象的概念,k8s对象,也有属性,方法,另外还有状态信息
class k8s{// 对象的类型,包括Pod,Service,Deployment等Kind kind;//对象的元数据,包括name,namespace,labels,annotationsMetadata metadata;//对象的规格信息,比如replicas(表示副本信息),selector(标签匹配)等Spec spec;//增删改查等方法public Return method(){...}//对象状态,保存在etcd数据库中Status status;
}
Name和UID
集群中的所有k8s对象,都是由name和UID明确标识。
不同类型对象的name可以是一样的。
UID是每个实例化的对象唯一一个,而且是整个集群的生命周期内唯一。
可以用api通过对象的name访问到该对象:
/api/{version}/namespaces/{namespace}/{kind}/name
namespace
namespace不仅仅是个属性,本身也是一个对象
作用是将物理集群划分为多个虚拟集群
namespace直接完全隔离,常用作隔离不同的用户权限
k8s集群内置3个namespace:default,kube-system,kube-public。
label
label标签是用于建立集群对象直接的灵活的,松耦合的多维关联关系。
本质上就是k-v键值对。
一个对象上可以有多个标签
不同类型的对象,可以通过相同的标签建立关联关系
作用:为了标识对象,选择出对象
annotations
annotations注解,可以将任意非标识性元数据附加到对象上
annotations本质也是k-v键值对
一般存对象的版本信息,时间戳等。