K8S
K8S 的全称为 Kubernetes (K12345678S)
是一个跨主机容器编排工具
作用
用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。
由来
K8S由google的Borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。
K8S特点
弹性伸缩:Kubernetes 可以自动扩展和收缩容器,根据负载进行自动调整。
自动容器部署和管理:Kubernetes可以自动化容器部署和管理,无需手动干预
容器编排:Kubernetes 支持多层容器编排,使得容器的关系更加复杂和灵活。
负载均衡:Kubernetes 可以在多个节点上自动分配负载,实现负载均衡。
容器健康检查和自动恢复:kubernetes 可以自动检查容器状态,如果发现出现故障可以自动恢复。
容器存储管理:Kubernetes 可以管理容器的存储,包括存储卷、存储卷模板等功能。
K8S 集群架构与组件
K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。 在 K8S 中,主节点一般被称为 Master 节点,而从节点则被称为 Worker Node 节点,每个 Node 都会被 Master 分配一些工作负载。
Master 组件可以在群集中的任何计算机上运行,但建议 Master 节点占据一个独立的服务器。因为 Master 是整个集群的大脑,如果 Master 所在节点宕机或不可用,那么所有的控制命令都将失效。除了 Master,在 K8S 集群中的其他机器被称为 Worker Node 节点,当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其他节点上去。
架构
K8S有master和worker node 两类节点
master节点
负责K8S集群的管理和资源调度等运维工作
组件
组件 | 作用 |
---|---|
apiserver | 是所有服务请求的同意访问入口 |
controller-manager | 控制器管理器,负责管理K8S各种资源对象的开专区;通过apiserver监控整个K8S集群的资源状态,并确保资源始终处于预期的工作状态 |
scheduler | 资源调度器,负责POD资源的调度,通过调度算法(预选/优选策略)为要部署的pod选择最合适的node节点 |
etcd | K8S集群的数据库,是一种键值对存储结构的分布式数据库,负责存储K8S集群所有的重要信息,并且只有apiserver拥有访问和读写权限 |
wocker node节点
负责运行工作负载,即容器应用
组件
组件 | 说明 |
---|---|
kubelet | 接收apiserver发来的请求,创建管理pod和容器,跟容器引擎交互实现对容器生命周期的管理;收集node节点的资源信息和pod的运行状态发送给apiserver |
kub-proxy | 作为service资源的载体,实现对pod的网络代理,负载维护pod集群网络规则和四层代理工作 |
容器引擎 | 运行管理容器 |
K8S创建pod资源的工作流程
1.用户通过客户端发送创建pod的请求给apiserver
2.apiserver接收到请求后,会先把请求信息写入到etcd中保存,再找controller-manger根据请求信息的资源预设模板创建pod资源
3.controller-manager通过apiserver找scheduler 调度新创建的pod,schedulert通过调度算法的预选策略和优选策略筛选出最合适的node节点进行调度。
4.scheduler通过apiserver找对应的node节点上的kubelet去创建和管理Pod,kubelet会跟容器引擎交互,来管理Pod及其容器的生命周期。
5.用户还可以通过apiserver在kube-proxy上写入iptable或者ipvs网络规则,创建service资源,实现对Pod集群网络代理。
K8S核心资源对象
Pod
-
是K8S能够创建和管理的最小的单位,一个Pod里可以包含一个或多个应用容器。
-
同一个Pod里的容器之间共享网络、存储等资源。通过localhost互相访问
-
不同的 Pod 之间的容器不能用 localhost 访问,也不能挂载其他 Pod 的数据卷。
Pod控制器
管理在Pod副本的控制器
控制器 | 说明 |
---|---|
deployment | 部署无状态应用,同时也负责reolicaset(维持Pod副本数十种符合预期状态)和Pod(容器化的应用程序) |
statefulset | 部署有状态应用 |
daemonset | 在所有node节点上都部署同一种的Pod |
job | 一次性的部署短期任务的Pod(执行完任务后会自动退出的容器应用) |
cronjob | 周期性的部署短期任务的Pod(执行完任务后会自动退出的容器应用) |
service
-
在K8S集群内部,为通过标签选择器相关联的一组Pod提供一个统一的访问入口(clusterIP),只支持四层代理转发
-
service通过标签选择器关联Pod的标签,从而自动发现相关Pod的端口(PodIP:Port)
ingress
-
作为K8S集群外部的访问入口,可定义ingress规则根据用于请求的域名或URL请求路径转发给指定的service,支持七层代理转发
-
ingress通过配置规则将不同的域名或URL路径关联不同的service资源
K8S资源配置信息
说明 | |
---|---|
apiversion | 指定资源对象的在K8S中使用的api接口版本 |
kind | 指定资源对象的类型 |
metadata | 指定资源对象的元数据信息,比如name指定资源名称、namespace指定命名空间、annotation指定注释、label指定标签 |
spec | 指定资源对象的资源配置清单(配置属性) ,比如副本数、镜像、网络模式、存储卷、label selector标签选择器 |
status | 资源对象在当前的运行状态信息 |
label
标签,是 K8S 特色的管理方式,便于分类管理资源对象。
给某个资源对象定义了一个label,就相当于给它打了一个标签
label selector
用于查询和筛选拥有相关标签的资源对象
两种标签选择器:基于等值
annotation
与label类似,但是没有任何匹配和筛选的效果
注释,用作于资源对象的注释信息;还可以在一些特殊的资源对象里用作于设置额外的功能特性
name
资源名称
namespace
命名空间,用于隔离资源名称的。在同一个命名空间中,同类型的资源对象的名称是唯一