Kubernetes是一个全新的基于容器技术的分布式架构领先方案。这个方案虽然很新,但谷歌已经稳定运行了十几年以来大规模应用容器化技术的积累和升华的重要成功。运用K8s我们不仅能节省不少于30%的开发成本,同时可以将更多地经历放到业务本身,我们不必再费心于服务监控和故障处理模块的开发和开发复杂的服务治理框架,一切的一切它都为我们做好了。

总览

为了更好地了解k8s我先从整体架构开始,了解一件事情先要总览,然后逐步了解每个细节的内容,逐步应用容器编排技术。

k8s架构图

上面是k8s设计架构图,从图中可以看到
Kubernetes主要由以下几个核心组件组成:

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

官方还推荐一些其他组件:

  • kube-dns负责为整个集群提供DNS服务
  • Ingress Controller为服务提供外网入口
  • Heapster提供资源监控
  • Dashboard提供GUI
  • Federation提供跨可用区的集群
  • Fluentd-elasticsearch提供集群日志采集、存储与查询

K8s分层架构

k8s总体结构

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
  • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
  • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

Master

Master结构2019图

Master是集群控制节点,每个K8s集群需要有一个Master节点来负责整个集群的管理和控制,基本上k8s所有的控制命令都是发给它的,它来负责具体的执行过程,Master节点通常会占据一个独立的x86服务器(或者一个虚拟机),正因为如此重要所有它挂掉了整个集群的所有控制命令都将失效,所以他就是军队的司令部大脑,正因为如此重要他就是集群的单点了,测试环境我们可以设置一个Master主机,生产环境我们一般会设置多个Master来达到高可用的目的,阿里云容器服务k8s已经为我们做到了高可用,它默认创建集群服务会为你创建三台主机来运行Mster,它的运行模式也是采用选举算法,这也就是为什么Master数量是偶数的,所以达到高可用至少3台主机以上的奇数个主机数量才能达到高可用的目的。

Mster运行着一下一组关键进程:

  • kube-apiserver: 提供Rest接口的关键服务进程,是真个k8s里所有资源的增删改查操作的唯一入口,也是集群控制的入口进程。
  • kube-controller-manager: k8s所有资源对象的自动化控制中心,可以理解为资源对象的“内务大总管”。
  • kube-scheduler: 负责资源调度(Pod)的进程,相当于地铁的“调度中心”。
  • etcd: 主节点一般都会启动这个服务,主要提供所有资源对象数据都存在在里面,如果其中一台机pod节点发生故障或者未达到预期目标,k8s会读取etcd里面的数据进行重新资源的部署。

Node

Node结构图

除了Master, k8s集群里面其他机器一律称作为Node节点,Node节点和主节点一样可以使一台物理主机也可以是一台虚拟机。Node节点是k8s集群中的工作负载节点,每一台Node都会被Master分到一部分工作负载(docker容器),当其中某个Node节点宕机时,其上的工作负载还会被Master自动转移到其他节点上去。

每个Node节点上都运行着以下一组关键进程。

  • kubelet: 负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
  • kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件。
  • Docker Engine(docker): Docker引擎负责本机的容器创建和管理工作

Node节点可以在运行期间动态添加到K8s急群众,前提是这个节点上已经正确钱庄、配置和启动了上述关键进程。一旦Node被纳入集群管理范围,kubelet会定时想Master节点汇报自身情况,这样Master可以获知每个Node的资源使用情况,并实现高效的负载均衡的资源调度策略。 而某个Node超过指定时间不上报信息时,会被Master判定为失联,Node的状态会被标记为不可用(Not Ready),随后Master会出发工作负载大转移 的自动化迁移流程。

总结

通过上面的内容就能够对k8s大致形态和规则有了相应的了解,也知道了k8s是由哪些关键进程组成的,他们的写作模式是什么? k8s是如何达到高可用的目的,后续我会更多整理相关知识,继续深入研究k8s相关内容。