文章目录
- 一、什么是k8s
- 二、k8s有什么能力
- 调度
- 自动修复
- 水平伸缩
- 三、k8s的架构
- 1.master
- 2.node
- 组件间如何协作
- 四、k8s的核心概念
- pod
- volume
- deployment
- service
- namespace
一、什么是k8s
kubernetes:
自动化的容器编排平台,负责应用的部署、应用的弹性及管理,都基于容器。
container:容器;集装箱
kubernetes:运送集装箱的一个轮船
二、k8s有什么能力
- 服务的发现与负载均衡
- 容器的自动装箱:scheduling。把容器放到一个集群的某个机器上
- 容器的自动化恢复
- 应用的自动发布与应用的回滚,配置密文的管理
- 批量执行job
- 支持集群水平的伸缩
调度
- 相关组件:调度器,scheduler
- 能力:把容器放到k8s管理的集群的某一台节点上去。
scheduler会观察正在被调度的容器的大小(比如cpu、memory),然后在集群中找一台相对空闲的机器来进行一次放置(placement)
- eg:如下图,可能会把正在被调度的红色的容器,放到第二个空闲的机器上,来完成一次调度工作
自动修复
- 相关组件:Controller
- 能力:监测集群中的所有宿主机,当宿主机本身或软件出故障时,节点的健康检查会自动对它进行发现。会把运行在失败节点上的容器进行自动迁移,迁移到健康的宿主机上
水平伸缩
- 相关组件:Controller
- 能力:业务负载检查的能力。如果这个业务本身的CPU利用率过高,或响应时间过长,会对这个业务进行一次扩容
- eg:如下,黄色容器过度忙碌,k8s把它扩容了3份,通过负载均衡,把原来打到第一个黄颜色的负载,平均分到三个黄色容器上,以此来提高响应时间
三、k8s的架构
典型的二层架构与sever-client架构
所有的UI的、clients等user侧的组件,只会与master进行连接,再由master下发给相应节点
1.master
master包含4个主要的组件:
API Server、Controller、Scheduler、etcd
- API Server:处理API操作的,是一个可水平扩展的部署组件。组件之间一般不进行独立的连接,都依赖于API Server传递消息
- Controller:控制器,是一个可进行热备的部署组件。完成对集群状态的管理。
eg:对容器的自动修复、自动水平扩张
- Scheduler:调度器,可热备。完成调度操作,帮助用户提交的container(容器)找合适的节点进行放置
- etcd:分布式的存储系统。API Server所需的原信息被放置在etcd中,etcd本身是一个高可用系统。通过etcd保证整个k8s的master组件的高可用。
2.node
组件包括:Kubelet、Container Runtime、Storage Plugin、Network Plugin、Kube-proxy
- kubelet:node上最关键的组件。通过API Server接收所需要pod运行的状态,提交到Container Runtime中
- Container Runtime:容器启动
- Storage Plugin:对pod的存储进行管理
- Network Plugin:对pod的网络进行管理
- kube-proxy:完成service的组网。利用iptable的能力来组建k8s的network,就是cluster network
组件间如何协作
- 场景:用户要提交一个pod给k8s部署
- 过程:
- 1.这个pod请求 通过CLI或UI提交给API Server
- 2.API Server把这个信息写入etcd
- 3.Scheduler通过API Server的watch或notification机制得到这个信息:有一个pod需要被调度。Scheduler根据内存状态进行一次调度决策,完成调度后,会跟API Server反馈说“ok,这个pod需要被调度到某一个节点上”
- 4.API Server接收到后,将本次结果再次写到etcd中,并通知相应的节点(node)进行这次pod真正的执行启动
- 5.相应节点的kubelet得到通知后,就调用Container runtime来真正启动配置这个容器和这个容器运行的环境,调度Storage Plugin配置存储,Network Plugin配置网络
四、k8s的核心概念
pod
- k8s的一个最小调度单元,最小资源单元
- 是对一组容器的抽象,包含一个或多个容器
- 定义容器运行的方式(command、环境变量、资源大小等)
- 提供给容器共享的运行环境(网络、进程空间、存储卷等)
- pod之间有isolation隔离
- eg:以下这个pod,包含了2个容器,每个容器可以指定所需资源的大小。也包含了100G的卷1和20G的卷2
volume
卷,用来管理k8s存储的。
- 声明在pod中的容器可访问的文件目录
- 可以被挂载在Pod中一个或多个容器的指定路径下
- 支持多种后端存储的抽象:本地存储、分布式存储、云存储
deployment
在pod更上一层的抽象,一般用deployment来做应用真正的管理
pod是组成deployment的最小单元
- 可以定义一组pod的副本数目、pod版本
- 通过controller维持pod的数目:自动恢复失败的pod
定义一个deployment有2个pod,当controller监测到一个pod失败时,会再新生成一个pod来把pod恢复到2个
- 通过controller以指定的策略控制版本:滚动升级、重新生成、回滚等
service
把所有pod的访问能力抽象成一个第三方的ip地址
- 提供一个或多个pod实例的稳定访问地址
- 支持多种访问方式实现:Cluster IP、NodePort、LoadBalancer
对于外部用户来说,访问哪个pod都一样,希望只访问某一个固定的VIP,而不需要知道每个具体pod的ip。这样当某个pod失败了,也不需要更换pod的地址。
namespace
- 一个集群内部的逻辑隔离机制(鉴权、资源额度)
- 每个资源都属于一个Namespace
- 同一个Namespace中的资源命名唯一
- 不同Namespace中的资源可重名
逻辑上做的一层隔离,粗略理解为网络里的vlan