shurenyun 2020-08-19
Kubernetes这个名字起源于希腊语,意思是舵手,由于k到s之间有8个字符又简称k8s。Google在2014年开源了Kubernetes项目,基于容器技术的分布式管理系统,在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用(就像canary deployments)。
现在Kubernetes着重于不间断的服务状态(比如web服务器或者缓存服务器)和原生云平台应用(Nosql),在不久的将来会支持各种生产云平台中的各种服务,例如,分批,工作流,以及传统数据库。
其实kubernetes的出现, 我们生活中的一些理念和使用场景都可以用来套用, 比如:
我们生活中使用的书包: 码头使用的集装箱, 我们拿书包举例. 标准的IT男都会有一个包包, 这个包包里面, 可以放你需要的任何东西,电脑, 笔记本, 笔, 钱包, 充电线, 水杯, 身份证, 手机等等一系列的东西, 对于每个人差异化需求可能都会有区别, 但是对于使用者来说, 我们对于包包的使用, 大家可以非常的方便, 便捷的提供我们使用
Kubernetes的出现, 就是让我们不用在去关注复杂的内部容器内部的使用, 不同的差异, 不用的使用者自己去维护就ok了, 但是对于上层的使用者来说, 封装好的Kubernetes确可以给我们更好的提供标准化, 统一化的流程服务, 更好的为容器之上的使用者提供更加完美的支持
从K8s的系统架构、技术概念和设计理念,我们可以看到K8s系统最核心的两个设计理念:一个是容错性,一个是易扩展性。容错性实际是保证K8s系统稳定性和安全性的基础,易扩展性是保证K8s对变更友好,可以快速迭代增加新功能的基础。
首先, 我们观察到, Kubernetes的组件架构图, 分为master和nodes, 以及 cloud三个组成部分
master节点包含kube-controller-manager, kube-apiserver, kube-scheduler, cloud-controller-manager五个组成部分
是一个将kubernetes控制平面中的API暴露出来的API服务, 用于接收用户端的操作请求, 这服务是Kubernetes控制平面的前端
它是一个无状态应用, 用户可以运行多个kube-apiserver组件的实例, 用于平衡实例的请求流量
用于watch监听apiserver的资源变动(增删改查), 并调度至合适的后端node节点, 从而来创建pod资源
每个控制器都是独立的二进制进程, 包括: Node Controller, Replication Controller, Endpoints Controller和Service Account 和Token Controllers
高可用. KV架构的Kubernetes的后端数据存储组件
是Kubernetes与云厂商提供的服务能力对接的关键组件, 又称为kubernetes cloudprovider
主要包括kubelet, kube-proxy和container runntime三个组件
运行在集群每个节点的客户端, 需要保证相关容器运行在pod中, 通过podspecs标签, 描述容器的运行状态
是一个运行在集群每个节点的网络代理组件
支持运行容器底层环境的软件; 支持docker, containerd, cri-o, rktlet等
作为集群外部的附加能力, 通过与cloud=controller-manager组件对接, 扩展kuberntes集群于云上动态扩展的特性
使用Kubernetes resources增加集群功能, 如DNS, Web UI, Containner Resource Monitoring, Cluster-level Logging等等
通过(API, WebUI, CLI)向APIserver发送请求, kube-scheduler组件监听APIserver的资源变动, 同时从Node节点中选取最合适的Node节点开始调度, 并把调度结果保存至Etcd中.
kubelet也会监听APIserver的资源变动, 并在符合的Node通过kubelet调用相关的coker引擎进行后续打包和构建