Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes 的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。
Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。
Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。
K8S主要功能:
K8s是用来对docker容器进行管理和编排的工具,其是一个基于docker构建的调度服务,提供资源调度、均衡容灾、服务注册、动态扩容等功能套件,其作用如下所示:
(1)数据卷:pod中容器之间数据共享,可以使用数据卷
(2)应用程序健康检查:容器内服务可能发生异常导致服务不可用,可以使用健康检查策略保证应用的健壮性。
(3)复制应用程序实例:控制器维护着pod的副本数量,保证一个pod或者一组同类的pod数量始终可用。
(4)弹性伸缩:根据设定的指标(CPU利用率等)动态的自动缩放pod数
(5)负载均衡:一组pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器,在集群内布,其他pod可通过这个Cluster IP访问集群。
(6)滚动更新:更新服务不中断,一次更新一个pod,而不是同时删除整个服务
(7)服务编排:通过文件描述部署服务,使的程序部署更高效。
(8)资源监控:Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示
(9)提供认证和授权:支持属性访问控制、角色访问控制等认证授权策略。
Borg是谷歌内部的大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理。Borg的目的是让用户能够不必操心资源管理的问题,让他们专注于自己的核心业务,并且做到跨多个数据中心的资源利用率最大化。
Borg主要由BorgMaster、Borglet、borgcfg和Scheduler组成,如下图所示:
Kubernetes借鉴了Borg的设计理念,比如Pod、Service、Labels和单Pod单IP等。Kubernetes的整体架构跟Borg非常像,整个架构有 apiserver,controller-manager,scheduler,etcd,kubelet,kube-proxy,network-plugin 等相关组件完成,整体架构如下:
通常 一个 K8S集群包括两个部分:
一个 Master 节点 (主节点),主要负责管理和控制,Master节点包含Etcd、Apiserver、controller-manager、Scheduler等组件,作用分别如下:
Etcd:存储状态的数据库,保存了整个集群的状态;
Apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
Scheduler:负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上。
除了Master节点,还有一群 Node 节点(计算节点),Node节点包含kubelet、kube-proxy等组件,作用分别如下:
kubelet:主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等;
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡。
Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示:
各层说明如下:
k8s的工作原理示例图如下:
原理实现步骤如下:
1、运维人员向 apiserver 发出指令,可以通过API Server的REST API,也可用Kubectl命令行工具。
2、apiserver 响应命令,通过一系列认证授权,把 pod 数据存储到 etcd,创建 deployment 资源并初始化 (期望状态)。
3、controller-manager 通过 list-watch 机制,监测发现新的 deployment,将该资源加入到内部工作队列,发现该资源没有关联的 pod 和 replicaset,启用 deployment controller 创建 replicaset 资源,再启用 replicaset controller 创建 pod。
4、创建完成后,将 deployment,replicaset,pod 资源更新存储到 etcd。
5、scheduler 通过 list-watch 机制,监测发现新的 pod,经过主机过滤、主机打分规则,将 pod 绑定 (binding) 到合适的主机。
6、将绑定结果存储到 etcd。
7、kubelet 每隔 20s (可以自定义) 向 apiserver 通过 NodeName 获取自身 Node 上所要运行的 pod 清单,通过与自己的内部缓存进行比较,新增加 pod。
8、kubelet 调用 Docker API 创建并启动 pod。
9、kube-proxy 为新创建的 pod 注册动态 DNS 到 CoreOS。给 pod 的 service 添加 iptables/ipvs 规则,用于服务发现和负载均衡。
10、controller-manager 通过 control loop(控制循环)将当前 pod 状态与用户所期望的状态做对比,如果当前状态与用户期望状态不同,则 controller 会将 pod 修改为用户期望状态,实在不行会将此 pod 删掉,然后重新创建pod。